【Java进阶二】理解继承

继承
面向对象三大特性:封装、继承和多态。继承是我们“复用”代码的途径之一。关于继承主要说明以下几点。

子类继承父类成员变量

当子类继承了某个类之后,便可以使用父类中的成员变量或者叫属性,但是并不是完全的继承父类的所有成员变量。
1、能够继承父类的public和protected成员变量,不能够继承父类的private成员变量
2、对于父类的包访问权限成员变量,如果子类和父类在同一个包下,则子类能够继承。否则,子类不能继承
3、对于子类可以继承的父类成员变量,如果在子类中出现了同名的成员变量,则子类会隐藏父类的成员变量,也就是父类属性和子类同名是使用的是子类属性。如果子类要访问父类的同名属性,则需要使用super关键字来进行引用。

子类继承父类方法

子类继承父类方法与成员变量类似。
1、能够继承父类的public和protected方法,无法继承private修饰的方法
2、对于父类的包访问权限方法,子类和父类同个包下,子类能够继承,否则无法继承
3、对于子类和父类方法同名,同样以子类为准,不过采用的是子类覆盖父类方法。若要调用父类同名方法需要通过关键字super引用

注意:隐藏和覆盖是不同的。隐藏式针对成员变量和静态方法的,而覆盖是针对普通方法的

  • 被隐藏的属性,在子类被强制转换成父类后(向上转型),访问的是父类中的属性
  • 被覆盖的方法,在子类被强制转换成父类后(向上转型),调用的还是子类自身的方法

构造器

构造器用于初始化赋值。子类是不够继承父类的构造器。如果父类的构造器都是带参的,则必须在子类的构造器中显示地通过super关键字调用父构造器。如果父类有无参数构造,则子类构造器不一定要有super调用父类的。如果没有使用super,系统自动调用父类无参构造。子类在初始化的时候会先调用父类构造器,在调用本身的构造器。

关于继承的很多好处就不说了,说说继承带来的不好的地方。《给程序员的151个建议》写到过慎用继承。
1、父类变化,子类就必须变化。
2、继承破坏了封装
3、继承是一种强耦合关系

是否我们就不给使用继承了呢?也不是。《Think in java》中说道:问一问自己是否需要从子类向父类进行向上转型。如果必须向上转型,则继承是必要的。但如果不需要,则应当好好考虑自己是否需要继承。
本人在项目中曾经想通过继承来复用一段公司框架内部的底层代码,但是思来想去还是不去继承,因为不需要用到转型,只是单纯的复用。一旦公司框架改变,那我这段代码很可能也就要调整。其实除了继承还有方法进行复用代码,那就是持有对象。这个就不详细说了。

你可能感兴趣的:(Java进阶,java,面向对象,继承)