我们用继承来解决代码的复用性
继承的基本介绍和示意图
继承可以解决代码复用,让我们的编程更加靠近人类思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中 抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通extends 来 声明继承父类即可。画出继承的示意图
继承的基本语法
继承的细节
-
子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问, 但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问
-
子类必须调用父类的构造器, 完成父类的初始化
-
当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无 参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过
-
如果希望指定去调用父类的某个构造器,则显式的调用一下 : super(参数列表)
-
super 在使用时,必须放在构造器第一行(super 只能在构造器中使用)
-
super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
-
java 所有类都是 Object 类的子类, Object 是所有类的基类.
-
父类构造器的调用不限于直接父类!将一直往上追溯直到 Object 类(顶级父类)
-
子类最多只能继承一个父类(指直接继承),即 java 中是单继承机制。
-
不能滥用继承,子类和父类之间必须满足 is-a 的逻辑关系
package com.use.extends01; //父类 public class Base { public int n1 = 100; protected int n2 = 200; int n3 = 300; private int n4 = 400; public Base() { //无参构造器 System.out.println("父类Base()构造器被调用..."); } public void test100() { System.out.println("test100()"); } protected void test200() { System.out.println("test200()"); } void test300() { System.out.println("test300()"); } private void test400() { System.out.println("test400()"); } //父类 提供了一个公共的方法,返回了n4 public int getN4() { return n4; } public void getTest400(){ test400(); } } package com.use.extends01; //子类 public class Sub extends Base { public Sub(){ //构造器 super(); //默认调用父类的无参构造器 System.out.println("子类Sub()构造器被调用..."); } public void test1(){ System.out.println("n1=" + n1 + "n2=" + n2 + "n3=" + n3 + "n4=" + "n4是私有不能直接访问"); test100(); test200(); test300(); //test400() 方法不能直接去访问 System.out.println("n4=" + getN4()); getTest400(); } } package com.use.extends01; public class Test { public static void main(String[] args) { Sub sub = new Sub(); sub.test1(); } }
继承的本质分析
public class theory { public static void main(String[] args) { Son son = new Son(); //要按照查找关系来返回信息 /* 1.首先看子类是否有该属性 2.如果子类有该属性,并且可以访问,则返回信息 3.如果子类没有该属性,依次往上一级找,直到Object */ System.out.println(son.name); //返回 大头儿子 System.out.println(son.age); //返回 39 System.out.println(son.hobby); //返回 旅游 } } class GrandPa{ String name = "大头爷爷"; String hobby = "旅游"; } class Father extends GrandPa { String name = "大头爸爸"; int age = 39; } class Son extends Father{ String name = "大头儿子"; }