java面向编程思想之继承

放下紧箍, 我就无法救你, 带上紧箍, 我就无法爱你

Java 继承(inheritance)是 Java 面向对象的三大重要特性之一(封装-encapsulation, 继承-inheritance, 多态-polymorphsim) Java 继承很好的管理了具有相似特征的类之间的关系(主要集中在成员变量、方法), 使程序可扩展、易修改,并且成为java多态的基础

Java中继承的概念很直观,很容易理解。拿个我们现实生活中的例子来说(儿子继承父亲的财产)就可以看成继承,就是将子类将父类的方法,属性拿来继承,但是有些是父类私有的方法和属性是不能继承给子类的。而且在Java中不支持多继承,但是支持多重继承。可以通俗的理解就是,不支持子类有多个父类,但是支持比如说(儿子继承父亲继承爷爷)类似这样的继承,Java是支持的。
在这里插入图片描述
1.子类继承父类的成员变量

当子类继承了某个类之后,便可以使用父类中的成员变量,但是并不是完全继承父类的所有成员变量。具体的原则如下:

1)能够继承父类的public和protected成员变量;不能够继承父类的private成员变量;

2)对于父类的包访问权限成员变量,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;

3)对于子类可以继承的父类成员变量,如果在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。

2.子类继承父类的方法

同样地,子类也并不是完全继承父类的所有方法。

1)能够继承父类的public和protected成员方法;不能够继承父类的private成员方法;

2)对于父类的包访问权限成员方法,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;

扫描二维码关注公众号,回复: 4236700 查看本文章

3)对于子类可以继承的父类成员方法,如果在子类中出现了同名称的成员方法,则称为覆盖,即子类的成员方法会覆盖掉父类的同名成员方法。如果要在子类中访问父类中同名成员方法,需要使用super关键字来进行引用。

注意:隐藏和覆盖是不同的。隐藏是针对成员变量和静态方法的,而覆盖是针对普通方法的。(后面会讲到)

3.构造器

子类是不能够继承父类的构造器,但是要注意的是,如果父类的构造器都是带有参数的,则必须在子类的构造器中显示地通过super关键字调用父类的构造器并配以适当的参数列表。如果父类有无参构造器,则在子类的构造器中用super关键字调用父类构造器不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造器。看下面这个例子就清楚了:

public class Demo {
    private String name;
    public Demo(){
        name="java";
}
    public Demo(String name) {
        this.name = name;
  
}
class Demo1 extends Demo{
    private String age;
    public Demo1(){
        age="123";
    }
    public Demo1(String name, String age) {
        this.name=name;
        this.age = age;
    }
    public Demo1(String age) {
        this.age = age;
    }

}

这段代码是没有问题的,但是如果把父类的无参构造去了,子类就要用关键字super,代码如下
在这里插入图片描述
用super关键字,如下:
在这里插入图片描述
4.super

super主要有两种用法:

1)super.成员变量/super.成员方法;

2)super(parameter1,parameter2…)

第一种用法主要用来在子类中调用父类的同名成员变量或者方法;第二种主要用在子类的构造器中显示地调用父类的构造器,要注意的是,如果是用在子类构造器中,则必须是子类构造器的第一个语句。

猜你喜欢

转载自blog.csdn.net/We_chuan/article/details/83585760