继承
在程序中,让一个类去继承另一个类。
比如:Cat类继承Animal类
Cat类是Animal类的子类,又称 派生类,Animal类是Cat类的父类,又称 超类 或 基类。
子类可以直接拥有父类的成员,但是父类的私有成员除外。
- 继承的语法格式
继承使用 extends 关键字
class Animal{}
class Cat extends Animal {} //Cat类继承Animal类
-
继承的好处
可以减少代码量
提高代码的复用性
继承的存在,造就了面向对象的最后一个特征 多态 -
继承后成员变量的特点
子类和父类的成员变量名相同:
子类在调用成员变量时,子类自己有,调用自己的成员变量,子类没有,调用父类的成员变量 -
继承后成员方法的特点
子类自动拥有父类中的方法,有时需要子类更改父类中的方法,即对父类方法的 重写
在子类中重写的方法需要和父类被重写的方法具有相同的方法名、参数列表和返回值类型。
通过方法的重写对程序已有功能进行扩展 -
方法重写的权限问题
方法重写需要考虑权限的.要保证子类方法的权限要大于或者等于父类方法权限
父类的方法权限是public :
class Fu{
public void print(){}
}
class Zi extends Fu{
public void print(){} //正确
protected void print(){} //错误,权限降低
void print(){} //错误,权限降低
private void print(){} //错误,权限降低
}
父类的方法权限是protected:
class Fu{
protected void print(){}
}
class Zi extends Fu{
public void print(){} //正确
protected void print(){} //正确
void print(){} //错误,权限降低
private void print(){} //错误,权限降低
父类方法权限是默认:
class Fu{
void print(){}
}
class Zi extends Fu{
public void print(){} //正确
protected void print(){} //正确
void print(){} //正确
private void print(){} //错误,权限降低
如果父类的方法权限是private, 子类不知道该方法的存在,没有继承的说法
- super关键字
在子类中调用父类的成员,使用super关键字
super.变量 调用父的成员变量
super.方法() 调用的是父类的成员方法 - 继承后构造方法特点
子类的构造方法中,第一行存在隐式代码 (写不写都存在),代码是super(); 调用父类的无参数构造方法.
子类的构造方法,无论重载多少个,第一行默认都是super();
父类没有无参数构造方法,子类的构造方法中应有super(参数列表);
父类中存在多个构造方法,子类的构造方法只要调用到其中的一个即可
public class Fu {
/**
* 父类的构造方法
* 加上参数,有参数的构造
*/
public Fu(int a){
System.out.println("父类构造方法" + a);
}
public Fu(String s){
System.out.println("父类构造方法" + s);
}
}
public class Zi extends Fu {
public Zi(){
//调用父类的无参数构造方法
//父类中没有无参数构造
//传递相应的参数
super(7);
}
public Zi(String s){
//调用父类构造方法,保证调用其中一个
super("字符串");
}
}
- 继承的特点
单继承,多层继承
单继承:一个子类只能拥有一个父类,不允许一个类同时继承多个类
class B{}
class C{}
class A extends B,C{} //不允许的行为
多层继承:
class C{}
class A extends B{}
class B extends C{}
A类可以同时拥有B类和C类的成员, B类只能拥有C类的成员
A类中通过super调用的是B类成员,如果B类没有成员,调用C类成员
Java中所有的类都是Object类的子类