抽象类的定义及方法的重写
抽象类的关键词:abstract
- 首先定义一个抽象类(Phone)
public abstract class Phone{//定义一个抽象类
//思考:1>应用场景 2>如何定义
//抽象类可以看作是一个不具体的类(通俗一点讲就是:无法详细描述的类(事物),只能描述个大概)
//例如:人类、动物、水果等,或者常见的有:英雄、商品,它们的共同特征就是有多个种类。
//结合上面所说的,这里举一个‘手机’类的例子:
//手机品牌名称 例如:苹果、华为、小米、vivo、OPPO、红魔、绿魔等
String brand;
//手机名称
String name;
//手机价格
int price;
//上面这些属性(变量)是手机都共有的属性(变量)
//再写一些共有的方法
//手机通话的呼叫功能
public abstract void call();
//手机短信的发送功能
public abstract void send();
//测试方法
public void overrideMethod() {
System.out.println("--Phone method--");
}
//备注:因为类是抽象的,所以抽象类中的方法‘可以’不用具体实现功能。
//疑问1:抽象类只能有抽象方法吗?
//答:不是的,可以有普通方法、静态方法以及构造方法,但是没必要,因为具体的功能都将由子类
// 继承后去实现,抽象类从某种角度上来讲只是提供了一定的‘规则’来约束它的子类。
}
- 然后定义一个普通类去继承抽象类(Nokia)
继承的关键词:extends
public class Nokia extends Phone{
//继承的特性:
//子类可以继承父类所有公共的(public)和受保护的(protected)属性及方法
//与普通的继承不同的是父类属于抽象类,因此还需要实现父类中所有的抽象方法:
public Nokia(){
brand = "诺基亚(Nokia)";
name = "诺基亚 NOKIA 105 新 黑色 老人老年手机";
price = 149;
}
@Override //备注:带@的都属于注解,Override则意为重写
public void call(){
System.out.println("这是"+brand+"的通话呼叫功能");
}
@Override
public void send(){
System.out.println("这是"+brand+"的发送短信功能");
}
//当前类定义的获取信息的方法(普通方法)
public void getInformation(){
System.out.println("brand="+brand+",name="+name+",price="+price);
}
//测试方法
public void overrideMethod() {
System.out.println("--Nokia method--");
}
}
抽象类的继承:抽象类的子类要调用父类的方法,必须要实现(重写)其功能才能调用
即便没有@Override注释,但如果子类中自定义的方法和父类中自定义的方法相同,那么也能达到一个重写的效果
疑问:抽象方法不能与哪些关键词共存?为什么?
1.static
从需求上分析,将抽象方法设置成静态的没有实际意义,因为抽象方法没有具体的实现功能。
2.private
首先,定义抽象方法是为了由子类去实现其具体功能的,其次子类无法使用父类中私有化的方法,由此不难看出两者相互冲突
3.final
有final修饰的方法都属于最终方法,和上面一样,因为没有具体功能所以不能算是最终方法,而且有final修饰的方法可以被继承但无法重写,这两点都与抽象方法相违