目录
抽象类的概念
在面向对象的概念中,所有的对象都是通过类来描述的,但是反过来,并不是所有的类都是用来描述对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
我们之前所学习的Animal类或者Shape类,就可以被描述为抽象类。http://t.csdnimg.cn/sS449 不知道的朋友可以去看一下这篇博客的代码,这里我就不粘贴了。
抽象类的语法
我们来看看抽象类在语法上是如何定义的。
一个类如果被abstract修饰称为抽象类,抽象类中被abstract修饰的方法称为抽象方法。
抽象方法不用给出具体的实现体。
//抽象类
abstract class Shape {
//抽象方法
abstract public void draw();
}
当一个类中有抽象方法,这个类一定是抽象类。否则会报错。
抽象类当中可以有和普通类一样的成员变量和成员方法。
abstract class Shape {
//抽象方法
abstract public void draw();
public int a ;
public void show() {
System.out.println("形状");
}
}
抽象类和普通类的区别在于抽象类不能实例化,只是为了被继承。
可当我们写一个Circle子类用extend继承时,又会发现代码报红了:
这又是为什么呢?原因很简单,当一个普通类继承抽象类,那么这个普通类一定要重写抽象类中所有的抽象方法。
class Circle extends Shape {
@Override
public void draw() {
System.out.println("圆");
}
}
这时就不会报错了。
抽象方法不能被private修饰
抽象方法不能被static修饰
final和abstract不能同时存在
因为我们在多态重写方法时讲过,被final修饰的方法不能被重写,而被abstract修饰的方法一定会被子类重写,所以两个关键字不能同时存在。
抽象类虽然不能被实例化,但是可以发生向上转型。
public static void main(String[] args) {
Shape shape = new Circle();//向上转型
}
能够发生向上转型,就能够实现动态绑定,也就可以发生多态。
public class Test8_3 {
public static void drawMap(Shape shape) {
shape.draw();
}
public static void main(String[] args) {
Shape shape = new Circle();//向上转型
drawMap(shape);
drawMap(new Flower());
//new Flower()-->匿名对象 没有名字的对象
//匿名对象的缺点:不能重复使用
}
}
运行结果:
抽象类中构造方法的作用:用来让子类调用,帮助这个抽象类初始化自己的成员。
抽象类的作用
抽象类只是为了被继承,但是普通类也能被继承,那么抽象类存在的意义是什么呢?实际上抽象类相当于多了一重编译器的校验,当你没有重写方法时会报错而普通类就不会。很多语法存在的意义就是为了“预防出错”。充分利用编译器的校验,在实际开发中是非常有意义的。
标签:Java,--,abstract,Shape,void,抽象类,方法,public From: https://blog.csdn.net/kkkkkkk6666666/article/details/140575154