java inheritance_Inheritance In Java

Java中的Inheritance (IS-A关系)是指子对象从父对象继承或获取所有属性和行为的能力。 在面向对象的编程中,继承用于提升代码的可重用性。

在本Java教程中,我们将学习Java支持的inheritance types以及如何在Java应用程序中实现继承 。

1. What is inheritance in Java

如前所述,继承就是通过派生类(子类或子类)继承父类(父类)的公共状态和行为 。 默认情况下,子类可以继承超类的所有non-private members 。

在Java中, extends关键字用于类之间的继承。 让我们看一个快速继承的例子。

1.1. Java inheritance example

假设我们有Employee类。 雇员类具有组织中所有雇员必须具有的所有公共属性和方法。 也可以有其他专门的员工,例如Manager 。 经理是组织的正式员工,但与其他员工相比,他们具有更多的属性,例如,他们有报告人或下属。

让我们设计以上类。public class Employee

{

private Long id;

private String firstName;

private String lastName;

public Long getId() {

return id;

}

public void setId(Long id) {

this.id = id;

}

public String getFirstName() {

return firstName;

}

public void setFirstName(String firstName) {

this.firstName = firstName;

}

public String getLastName() {

return lastName;

}

public void setLastName(String lastName) {

this.lastName = lastName;

}

@Override

public String toString() {

return "Employee [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + "]";

}

}import java.util.List;

public class Manager extends Employee

{

private List subordinates;

public List getSubordinates() {

return subordinates;

}

public void setSubordinates(List subordinates) {

this.subordinates = subordinates;

}

@Override

public String toString() {

return "Manager [subordinates=" + subordinates + ", details=" + super.toString() + "]";

}

}

在上述实现中,员工具有共同的属性,例如id , firstName和lastName ; 而经理仅具有专门的subordinates属性。 要从Employee类继承所有非私有成员(在本例中为getter和setter方法),则使用Manager extends Employee 。

让我们看看它是如何工作的?public class Main

{

public static void main(String[] args)

{

Manager mgr = new Manager();

mgr.setId(1L);

mgr.setFirstName("Lokesh");

mgr.setLastName("Gupta");

System.out.println(mgr);

}

}

Program Output.Manager [subordinates=null, details=Employee [id=1, firstName=Lokesh, lastName=Gupta]]

显然, Manager类可以使用Employee类的成员。 这种行为称为继承。 很简单,不是吗?

现在考虑我们是否不使用继承。 然后,我们将在两个类中都定义id,firstName和lastName。 这会导致代码重复,这总是在代码维护中造成问题。

2. Types of inheritance in Java

在Java中,继承可以是four types -取决于类的层次结构。 让我们了解所有四种继承。

2.1. Single inheritance

这很简单。 有一个家长班和一个孩子班。 一个子班扩展了一个父班 。 它是单一继承。 上面的示例代码(员工和管理者)是单继承的示例。a8968ca2783eca2146857a32e140b0b3.pngJava Single Inheritance

2.2. Multi-level inheritance

在多级继承中,三个以上的类之间将存在继承,这样子类将充当另一个子类的父类 。 让我们用一个图来理解。a7df835f7110ed79bec0f6c1ae06e877.pngMultilevel Inheritance

在上面的示例中,类B扩展了类A ,因此类B是类A子类。 但是C扩展了B ,因此B是C父类。 因此, B既是父班,也是子班。

2.3. Hierarchical inheritance

在分层继承中,有一个超类,并且有一个以上的子类扩展了超类。8235c9aface6104cb5d80baa51dd0d3b.pngHierarchical Inheritance

这些子类B , C和D将共享从A继承的公共成员,但它们不会相互知道成员。

2.4. Multiple inheritance

在多重继承中,一个类也可以从多个父类中继承行为 。 让我们用图来理解。914d15481116635643edbf69a0c2b333.pngMultiple inheritance

在图中, D正在扩展类A和B 这样, D可以继承两个类的非私有成员。

但是,在Java中,不能将extends关键字与两个类一起使用。 那么,多重继承将如何工作?直到JDK 1.7,在Java中都无法进行多重继承。 但是从JDK 1.8开始,可以通过使用带有默认方法的接口来实现multiple inheritance 。

3. Accessing inherited parent class members

现在我们知道,使用四种类型的继承机制,我们可以访问父类的非私有成员。 让我们看看如何访问单个成员。

3.1. Parent class constructors

可以通过super关键字调用超类的构造函数。 只有两个规则:super()调用必须从子类构造函数进行。

super()调用必须是构造函数中的第一条语句。public class Manager extends Employee

{

public Manager()

{

//This must be first statement inside constructor

super();

//Other code after super class

}

}

3.2. Parent class fields

在Java中,非私有成员字段可以在子类中继承。 您可以使用点运算符(例如manager.id访问它们。 这里id属性是从父类Employee继承的。

在父类和子类中处理具有相同名称的字段时,需要小心。 请记住, java字段不能被覆盖 。 具有相同名称的字段会在通过子类访问时对父类隐藏该字段。

在这种情况下,将根据引用类型的类确定访问的属性。ReferenceClass variable = new ActualClass();

在以上情况下,将从ReferenceClass访问成员字段。 例如//Parent class

public class Employee

{

public Long id = 10L;

}

//Child class

public class Manager extends Employee

{

public Long id = 20L; //same name field

}

public class Main {

public static void main(String[] args)

{

Employee manager = new Manager();

System.out.println(manager.id); //Reference of type Employee

Manager mgr = new Manager();

System.out.println(mgr.id); //Reference of type Manager

}

}

Output:

10

20

3.3. Parent class methods

与字段访问相反,方法访问使用在运行时创建的实际对象的类型。

java] ReferenceClass变量= new ActualClass(); [/ java]

在上述情况下,将通过ActualClass访问成员方法。 例如public class Employee

{

private Long id = 10L;

public Long getId() {

return id;

}

}

public class Manager extends Employee

{

private Long id = 20L;

public Long getId() {

return id;

}

}

public class Main

{

public static void main(String[] args)

{

Employee employee = new Employee(); //Actual object is Employee Type

System.out.println(employee.getId());

Employee manager = new Manager(); //Actual object is Manager Type

System.out.println(manager.getId());

Manager mgr = new Manager(); //Actual object is Manager Type

System.out.println(mgr.getId());

}

}

Output:

10

20

20

4. Summary

让我们总结一下我们从java inheritance中学到的知识:继承也称为IS-A关系。

它为子类提供了继承父类的非私有成员的能力。

在Java中,继承是通过extends关键字实现的。

从Java 8开始,您可以使用具有默认方法的接口来实现多重继承。

从引用类型类访问成员字段。

成员方法是从实际实例类型访问的。

如果有任何问题,请在评论部分中向我发送。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值