- 看程序写结果1
- class Fu{
- public int num = 10;
- public Fu(){
- System.out.println("fu");
- }
- }
- class Zi extends Fu{
- public int num = 20;
- public Zi(){
- System.out.println("zi");
- }
- public void show(){
- int num = 30;
- System.out.println(num);
- System.out.println(this.num);
- System.out.println(super.num);
- }
- }
- class Test1_Extends {
- public static void main(String[] args) {
- Zi z = new Zi();
- z.show();
- }
- }
- 看程序写结果2
- class Fu {
- static {
- System.out.println("静态代码块Fu");
- }
- {
- System.out.println("构造代码块Fu");
- }
- public Fu() {
- System.out.println("构造方法Fu");
- }
- }
- class Zi extends Fu {
- static {
- System.out.println("静态代码块Zi");
- }
- {
- System.out.println("构造代码块Zi");
- }
- public Zi() {
- System.out.println("构造方法Zi");
- }
- }
- Zi z = new Zi(); 请执行结果。
复制代码
结果1:
fu
zi
30
20
10
分析1:
子类空参构造方法默认调用父类的空参构造方法;
子类中有 与 父类中成员变量 同名的变量时 ,调用此变量默认采用就近原则;
使用this. 调用子类的成员变量;
调用super.调用父类的成员变量;
结果2:
静态代码块Fu
静态代码块Zi
构造代码块Fu
构造方法Fu
构造代码块Zi
构造方法Zi
分析2:
创建子类对象时,jvm会先后把父类的class文件和子类的class文件加载进内存,加载的同时会执行静态代码块;
然后调用构造方法创建对象,java中是分层初始化:先初始化父类,再初始化子类;
所以先走父类构造方法,发现有构造方法就先执行,再执行构造方法,随后执行子类的构造
其实只要记住一句话:现有父再有子!
|
|