java super关键字及子类父类的执行顺序

super关键字作用:

  1. 主要存在于子类方法中,用于指向子类对象中父类对象。
  2. 访问父类的属性。
  3. 访问父类的函数。
  4. 访问父类的构造函数。

super相当于父类的构造方法,用来实例化父类对象,并且放在子类构造函数的第一行,当实例化子类对象时,先执行父类构造函数,实例化一个父类对象,再实例化一个子类对象。

Father:

package com.company;

public class Father {
    private String Name;

    public Father(){
        System.out.println("I am Father");
    }
    public  Father(int id){
        System.out.println("I am Father and id ="+id);
    }
}

Son:

	package com.company;

public class Son  extends Father{
    private  String Name;

    public Son(){
        //super();隐式语句
        System.out.println("I am Son");
    }

}

main:

package com.company;

public class Main {

    public static void main(String[] args) {
	Son son=new Son();
    }
}

结果:的确是先执行父类构造函数再执行子类构造函数
在这里插入图片描述
其实就是说如果我们想实例化一个子类对象,必须先实例化一个父类对象。这样是合理的。比如有一个汽车类(Car),定义了汽车的基本属性,车身框架,车轮,引擎等属性;一个子类超级跑车(SuperCar)继承它,子类有导航系统,尾翼等属性。这是我们想实例化一个超级跑车类(SuperCar)对象,如果不先实例化一个汽车类(Car)对象,那么实例化的超级跑车连车轮,引擎,车身框架都没有,就只有尾翼,导航系统,很显然,这不叫一辆车。所以先实例化父类对象是为了让子类能够获得父类的属性和方法。

上面了解后,再来深入了解一下,本人亲自做过的某个公司的一道笔试题:
父类静态代码块,父类静态变量,父类非静态变量,父类构造函数,子类静态代码块,子类静态变量,子类非静态变量,子类构造函数的执行顺序?
直接代码测试:
Test:

package com.company;

public class Test {
    public Test(String name){
        System.out.println(name);
    }
}

Father:

package com.company;

public class Father {
    //父类非静态变量
    public Test notstatic=new Test("我是父类非静态变量");

    //父类静态变量
    public static Test statictest=new Test("我是父类静态变量");

    //父类静态代码块
    static {
        Test test1=new Test("我是父类静态代码块");
    }
    //父类构造函数
    public Father(){
        System.out.println("我是父类构造函数");
    }

}

Son:

package com.company;

public class Son  extends Father{
    //子类非静态变量
   public Test notstatictest=new Test("我是子类非静态变量");
    //子类静态变量
    public static Test statictest=new Test("我是子类静态变量");
    //子类静态代码块
    static {
        Test test1=new Test("我是子类静态代码块");
    }

    //子类构造函数
    public Son(){
        System.out.println("我是子类构造函数");
    }

}

main:

package com.company;

public class Main {

    public static void main(String[] args) {
	Son son=new Son();
    }
}

结果:
在这里插入图片描述
从中可知:

  1. 先执行父类的静态变量和静态代码块,并且这两个的执行顺序没有先后之分,取决于代码的先后顺序。
  2. 然后执行子类的静态变量和静态代码块。也是没有先后之分。
  3. 执行父类的非静态变量
  4. 执行父类的构造函数。
  5. 执行子类的非静态变量。
  6. 执行子类的构造函数。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一. 选择题(共50题,每题2分,共100分。多选题选不全或选错都不得分。) 1. 以下属于面向对象的特征的是(C,D)。(两项) A) 重载 B) 重写 C) 封装 D) 继承 2. 以下代码运行输出是(C) public class Person{ private String name=”Person”; int age=0; } public class Child extends Person{ public String grade; public static void main(String[] args){ Person p = new Child(); System.out.println(p.name); } } A) 输出:Person B) 没有输出 C) 编译出错 D) 运行出错 3. 在使用super 和this关键字时,以下描述正确的是(A) A) 在子类构造方法使用super()显示调用父类的构造方法super()必须写在子类构造方法的第一行,否则编译不通过 B) super()和this()不一定要放在构造方法内第一行 C) this()和super()可以同时出现在一个构造函数中 D) this()和super()可以在static环境中使用,包括static方法和static语句块 ...... 一、 编写程序实现对给定的10个整数从大到小的顺序排列。 二、 输入3个正数,判断能否构成一个三角形 三、 编写程序,从键盘输入一个0~99999之间的任意数,判断输入的数是几位数? 四、 编写程序,给定一个学生成绩,给出相应等级: 90~100优秀80~89良好70~79中等60~69及格0~59不及格 ...... 七、 猴子吃桃问题。猴子第一天摘下若干个桃子,当时就吃了一半,还不过瘾,就又吃了一个。第二天又将剩下的桃子吃掉一半,又多吃了一个。以后每天都吃前一天剩下的一半零一个。到第10天在想吃的时候就剩一个桃子了,求第一天共摘下来多少个桃子?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值