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
这很简单。 有一个家长班和一个孩子班。 一个子班扩展了一个父班 。 它是单一继承。 上面的示例代码(员工和管理者)是单继承的示例。Java Single Inheritance
2.2. Multi-level inheritance
在多级继承中,三个以上的类之间将存在继承,这样子类将充当另一个子类的父类 。 让我们用一个图来理解。Multilevel Inheritance
在上面的示例中,类B扩展了类A ,因此类B是类A子类。 但是C扩展了B ,因此B是C父类。 因此, B既是父班,也是子班。
2.3. Hierarchical inheritance
在分层继承中,有一个超类,并且有一个以上的子类扩展了超类。Hierarchical Inheritance
这些子类B , C和D将共享从A继承的公共成员,但它们不会相互知道成员。
2.4. Multiple inheritance
在多重继承中,一个类也可以从多个父类中继承行为 。 让我们用图来理解。Multiple 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开始,您可以使用具有默认方法的接口来实现多重继承。
从引用类型类访问成员字段。
成员方法是从实际实例类型访问的。
如果有任何问题,请在评论部分中向我发送。