一个类获取另一个类的属性(数据成员)和函数(方法)的过程称为继承。
继承的目的是提供代码的可重用性,以便类只需要编写有唯一特性的部分,其余的公共属性和功能可以从另一个类扩展。
子类:
扩展另一个类的功能的类称为子类,子类或派生类。
父类:
其属性和功能由另一个类使用(继承)的类称为父类,超类或基类。
继承是通过扩展其公共数据成员和方法,基于现有类定义新类的过程。
继承允许我们重用代码,它提高了Java应用程序的可重用性。
注意:继承的最大优点是不需要在子类中重写已存在于基类中的代码。
这意味着父类的数据成员(实例变量)和方法可以在子类中使用。
让我们回到主题:
语法:Java中的继承
要继承一个类,我们使用extends关键字。这里的类XYZ是子类,类ABC是父类。XYZ类继承了ABC类的属性和方法。
class XYZ extends ABC
{
}
在这个例子中,我们有一个基类Teacher和一个子类PhysicsTeacher。
由于类PhysicsTeacher从基类扩展了指定和大学属性以及work方法,因此我们不需要在子类中声明这些属性和方法。
这里,我们有共同的collegeName, designation 和 work()方法,这样子类,无需编写代码,并可以直接从基类使用。
class Teacher {
String designation = "Teacher";
String collegeName = "Beginnersbook";
void does(){
System.out.println("Teaching");
}
}
public class PhysicsTeacher extends Teacher{
String mainSubject = "Physics";
public static void main(String args[]){
PhysicsTeacher obj = new PhysicsTeacher();
System.out.println(obj.collegeName);
System.out.println(obj.designation);
System.out.println(obj.mainSubject);
obj.does();
}
}
程序输出:
Beginnersbook
Teacher
Physics
Teaching
基于上面的例子,我们可以说是PhysicsTeacher IS-A Teacher。
这意味着子类与父类具有IS-A关系,这种继承被称为子类和父类之间的IS-A关系。
注意:
派生类只能继承声明为public或protected的所有成员和方法。
如果超类的成员或方法声明为private私有成员,则派生类不能直接使用它们。
私有成员只能在自己的类中访问。
只能使用公共public或受保护的protected超类的getter和setter方法访问此类私有成员。
如下例所示。
class Teacher {
private String designation = "Teacher";
private String collegeName = "Beginnersbook";
public String getDesignation() {
return designation;
}
protected void setDesignation(String designation) {
this.designation = designation;
}
protected String getCollegeName() {
return collegeName;
}
protected void setCollegeName(String collegeName) {
this.collegeName = collegeName;
}
void does(){
System.out.println("Teaching");
}
}
public class JavaExample extends Teacher{
String mainSubject = "Physics";
public static void main(String args[]){
JavaExample obj = new JavaExample();
// 我们不能直接访问父类的私有成员,但是可以使用public公共的getter方法来访问
System.out.println(obj.getCollegeName());
System.out.println(obj.getDesignation());
System.out.println(obj.mainSubject);
obj.does();
}
}
程序输出:
Beginnersbook
Teacher
Physics
Teaching
上面示例中要注意的重点是子类能够通过父类的受保护方法访问父类的私有成员。
当我们使实例变量(数据成员)或方法受到保护时,这意味着它们只能在类本身和子类中访问。
这些 public, protected, private 等都是访问说明符,我们将在接下来的教程中讨论它们。
继承的类型
单一继承:指的是一个子类和父类关系,其中一个类扩展另一个类。
多级继承:指一个类扩展子类的子类和父类关系。例如,类C扩展了类B,类B扩展了类A.
分层继承:指的是子类和父类关系,其中多个类扩展同一个类。
例如,B,C和D类扩展了相同的A类。
多重继承:指一个类扩展多个类的概念,这意味着子类有两个父类。
例如,类C扩展了类A和B.
Java不支持多重继承。
混合继承:在单个程序中组合多种类型的继承。
例如,类A和B扩展了类C,另一个类D扩展了类A,那么这是一个混合继承示例,因为它是单继承和层次继承的组合。
构造函数和继承
当我们创建子类的对象时调用子类的构造函数,它默认调用超类的默认构造函数。
因此,在继承中,对象是自上而下构造的。
可以使用super关键字显式调用超类构造函数,但它应该是构造函数中的第一个语句。
super关键字指的是超类,紧接在层次结构中的调用类之上。
不允许使用多个超级关键字来访问除直接父级之外的祖先类。
class ParentClass{
//父类构造函数
ParentClass(){
System.out.println("Constructor of Parent");
}
}
class JavaExample extends ParentClass{
JavaExample(){
/* 它默认调用的父类的构造
* 您可以使用super()来调用parent的构造函数。
* 它应该是子类中的第一个语句
* 您也可以调用参数化构造函数
* 使用super这样的父类:supe(10)
* 这将调用int类型参数的参数化构造函数
*/
System.out.println("Constructor of Child");
}
public static void main(String args[]){
//创建子类对象
new JavaExample();
}
}
程序输出:
Constructor of Parent
Constructor of Child
继承和方法覆盖
当我们在父类中已经存在的子类中声明相同的方法时,这称为方法重写。
在这种情况下,当我们从子类对象调用该方法时,将调用该方法的子类版本。
但是我们可以使用super关键字调用父类方法,如下例所示:
class ParentClass{
//父类构造方法
ParentClass(){
System.out.println("Constructor of Parent");
}
void disp(){
System.out.println("Parent Method");
}
}
class JavaExample extends ParentClass{
JavaExample(){
System.out.println("Constructor of Child");
}
void disp(){
System.out.println("Child Method");
//调用父类的 disp() 方法
super.disp();
}
public static void main(String args[]){
//创建子类对象
JavaExample obj = new JavaExample();
obj.disp();
}
}
程序输出:
Constructor of Parent
Constructor of Child
Child Method
Parent Method
原文地址:
https://beginnersbook.com/2013/03/inheritance-in-java/