(转载)Java 为什么不支持多继承?

继承

1、概念继承是面向对象最显著的一个特征继承是从已有的类中派生出新的类,新类能吸收已有类的数据属性和行为,并扩展新的能力.Java继承是会用已存在的类的定义作为基础建立新类的技术新类的定义可以增加新的数据或者新的功能,也可以使用父类的功能,但不能选择性的继承父类(超类/基类)这种继承使得复用以前的代码非常容易,能够大大的缩短开发的周期,降低开发费用.

2、特点使用extends关键字来表示继承关系相当于子类把父类的功能复制了一份Java只支持单继承继承可以传递(爷爷/儿子/孙子这样的关系)父类的私有成员由于私有限制访问,所以子类不能使用父类的私有资源继承多用于功能的修改,子类可以在拥有父类功能的同时,进行功能拓展像是is a的关系

0x00、深入理解子类与父类的关系

首先,我们要知道 继承 这个概念在面向对象语言中本身就是和 类 同等重要的地位,继承也是面向对象语言中最为重要的特征之一。

基于类的概念,类是将需要写的代码抽象化成一个个具有相同属性或行为的东西,如果我们想要去初始化一个子类,那么一定代表是具有父类的特征的。

这样我们还得到了其他好处:
可以直接获取父类的字段和行为可以修改父类的行为可以重载父类的行为(即指多态的概念)可以添加新的字段和行为这样进一步把面向对象语言具有更多的功能,更加的抽象。
所以从高效使用语言和方便快捷使用语言的好处来看,既可以提高我们所写的程序的抽象程度,而且还是实现了父类代码的复用,还兼具了修改功能,以此提高了开发效率和可维护性。
我们继续考虑子类是由父类功能和属性的拓展,延伸而来的,所以想想哪个关键词可以表达派生,延伸的概念,于是引入了 ​ ​Extends​ ​ 来表示继承的概念,后面连接的类名是代表从哪里继承而来的。
引入了Java中的继承是通过extends关键字来实现的。看一下代码:

class Student extends Person {
    
    
  expression;
}

注意,因为java程序所有都是拓展为类的概念,所以任何一个对象都属于一个类,如果没有 ​ ​extends​ ​ 子句,那么这个类默认为java.lang.Object​ ​ 的子类。

并且java程序中所有的类都是直接或者间接地继承 ​java.lang.Object​ ​ 得到的。

可以看下面这张图,就可以很简单的理解子类,父类的关系,指 学生作为一个类 可以由 人这个类继承来。

在这里插入图片描述

类包括子类,父类和超类,其中父类包括所有直接或间接被继承的类。
Java中为了简单考虑,规定了一条规则,就是 一个类只 能有一个 直接父类, 所以引入了新名词: 单继承 。

0x01、在继承的过程中需要注意字段部分字段的变化情况是十分重要的:

  • 1.父类字段的继承因为子类就是由父类继承来的,所以,子类会自动继承父类的所有字段。即代表上述代码, ​ ​Student​ ​ 子类自动具有父类 ​ ​Person​ ​ 的字段。
  • 2.父类字段的重复加入子类因为需要重新定义了与父类继承而来域变量完全相同的变量,就引入了域变量的隐藏,子类中起作用的是自己的变量,同时这也可能是我们不想用父类的这个变量,在初始赋值需要不同时就可以做到。
  • 3.子类字段的添加这是子类产生最开始的需求,子类区别于父类就是因为子类中多了一些自己的特征,自己的属性和方法,所以子类的添加如下,添加了学校,添加了成绩这些单独属性。
class Student extends Person{
    
    
  String school;
  int score;
}

0x02、在继承的过程中需要的注意方法部分

继承的核心想法没有变,依然是继承父类该有的东西,如果想增加子类的方法,直接增加不同命的方法就行,以下注意:

  • 1.方法的继承因为访问修饰符的出现(后面文章会阐述),父类只要是除了 ​ ​Private​ ​ 私有的方法,都会被子类自动继承。

  • 2.方法的覆盖子类因为有自己的方法,所以想根据自己的属性来实现自己的方法,但是方法又跟父类同名,那么引入一种概念叫 方法覆盖 ,也叫重写,通过可以实现对 父类方法的覆盖(Override)。

以下代码: ​ ​@Override​ ​ 指方法的重写,是子类本身的独有属性。

@Override
void method(){
    
    
  System.out.println("x" + y + "z")
}

<所以,通过方法的覆盖,能够 修改 对象的 同名方法 的 具体实现方法

  • 3.方法的重载如果增加的方法同名,那么就实现了 重载,既可以重载父类同名方法,也可以重载子类同名的方法,前者叫重载,后者叫多态,因为重载已经代表是重新实现同名的方法,所以,重载不需要参数列表类型相同,所以重载也就是新加的一个方法。

以下代码:子类扩展了父类,覆盖了 ​ ​display(​ ​ )方法,并拥有自己的 ​ ​show()​ ​ 方法。在 ​ ​main()​ ​ 方法中,我们将为父类和子类创建对象,并调用它们各自的方法。

package com.javainterviewpoint;

public class Child extends Parent {
    
    
    public void display(String name) {
    
    
        System.out.println("Welcome to Child Class \""+name+"\"");
    }
    public void show() {
    
    
        System.out.println("show() method of Child class");
    }
    public static void main(String args[]) {
    
    
        //为父类创建对象
        Parent p = new Parent();
        //调用父类方法
        p.display("JavaInterviewPoint");
        p.disp();

        //为子类创建对象
        Child c = new Child();
        c.display("JavaInterviewPoint");
        c.show();
    }
}

当我们运行代码时,我们将得到下面的结果:
在这里插入图片描述

0x03、方法重写规则总结方法覆盖的规则:

方法应该具有相同的返回类型和参数访问级别不能比方法的重写访问级别更严格不能重写声明为final或static的方法如果一个方法不能被继承,它就不能被重写不能重写构造函数

0x04、文章总结本教程比较完整的讲解了Java如何适当的使用面向对象概念,面向对象方法,总结了子类方法的重写规则,继承与父类的关系,适用于更加深入的理解。

作者:学java进大厂
链接:https://www.zhihu.com/question/24317891/answer/2656390811
来源:知乎

猜你喜欢

转载自blog.csdn.net/u013030601/article/details/128819456
今日推荐