Java 继承

Java面向对象设计 - Java继承

子类可以从超类继承。超类也称为基类或父类。子类也称为派生类或子类。

从另一个类继承一个类非常简单。我们在子类的类声明中使用关键字extends,后跟超类名称。

Java不支持多重继承的实现。

Java中的类不能有多个超类。

语法

一般的语法是

<class modifiers>class <SubclassName> extends <SuperclassName> {
    // Code for the   Subclass
}

例子

以下代码显示如何使用从Employee类创建Manager类。

class Employee {
  private String name = "Unknown";
  public void setName(String name) {
    this.name = name;
  }
  public String getName() {
    return name;
  }
}
class Manager extends Employee {
}
public class Main {
  public static void main(String[] args) {
    // Create an object of the Manager class
    Manager mgr = new Manager();

    // Set the name of the manager
    mgr.setName("Tom");

    // Get the name of the manager
    String mgrName = mgr.getName();

    // Display the manager name
    System.out.println("Manager Name: " + mgrName);
  }
}

上面的代码生成以下结果。

注意

我们没有为Manager类编写任何代码,它的工作原理与Employee类相同,因为它继承自Employee类。

您可以使用Manager类的构造函数创建一个管理器对象。

Manager mgr = new Manager();

创建管理器对象后,Manager对象的工作方式与Employee对象相同。

我们对manager对象使用了setName()和getName()方法。

mgr.setName("Tom"); 
String mgrName  = mgr.getName();

Manager类不声明setName()和getName()方法。Manager类“扩展Employee"。

当一个类从另一个类继承时,它继承它的超类成员,实例变量,方法等。

对象父类

对象类是默认超类。

所有类都隐式继承自Object类。因此所有类的对象都可以使用Object类的方法。

public class P {

}

类P从Object扩展,即使我们没有指定父类。

Object类声明了hashCode()和toString()方法。因为Employee类是Object类的一个子类,它可以使用这些方法。

Employee emp = new Employee();
int hc  = emp.hashCode(); 
String str = emp.toString();

Employee类不使用extends子句指定其超类。这意味着它继承自Object类。

Object类声明了hashCode()和toString()方法。因为Employee类是Object类的一个子类,它可以使用这些方法。

向上转换和向下转换

现实世界中的“is-a”关系在软件中转化为继承类层次结构。

例如,Manager是特定类型的Employee。 Employee是一种特定类型的Object。

当您在继承层次结构中向上移动时,将从特定类型移动到更一般的类型。

从子类到超类的赋值称为上转换,它在Java中始终允许。

class Employee {
  private String name = "Unknown";

  public void setName(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }
}

class Manager extends Employee {
}

public class Main {
  public static void printName(Employee emp) {
    String name = emp.getName();
    System.out.println(name);
  }
  
  public static void main(String[] args) {
    Employee emp = new Employee();
    emp.setName("Tom");

    Manager mgr = new Manager();
    mgr.setName("Jack"); // Inheritance of setName() at work

    // Print names
    printName(emp);
    printName(mgr); // Upcasting at work
  }
}

为子类变量分配超类引用称为向下转换。

向下转换与向上转换相反。

在向上转换中,赋值向上移动类层次结构,而在向下转换中,赋值向下移动类层次结构。

我们必须在向下转换中使用类型转换。

Manager mgr = (Manager)emp;  // OK. Downcast  at work

上面的代码生成以下结果。

instanceof运算符

Java instanceof运算符帮助我们确定引用变量是否有对类或子类的引用。

它需要两个操作数,并计算为布尔值true或false。

它的语法是

<Class Reference Variable> instanceof <Class Name or Interface>

如果<Class Reference Variable>引用类<Class Name>或其任何后代的对象,instanceof返回true。

如果引用变量为null,instanceof总是返回false。

我们应该在向下转换之前使用instanceof运算符。

Manager mgr = new Manager(); 
Employee emp = mgr;
if (emp instanceof Manager)  {
    // downcast  will succeed 
    mgr = (Manager)emp;
}else  {
    // emp is not  a  Manager type
}

禁用继承

我们可以通过声明类final来禁用子类。

最终的类不能被子类化。

下面的代码声明了一个名为MyClass的最终类:

public final  class  MyClass{
   
}

我们也可以声明一个方法为final。最终方法不能被子类覆盖或隐藏。

public class A  {
    public final  void  m1()  {
    
    }

    public void  m2()  {
    }
}