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

国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码













