先来看一道题:
下列哪一种叙述是正确的
A:abstract修饰符可修饰字段、方法和类
B:抽象方法的body部分必须用一对大括号{ }包住
C:声明抽象方法,大括号可有可无
D:声明抽象方法不可写出大括号
解析:D
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、非抽象类继承抽象类,一定必须得将父类中的抽象方法进行覆盖重写(最重要的一条结论)。
万变不离其宗:
抽象类:此类不能实例化,要求子类去继承。
抽象方法:只能存在抽象容器中,要求子类去覆盖重写。
抽象变量:不存在这种定义。
今天的文章Java中abstract的基本使用与详解分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/33496.html