Java教程16—Java中的继承

一个类获取另一个类的属性(数据成员)和函数(方法)的过程称为继承。
继承的目的是提供代码的可重用性,以便类只需要编写有唯一特性的部分,其余的公共属性和功能可以从另一个类扩展。

子类:
扩展另一个类的功能的类称为子类,子类或派生类。

父类:
其属性和功能由另一个类使用(继承)的类称为父类,超类或基类。

继承是通过扩展其公共数据成员和方法,基于现有类定义新类的过程。
继承允许我们重用代码,它提高了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/
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可 6私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值