super关键字小结(构造方法的执行是不是一定会创建对象?)

1.父类

public class Person {

    private String name = "李四";

    private int age;

    public Person() {
        System.out.println("Person的构造方法执行了!");
        System.out.println(this.getClass().hashCode());
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

2.子类

public class Student extends Person {

    private double mark;

    private int num;

    private String name = "赵六";

    public Student() {
        // 系统会默认有一个super();
        super();
        System.out.println("Student的构造方法执行了");
        System.out.println(this.getClass().hashCode());
    }

    public Student(double mark, int num) {
        // super可以用在构造函数中,为了代码的重复利用,还可以初始化从父类继承过来的属性
        super("张三", 10);
        this.mark = mark;
        this.num = num;
    }

    public void study() {
        System.out.println(super.getName() + "在学习!");
    }

    // ==================================================================

    public double getMark() {
        return mark;
    }

    public int getNum() {
        return num;
    }

    public void setMark(double mark) {
        this.mark = mark;
    }

    public void setNum(int num) {
        this.num = num;
    }
}

3.测试类:

public class Test {
    public static void main(String[] args) {
        /**
         * 在创建子类对象的时候会先调用父类的构造方法
         * 调用父类的构造方法仅仅是为了给继承过来的父类属性初始化而已,并不会创建父类对象!
         */
        Student student1 = new Student();
        Student student2 = new Student(100.0, 001);
        student2.study();
    }
}

在此,我也翻了很多论坛,调用构造方法并不一定会创建对象,new 的时候才一定会创建对象,,也就是构造方法的执行不一定会创建对象

super跟this不同,this是一个引用,是一个地址,而super仅仅代表父类的特征,特征,特征

===================================================================================

更新时间:2017年12月21日22:06:48 ------->构造方法的执行并不一定会创建对象例证:

1.抽象父类:

public abstract class AbstractObject {

    public AbstractObject() {
        System.out.println("抽象类的构造方法执行了!");
    }

}

2.子类:

public class SomeObject extends AbstractObject {

    public SomeObject() {
        System.out.println("子类的构造方法执行了!");
    }
    
}

3.测试类:

public class Test01 {

    public static void main(String[] args) {
        
        // 抽象类无法new对象
//        AbstractObject obj = new AbstractObject();
        SomeObject obj = new SomeObject();

    }

}

4.执行结果:

抽象类的构造方法执行了!
子类的构造方法执行了!

结论:众所周知抽象类是不能够创建对象的,可见父类的构造方法执行了,但是不会创建父类的对象,突发奇想,特来mark一下

原文地址:https://www.cnblogs.com/zhangjianbing/p/8072821.html