Подкласс может наследовать от суперкласса. Суперкласс также известен как базовый класс или родительский класс. Подкласс также известен как производный класс или дочерний класс.

Наследовать класс от другого класса очень просто. Мы используем ключевое слово extends, за которым следует имя суперкласса в объявлении класса вашего подкласса.

Java не поддерживает множественное наследование реализации.

Класс в Java не может иметь более одного суперкласса.

Синтаксис

Общий синтаксис

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

Пример

В следующем коде показано, как использовать создание класса Manager из класса Employee.

class Employee {/*ww  w. j a va2  s .  c o  m*/
  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 Name: Tom

Примечание

Мы не писали никакого кода для класса Manager, он работает так же, как класс Employee, потому что он наследуется от класса Employee.

Вы создаете объект менеджера, используя конструктор класса Manager.

Manager mgr = new Manager();

После создания объекта «Менеджер» объект «Менеджер» работает так же, как и объект «Сотрудник».

Мы использовали методы setName() и getName() с объектом менеджера.

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

Класс Manager не объявляет методы setName() и getName(). Класс менеджера «расширяет сотрудника».

Когда класс наследуется от другого класса, он наследует члены своего суперкласса, переменные экземпляра, методы и т. д.

Родительский класс объекта

Класс объекта является суперклассом по умолчанию

Если класс не определяет суперкласс, используя ключевое слово extends в своем объявлении класса, он наследуется от класса java.lang.Object.

public class P {
}

класс P расширяется от Object, хотя мы не указали родительский класс.

Все классы были неявно унаследованы от класса Object. Поэтому объекты всех классов могут использовать методы класса Object.

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

Класс Employee не указывает свой суперкласс с помощью предложения extends. Это означает, что он наследуется от класса Object.

Класс Object объявляет методы hashCode() и toString(). Поскольку класс Employee является подклассом класса Object, он может использовать эти методы.

Повышение и понижение

Отношение «есть-а» в реальном мире преобразуется в иерархию классов наследования в программном обеспечении.

Например, Менеджер — это особый тип Сотрудника. Сотрудник — это особый тип объекта.

По мере продвижения вверх по иерархии наследования вы переходите от определенного типа к более общему типу.

Присвоение от подкласса к суперклассу называется повышением приведения, и это всегда разрешено в Java.

class Employee {//from   w  ww . jav a  2  s  .c  o m
  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

Приведенный выше код генерирует следующий результат.

Tom
Jack

оператор 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. Метод final не может быть переопределен или скрыт подклассом.

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