2021-04-18 10:57  阅读(71)
文章分类:Java 基础教程 文章标签:JavaJava 教程
©  原文作者:w3cschool 原文地址:https://www.w3cschool.cn/java/java-class-instance.html

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);
      }
    }
    

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

20210418105110_1.png

注意

我们没有为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
    

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

2021041810512_2.png

instanceof运算符

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

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

它的语法是

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

如果引用类或其任何后代的对象,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()  {
        }
    }
    
点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> Java 继承
上一篇
Java 内部类成员
下一篇
Java 方法重写