Java 核心技术之继承(一)

2019/07/18 Java

利用继承,人们可以基于已存在的类构造一个新类。继承已存在的类就是复用(继承)这些类的方法和域。在此基础上,还可以添加一些新的方法和域,以满足新的需求。

类、超类、子类

定义子类

下面是由继承 Employee 类来定义 Manager 类的格式,关键字extends表明正在构造的新类派生于一个已存在的类。已存在的类称为超类、基类或父类;新类称为子类、派生类或孩子类。

import java.time.LocalDate;

public class Employee {
    private String name;
    private int age;
		
    public Employee(String name, int age){
    	this.name = name;
    	this.age = age;
    } 	
  
    public String getName(){
        return name;
    }

    public double getAge(){
        return age;
    }
}

Employee 作为父类,在子类使用entends后,子类就可以使用父类中公共的方法和域。虽然在 Manager 类中没有定义过getName()方法,但是由于子类使用extends,于是就自动继承了父类的方法。

public class Manager extends Employee{
  
  private double bonus;
  
  public Manager(String name, age) {
    super(name, age);
  }
  
  public void setBonus(double bonus){
    this.bonus=bonus;
  }
  
  public static void main(String[] args) {
    Manager boss = new Manager("x",18);
    String n = boss.getName();
    System.out.println(n);
  }
}

覆盖方法

然而,父类中的有些方法对子类 Manager 来说并不一定适用。在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类有不同功能的方法,但是具有同样的名称、返回值类型、参数列表。

如果在新类中定义一个方法,其名称、返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法。其中参数列表又叫做参数签名,包括参数的类型、个数,顺序,只要有一个不同就叫做参数列表不同。

被覆盖的方法在子类中只能通过super调用。

public class demo {
  public static void main(String[] args) {
        Dog a = new Dog("jj");
        Animal b=new Animal("dd");
        a.say();
        b.say();
    }
}

public class Animal {
    String name;
    public Animal(String name){
        this.name = name;
    }

    public void say(){
        System.out.println("I am a animal and my name is " + name);
    }
}

public class Dog  extends Animal{
    public Dog(String name){
        super(name);
    }

    public void say(){
        System.out.println("i am a dog and my name is " + name);
    }

}

覆盖方法的原则

  • 覆盖方法的返回类型、方法名称、参数列表必须与原方法相同。
  • 覆盖方法不能比原方法访问性差。
  • 被覆盖的方法不能是final private static类型。

子类构造器

由于子类无法访问超类中的私有域,所以必须利用超类中的构造器来实现对子类中的这部分私有域的初始化,这里就可以通过super实现对超类中的构造器的调用,在子类中,如果使用了super语句,那么该语句要被放置在该构造器的第一句。

如果子类没有显示的调用超类的构造器,则子类默认使用超类的无参构造器。

继承层次

继承并不仅限于一个层次。由一个公共超类派生出来的所有类的集合被称为继承层次。一个祖先类可以拥有多个子孙继承链。同一个等级的子类之间可以没有任何的联系。

Search

    Table of Contents