抽象方法和抽象类
一、抽象方法
定义: Java中可以定义不含方法体的方法,方法的方法体由其所在类的子类根据实际需求去实现,这样的方法叫抽象方法,包含抽象方法的类必须是抽象类。
Java中提供了 abstract 关键字,表示抽象的意思,用其修饰的方法称为抽象方法。抽象方法是不完整的方法,只有方法声明,没有方法体。
抽象方法的语法格式:
[修饰符] abstract 方法返回值类型 方法名([参数列表]);
举个栗子:
正常的方法:
public void fly(){
System.out.println("我要飞得更高”); //此为方法体
}
抽象方法:
pubilc astract void fly(); //没有方法体
二、抽象类
用 abstact 修饰的类,称为抽象类,抽象类可以不包含任何抽象方法。
抽象类的语法格式:
[修饰符] abstrct class 类名{
......
}
注意点:
使用抽象类时需要注意,抽象类不能被实例化,即不能用new关键字创建对象。这是因为抽象类中可能包含抽象方法,抽象方法只有声明没有方法体,不能被调用。但是,我们可以通过子类继承抽象父类去实现抽象方法。
由于抽象类不能实例化,所以用上面的例子的话,就是不能 使用 Bird b =new Bird();
来创建对象。那么我们就得引入上转型的定义了。
向上转型:
向上转型就是把子类对象直接赋给父类的引用变量,不用强制转换。使用向上转型可以调用父类类型中的所有成员。
注意点:
上转型对象不能调用子类新增的成员变量和方法,但是可以调用父类隐藏的变量/方法和继承以及重写的变量和方法。
格式:
父类类型 创建对象 = new 子类类型
例如:上面例题的 Bird b =new B1();
注意点:
非抽象子类要重写抽象父类的所有抽象方法,一个都不可以少,否则会报错。
举个栗子:
abstract class Bird{ public abstract void fly(); public abstract void say(); } class B1 extends Bird{ public void fly(){ System.out.println("我不会飞!"); } }如上这种情况,代码会爆红。其原因就是非抽象的子类没有重写抽象父类的所有方法。
abstract class Bird{ //抽象父类 public abstract void fly(); public abstract void say(); } class B1 extends Bird{ //创建一个叫B1的类去继承Bird,即子类 且非抽象。 public void fly(){ System.out.println("我不会飞!"); } public void say(){ System.out.println("你好呀~"); } }以上这种情况下,代码是不报错的。
abstract class Bird{ public abstract void fly(); public abstract void say(); } class B1 extends Bird{ public void fly(){ System.out.println("我不会飞!"); } public void say(){ System.out.println("你好呀~"); } } public class TestBrid { public static void main(String[] args) { Bird b =new B1(); //用上转型去创建一个对象,后面会介绍上转型的使用方法。 b.fly(); b.say(); } }将代码补充完整时,是可以运行的,输出结果为:
我不会飞!
你好呀~
抽象类的子类,可以继承父类的方法,也可以重写。
来个例题,练练手~
.声明一个抽象类机动车,并在机动车类中声明抽象方法启动、加速和刹车,创建轿车子类(一个为自动挡,一个为手动挡)实现父中的抽象方法,并通过子类的实例化对象调用这些方法。
代码如下:
运行结果为: