抽象类(就是一个类)
关键字写法:abstract
程序写法
public abstract class Animal //一个类被abstract修饰,变成了抽象类 { public abstract void run(); //一个方法被abstract修饰,变成了抽象方法,注意没有大括号 }
abstract只可以用来修饰 (类) 和 (成员方法)
对于这个写法,要注意
1.以往的方法,只在定义的时候都是这样的
public class Animal { public void run();{ //在方法的后面,是有一对大括号的 } }
而上面的抽象类就没有,所以和他普通的方法和类肉眼看起来的不同就是在修饰符位置多了abstract关键字,和在方法后面没有大括号了.(但是被abstract修饰的类还是有大括号的)这也是他为什么抽象的原因,连括号都没有,这个方法能用来干什么呢?
2.一个类中如果定义了抽象方法,那么包含这个抽象方法的类也必须声明成抽象类,否则报错。
一个类如果是抽象类,那么它里面的方法是不是抽象的,都可以.
一个类如果是抽象类.那么它里面的多个方法可以有的是抽象有的不是.
正常类有的成员(成员变量、方法、构造器)抽象类都具备
不能用abstract修饰变量、代码块、构造器。
快速重写抽象方法快捷键:ctrl + i, 也可以鼠标放到报错的位置直接点
最重要的特征:
得到了抽象方法,失去了创建对象的能力(就是不能new这个类了,只能继承,有得有失)
但是继承了抽象父类的子类可以被new,然后通过这个子类给抽象父类传数据.或者调用抽象父类 的方法
子类的构造器又可以通过super()来访问抽象父类的构造器给他传递值
main函数不能直接类名.方法名调用抽象父类.
抽象父类里面的方法不能用static修饰,不然子类@Override就覆盖不了
(@Override这个函数只是告诉你,他下面这个方法重写的写法是对的,如果你能直接写对,不写这个函数也行,写了增加可读性和是否正确的辨识度)
所以只能通过子类访问抽象父类,抽象父类又可以规范继承它的子类.
以上是抽象类和抽象方法的表示方
=========================================================================
下面说抽象类和抽象方法的使用场景
目前来说我也没有触及到抽象类的所有使用场景,目前的使用场景是作为一个抽象父类,可以被多个其他相关的子类继承的,就比如定义一个名字为<动物>的抽象父类,因为没有{},所以咱们什么都不写.之后当咱们再次定义一个相关子类,比如<长颈鹿>的时候,就可以引用这个抽象父类.而这个抽象父类没有什么功能,所以具体功能的实现就交给这个子类来实现.
要注意:一个子类如果继承了一个抽象父类,在这个子类没有全部重写完这个抽象父类里面的所有抽象方法的时候,这个子类也会变成一个抽象类,
为什么这样呢.我个人的理解是,作为一个抽象父类,我定义了一系列抽象方法,必须让继承我的若干子类把这些方法全部运用实现,所以这些子类必须把所有方法重写,让每个方法都(活起来)才能避免自己也变成一个抽象类,不然就会变得没有意义.就比如动物类一定有一个方法是用来计算(体重)的方法.就可以定一个抽象动物父类里面有一个抽象方法名字叫(体重)
public abstract void 体重 (double kg)
那么在子类继承这个抽象父类的时候.就必须有一个方法为
@Override public void 体重(double kg) { System.out.println("该动物的体重为" + getKg()); }
而整个思路就是.抽象父类只规定这个类里应该有什么方法,而继承了这个抽象父类的子类就根据每个子类的不同去完成这个方法.