关键字 extends
关键字extends表明正在构造的新类派生于一个已存在的类,也就是说通过extends申明的类是根据一个已经存在的类创建成功的。
这个已存在的类被称为 "父类" , "基类", "超类";新类被称为 "子类", "派生类", "孩子类"。其中 父类 和 子类是程序员最常用的术语。
作用
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
在子类中可以增加字段、添加方法或覆盖父类的方法,不过继承绝对不会删除任何字段或方法。
public class Demo{
public static void main(String[] args) {
Cat cat = new Cat();
cat.setName("小猫");
cat.eat();
}
}
class Animal{
private String name;
public void eat(){
System.out.println(name+"正在吃!");
}
public void setName(String name){
this.name = name;
}
}
class Cat extends Animal{
}
// 输出结果
小猫正在吃!
上面的代码中有一个Animal类,其中Cat类继承Animal。Cat类继承自Animal,虽然Cat类中没有定义任何的字段和方法,但是代码没有任何错误并且有输出结果,这是因为Cat继承了Animal中的公开的方法,所以子类继承于父类,子类可以使用父类中公开的方法。
覆盖方法
父类中的有些方法对于子类并不一定完全适用。需要在子类中定义一个和父类相同的方法名来覆盖父类中的方法。
代码案例
public class Demo{
public static void main(String[] args) {
Cat cat = new Cat();
cat.setName("小猫");
cat.eat();
}
}
class Animal{
private String name;
public void eat(){
System.out.println(name+"正在吃!");
}
public void setName(String name){
this.name = name;
}
}
class Cat extends Animal{
public void eat(){
System.out.println("我正在吃");
}
}
// 输出结果
我正在吃
Cat类中的eat()方法和父类Animal中的eat()方法相同。所以在调用eat()方法时,子类的eat()方法会覆盖父类中的eat()方法。
super关键字
子类中调用父类中的方法
public class Demo{
public static void main(String[] args) {
Cat cat = new Cat();
cat.setName("小猫");
cat.hello();
}
}
class Animal{
private String name;
public void eat(){
System.out.println(name+"正在吃!");
}
public void setName(String name){
this.name = name;
}
}
class Cat extends Animal{
public void hello(){
super.eat();
}
}
// 输出结果
小猫正在吃!
Cat类中定义一个hello()方法,方法中通过supper关键字调用父类中的eat()方法,最后在main方法中调用这个hello()方法,最后的结果如上显示。
- supper关键字可以在子类中调用父类中公开的方法或属性。
子类中通过父类的构造函数初始化
super关键字有两个含义:一时调用父类中的方法,二是调用父类中的构造器。
代码解释
public class Demo{
public static void main(String[] args) {
Cat cat = new Cat("小猫");
cat.eat();
}
}
class Animal{
private String name;
public Animal(String name){
this.name = name;
}
public void eat(){
System.out.println(name+"正在吃!");
}
}
class Cat extends Animal{
public Cat(String name){
super(name);
}
}
// 输出结果
小猫正在吃!
这里Cat类中有一个构造函数,在构造函数中通过supper关键字调用父类中的构造函数。最终完成Animal父类中的name字段初始化。
继承层次
继承并不仅限于一个层次,可以一直往下继承。如果明确表明一个类不在拥有子类,应该显著的在类上通过final关键字标明。
由一个公共父类派生的所有类的集合称为继承层次,在继承层次中,从某个特定的类到其祖先类的路径称为该类的继承链。
如图:

上图中Class A 继承 Class B, Class B 继承Class A;这样的层次关系就是继承的层次。