java 继承extends 的相关知识点

 java只有单继承,不能多继承

  • 子类只能继承父类的非私有成员(成员变量、成员方法)
  • 子类不能继承父类的构造方法,但是可以通过super关键字访问父类的构造方法
  • 继承 要体现子类父类的 继承关系, ”is a“

当子类和父类有同名函数或变量,采用就近原则,子类有就不用父类的


 

 java 构造器的 构造方法调用顺序:

  构造方法的第一句总是: super(...) 来调用父类对应的构造方法。 所以流程上就是:先向上追溯到 Object 类,然后再一次向下执行类的初始化块和构造方法。直到当前子类


 

this/super 

采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突

this:代表当前对象的引用,谁来调用我,我就代表谁

super:代表当前对象父类的引用

 

父类没有无参构造方法,子类的构造函数中
  super()

  this()

注意:super(...) 或者 this(...) 必须出现在构造方法的第一条语句上


子类中所有的构造方法默认都会访问父类的无参构造方法

  因为子类会继承父类中的数据,可能还会使用父类的数据,所以要先完成父类数据的初始化

 

 1 class Test2_Extends {
 2     public static void main(String[] args) {
 3         Zi z = new Zi();
 4     }
 5     /*
 6     1,jvm调用了main方法,main进栈
 7     2,遇到Zi z = new Zi();会先将Fu.class和Zi.class分别加载进内存,再创建对象,当Fu.class加载进内存
 8     父类的静态代码块会随着Fu.class一起加载,当Zi.class加载进内存,子类的静态代码块会随着Zi.class一起加载
 9     第一个输出,静态代码块Fu,第二个输出静态代码块Zi
10     3,走Zi类的构造方法,因为java中是分层初始化的,先初始化父类,再初始化子类,所以先走的父类构造,但是在执行
11     父类构造时,发现父类有构造代码块,构造代码块是优先于构造方法执行的所以
12     第三个输出构造代码块Fu,第四个输出构造方法Fu
13     4,Fu类初始化结束,子类初始化,第五个输出的是构造代码块Zi,构造方法Zi
14     */
15 }
16 class Fu {
17     static {
18         System.out.println("静态代码块Fu");
19     }
20 
21     {
22         System.out.println("构造代码块Fu");
23     }
24 
25     public Fu() {
26         System.out.println("构造方法Fu");
27     }
28 }
29 
30 class Zi extends Fu {
31     static {
32         System.out.println("静态代码块Zi");
33     }
34 
35     {
36         System.out.println("构造代码块Zi");
37     }
38 
39     public Zi() {
40         System.out.println("构造方法Zi");
41     }
42 }

最后的输出如下:

 

posted @ 2019-06-24 16:43  gaoyang666  阅读(508)  评论(0编辑  收藏  举报