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() { } }