Java中abstract的基本使用与详解

Java中abstract的基本使用与详解:
转载:https://blog.csdn.net/pipizhen_/article/details/107207938?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159969779219724836750671%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=159969779219724836750671&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v3~pc_rank_v3-3-107207938.pc_ecpm_v3_pc_rank_v3&utm_term=abstract%E4%BB%A3%E7%A0%81%E8%AE%B2%E8%A7%A3+java&spm=1018.2118.3001.4187

java中规定:abstract只能修饰类和方法,不能修饰变量。

1、什么是抽象类?

类和类之间如果具有相同的特征,将这些共同的特征提取出来,形成的就是抽象类。

类本身是不存在的,所以抽象类无法实例化对象。
类到对象是实例化,对象到类是抽象。
测试代码:

public class Test {
    public static void main(String[] args) {
        Animal a1 = new Animal();  //此行报错
    }
}
//抽象类Animal
abstract class Animal {
}

编译结果:Animal是抽象的; 无法实例化。

2、抽象类属于什么类型?
抽象类也是类,属于引用数据类型。

3、抽象类怎么定义?
语法:[修饰符列表] abstract class 类名 { }

4、抽象类是无法实例化的,无法创建对象的,所以设计抽象类就是用来被子类继承的。

5、abstractb不能和final、private、static联合使用,只能单独使用abstract或者联合public abstract使用。

6、抽象类就是用来被继承的,子类可以是抽象类,也可以是非抽象类。
非抽象子类继承了抽象父类,必须重写父类的抽象方法,可以有自己的方法,但不能是抽象方法;
抽象子类继承了抽象父类,不需要重写父类的抽象方法,可以有自己的方法,但必须是抽象方法

测试代码:

//抽象类Animal,父类
abstract class Animal {
   
}
//抽象类Bird,子类
abstract class Bird extends Animal {

}
//非抽象类:Cat,子类
class Cat extends Animal {
    
}

编译结果:编译成功。

7、抽象类虽然无法被实例化,但是抽象类有构造方法,这个构造方法是供子类使用的。

子类怎么调用父类的构造方法?
子类的构造方法第一行使用super(形参列表)方法调用父类的构造方法。

测试代码:

//抽象类Animal,父类
abstract class Animal {
    public Animal() {

    }
}
//抽象类Bird,子类
abstract class Bird extends Animal {
    public Bird() {
        super();
    }
}
//非抽象类:Cat,子类
class Cat extends Animal {
    public Cat() {
        super();
    }

编译结果:编译成功。

8、抽象类关联到一个概念:抽象方法。那什么是抽象方法?
抽象方法表示没有实现的方法,没有方法体的方法。例如:

public abstract void doSome();  //注意:没有“{ }”。

抽象方法特点是:前面使用abstract修饰,没有方法体,以分号结尾。

9、抽象类中可以有抽象方法,可以有实例方法,也可以没有抽象方法,但抽象方法一定得出现在抽象类中,或者这样说吧,抽象方法只能出现在抽象的容器中,也就是说一个类不是抽象类,那它不能有抽象方法。

测试代码:

//抽象类Animal
abstract class Animal {
    public abstract void doSome();  //抽象类中的抽象方法,没有方法体

    public void doOther() {  //抽象类中的实例方法

    }

    public Animal() {

    }
}

class User {
    public abstract void doSome();  //编译报错:User不是抽象的, 并且未覆盖User中的抽象方法doSome()
}

10、非抽象类继承抽象类,子类一定,必须得覆盖父类中的抽象方法。为什么?

因为抽象方法只能出现在抽象类当中。子类继承了父类,也就继承了父类的抽象方法,相当于子类自己有了抽象方法,而子类自己本身不是抽象类,就必须自己覆盖掉那个抽象方法。

总结:

1、抽象类怎么定义?
在class前面添加abstract关键字就行了。

2、抽象类无法实例化对象,所以抽象类是用来被子类继承的。

3、abstract不能和final、private、static联合使用,只能单独使用,或者联合public abstract使用。一般就是public abstract联合使用。

4、抽象类的子类可以是抽象类,也可以是非抽象类。

5、抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的。

6、抽象类中可以有实例方法,不一定有抽象方法,但是抽象方法一定得出现在抽象类中。

7、抽象方法的特征:
public abstract void doSome();

abstract修饰的方法没有方法体,以分号结尾。

//附提一下:native修饰的方法也没有方法体。
//例如:Object里面的public native int hashCode();

面试题:没有方法体的方法都是抽象方法吗?(错的)

8、规定abstract只能修饰类和方法,不能修饰变量。

9、非抽象类继承抽象类,一定必须得将父类中的抽象方法进行覆盖重写(最重要的一条结论)。

万变不离其宗:
抽象类:此类不能实例化,要求子类去继承。
抽象方法:只能存在抽象容器中,要求子类去覆盖重写。
抽象变量:不存在这种定义。

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值