一、继承
继承是java面向对象编程技术的一块基石,它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
继承就是指在现有类的基础上,去构建一个新类,新类成为子类(派生类),原有的类称为父类(基类/超类)。
二、继承的优缺点
优点:
1.提高代码的复用性。
2.提高代码的可维护性。
3.提高开发效率。
缺点:
提高了类与类之间的耦合性。
三、继承的格式
class 父类{
}
class 子类 extends 父类{
}
四、继承的特性
1.子类拥有父类非private的属性,方法。
2.子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
3.子类可以用自己的方式实现父类的方法。(重写)
4.Java的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如A类继承B类,B类继承C类,所以按照关系就是C类是B类的父类,B类是A类的父类。
例1:
//定义手机类
class Phone{
//定义手机的价格
double price = 500;
//手机都能打电话
public void call(){
System.out.println("手机可以打电话");
}
}
//定义具体的手机类:华为手机类,让其继承手机类Phone
class HuaWei extends Phone{
//定义子类特有的方法,在子类中可以直接使用父类的非私有的成员变量
public void show(){
//输出父类中定义的手机的价格
System.out.println(price);
}
}
//定义测试类
class Test{
public static void main(String[] args){
//创建子类对象
HuaWei hw = new HuaWei();
//因为继承了Phone类,所以继承了父类的属性和方法,所以可以调用父类中的call()方法
hw.call();
//调用子类特有的方法,输出父类中定义的手机价格
hw.show();
//子类对象也可以直接调用父类中非私有的成员变量
System.out.println(hw.price);
}
}
如果子类定义了与父类同名的变量,那么在子类中,或在子类对象的调用中,会优先使用子类本身定义的变量,要想使用父类的,需要使用super关键字调用。
例2:
//定义手机类
class Phone_2{
//定义手机的价格
double price = 500;
}
//定义具体的手机类:华为手机类,让其继承手机类Phone
class HuaWei_2 extends Phone_2{
//定义手机的价格,变量名与父类相同
double price = 600;
//定义子类特有的方法
public void show(){
//这里会优先使用子类本身定义的变量price
System.out.println(price);
//输出父类的要使用super关键字调用
System.out.println(super.price);
}
}
//定义测试类
class Test_2{
public static void main(String[] args){
//创建子类对象
HuaWei_2 hw_2 = new HuaWei_2();
//调用子类特有的方法,输出子类本身定义的手机价格,和父类中定义的价格
hw_2.show();
//子类对象调用price
System.out.println(hw_2.price);
}
}
在子类中定义了与父类中一模一样的成员方法(权限大于或等于父类方法的权限),此操作称之为方法重写。
当子类对象调用方法是,会优先调用自己重写后方法,如果没有重写,那么才会去调用父类中的方法。
例3:
//定义手机类
class Phone_3{
//定义打电话方法
public void call(){
System.out.println("手机可以打电话!");
}
}
//定义具体的手机类:华为手机类,让其继承手机类Phone
class HuaWei_3 extends Phone_3{
//重写父类中的打电话方法
@Override
public void call() {
//使用super关键字调用父类中的call方法
super.call();
System.out.println("华为手机当然可以打电话!");
}
}
//定义测试类
class Test_3{
public static void main(String[] args){
//创建子类对象
HuaWei_3 hw_3 = new HuaWei_3();
//优先调用子类重写后的方法
hw_3.call();
}
}
注意:
被final修饰的类和方法,不能被继承和重写!
子类不能继承父类的构造器(构造方法或者构造函数),如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。
如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。