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一下