JAVA--抽象类讲解

 一,抽象类的概述

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果有一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类,举个例子:比如我现在有个Animal类,此时我定义一个action方法去概括这些动物们行为习惯,比如🐦会飞,🐕会跑,🐟会游,,但当你想通过一个动物的行为去找到具体的动物时,又非常的困难,因为大部分的动物都会飞、跑、游。所以此时的信息,不足以让Animal这个类给出具体的对象,我们就不能实例化Animal。只有当一个类中给出的信息足够时,我们才能去实例化这个类,就例如:我有Dog这个类,我在这个类中定义了name、age、color、sex等属性,此时的信息足够全面,我们就可以实例化该对象,就像下面这个代码:

class Dog{
    public int age;
    public String name;
    public String sex;
    public String color;
}
public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog();
    }
}

 二、抽象方法

1、抽象方法的描述

1. 在Java中,我们通过在前面添加关键字abstract(抽象)来定义一个抽象类。就像下面这个代码一样:

 这里请注意抽象方法是不能被实例化的,如图所示:

2.我们将“只有方法声名,没有方法体”的一类方法叫做抽象方法 ,就是用关键字abstract修饰。需要注意的是,如果一个方法已经确定是抽象方法,那么它绝不能再有方法体,即不能出现大括号,而是在它的后面加个()就ok了。如图所示:

 

还有一点值得注意的是:如果这个类中已经有抽象方法了,那么定义它的这个类也必须是抽象类了 ,如图:

也就是:拥有抽象方法的类一定是抽象类,但是抽象类不一定拥有抽象方法。 

 2、抽象方法的特点

  • 当一个普通的类 继承了这个抽象类之后,这个普通类一定要重写这个抽象类当中 所有的抽象方法

如图所示:

如果不进行重写的话,则idea会报错:

 那么有人会问如果重写的方法比较多咋办?

我的回答是简单:直接按下快捷键Alt+insert,就会跳出下面这几个选项,选择重写方法,然后选择你要重写的对象即可。

  • 抽象方法不能被 private 和 static 修饰,因为定义抽象方法的目的就是将方法的具体实现延迟子类,最终是要被子类重写,但被这些修饰后,将不能进行重写。

  • final 和 abstract 是不能同时存在的。因为抽象类既然不能实例化对象,那么抽象类只能被继承,但当那个父类被final修饰过后,是不可以被继承的,所以二者不可以同时出现  

如果你不信,非要试试,就会出现下面这种情况: 

3、抽象类的成员:

3.1成员变量:
  • 抽象类既可以有静态的成员变量,也可以有非静态的成员变量
  • 既可以有静态的成员常量,也可以有非静态的成员常量
3.2成员方法:
  • 抽象类既可以有(非私有的)抽象方法(注意抽象方法一定是非私有非静态非final,因为abstract关键字与private关键字,static关键字,final关键字不能同时存在);
  • 也可以有非抽象方法(非抽象方法就可以用private,final和static关键字来修饰了,具体使用时,根据实际需求合理应用)
 3.3构造器:
  • 抽象类可以和非抽象类一样拥有构造器,并且支持构造器的重载

3.4 总结:

以上均为废话

大家只要记住抽象方法要在子类重写即可,还要记住重写方法的格式就欧克了

三、练习

 讲了这么多,也没有写一份完整的代码,那么接下来,我就手把手教大家如何去写。

那我们就以图形为例:

1,首先我们来定义一个类叫做:Shape,这个Shape这个类是一个大类,所以我们就把它定为抽象类,如图:

2,那我想在这个类当中画出一个矩形,一朵花,那我们就在这个抽象类当中来定义一个抽象方法draw,如图: 

 3,那么接下来我们就开始写子类,既然我们要打印出矩形和花,那我们不妨以Rect和Flower来分别命令两个子类,并对其进行重写,如图:

 4,接下来,我们来开始编写启动项的代码:

这里我们就开始实例化两个子类,并调用我们的draw方法,如图:

输出结果,如图所示:

完整版代码:

abstract class Shape{
    public abstract void draw();//被abstract修饰的方法,称为抽象方法,该方法可以没有具体的实现

}
class Rect extends Shape{
    @Override
    public void draw() {
        System.out.println("矩形");
    }//重写了抽象方法。ALT+INSERT
}
class Flower extends Shape{
    @Override
    public void draw() {
        System.out.println("❀");
    }
}
public class Test {

    public static void main(String[] args) {
        Rect rect = new Rect();
        rect.draw();
        Flower flower = new Flower();
        flower.draw();
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值