5-6类的继承

5.6类的继承

Java的继承具有单继承的特点,每个子类只有一个直接父类。

5.6.1 继承的特点

语法
修饰符 class SubClass extends SuperClass
{
//类定义
}

子类能获取父类的全部变量和方法,但不能获得父类的构造器

最初父类(java.lang.Object)

如果定义 Java 并未显式指定这个类的直接父类,则这个类默认扩展 java.lang.Object。因此, java.lang.Object 类是所有类的父类,要么是其直接父类,要么是其间接父类。所以,所有的Java对象都可调用 java.lang.Object 类所定义的实例方法。

5.6.2 重写父类方法

方法的重写要遵循 两同两小一大"规则:

  • "两同"即方法名相同,形参列表相同 ;
  • "两小"指的子类方法返回值类型应比父类方法返回值类型更小或相等。子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;
  • "一大"指的是子类方法的访问权限应比父类方法的访问权限更大或相等

案例

Bird类

//Bird.java
public class Bird
{
public void fly()
{
System.out.println("Bird fly");
}
}

Ostrich类

//Ostrich.java
public class Ostrich extends Bird
{
public void fly()
{
System.out.println("Ostrich run, could not fly");
}
}

注意:类方法和实例方法不能互相覆盖

5.6.3 super限定(调用父类的隐藏成员)

如果需要在子类方法中调用父类被覆盖的实例方法,则可使用 super 限定来调用父类被覆盖的实例方法。

1.调用父类方法
public void callOverrideMethod()
{
super.fly();
}

注意:

  1. super限定符只能调用父类的实例方法,不能调用类方法。

  2. 调用构造器只能初始化继承来的父类变量。

2.调用父类变量

子类同名变量会隐藏父类变量。可以使用super来调用被隐藏的父类变量。

public void accessBase()
{
System.out.println(super.a);
}

如果被覆盖的是类变量,则通过父类名来调用。

5.6.4 调用父类构造器

使用super限定符,下面是案例

class Base
{
public double size;
public String name;
public Base(double size, String name)
{
this.size = size;
this.name = name;
}
}
public class Sub extends Base
{
public String color;
public Sub(double size, String name, String color)
{
super(size,name); //key code
this.color = color;
}
}

注意:如果不使用super调用父类的构造器,则会隐式地调用父类的构造器。因此,系统创建一个对象时,会从java.lang.Object构造器开始调用,依次往下调用。