参考文章:
https://blog.csdn.net/qq_33322074/article/details/86030836
https://blog.csdn.net/HD243608836/article/details/81567101
https://blog.csdn.net/zhaozhirongfree1111/article/details/77962184
构造方法在new的时候自动执行。且只执行一次。new一次执行一次
每个类都有构造方法,即使不写也有,编译时javac会自动检查类是否有构造方法,如果有,就执行,没有就自动添加一个
如果父类有含参构造方法,则子类也必须添加含参构造方法
如果父类没有含参构造方法,子类无需添加构造方法
this在构造方法之间的应用
super在构造方法中的应用
首先要明白super关键字的作用:
1、super是调用父类的成员方法或成员变量。
但是还有一个问题:.
也就是说子类对象中,父类的构造方法会先执行。那么为什么要执行父类构造方法呢?
假设,创建了一个父类,含有一个成员属性a=1;含有一个构造方法,将a=5;。因为如果子类创建的对象调用父类的成员变量a时,在不添加super()时,会得到a=1;如果添加super()就会得到a=5;我们都知道,构造方法在创建对象时执行,a应该等于5,故如果不调用super()就会得到错误的值。
2、super()在构造方法中是调用父类构造方法的意思。
当创建子类对象时,父类对象先进内存。这样子类才能自动拥有父类的成员。
3、子类的构造器,无论重载多少个,第一行必须是super();当你不写时表示空参super();是否写参数,要根据父类决定,父类有参数,那么子类的super()必须有参数。
4、构造方法无法继承,自然也没有重写这个概念。
5、super()语句必须是构造方法的第一行代码。
总结一下:其实这些内容说白了,就是在说一句话。
super是父类对象引用,this是本类对象引用。super(),this()都必须放在构造方法的第一行,super()和this()绝不能一块用,super(),this()无参时可以省略不写。
会报错:
快捷键:ctrl+T 用于打开继承关系图。
子类的构造函数 必须要 super() 吗?
不是必须,是自动
必须的情况:————指明调用哪个 含参构造函数
public class Father { public String name; public Father(String name) { this.name = name; } } public class Son extends Father{ public Son(String name) { super(name);//必须调用,否则他会默认调用父类的无参构造函数,而父类的无参构造函数已经被有参的覆盖,所以找不到 }
this()只能用在构造函数中,且它必须是第一行语句?
1.在构造函数中,如果你不指定构造器之间的调用关系,那么编译器会给你加上super();目的是在初始化当前对象时,先保证了父类对象先初始化。所以,你指定了构造函数间的调用,那么this()必须在第一行,以保证在执行任何动作前,对象已经完成了初始化。
构造函数只能被构造函数调用,因为对象只会初始化一次。
2.解答这个问题,首先要明确一下构造方法和普通成员方法的区别。
类似this()和super()这样的方法被称为构造方法,顾名思义,他的作用就是在JVM堆中构建出一个指定类型的对象,如果你调用了两个这种形式的方法,岂不是代表着构建出了两个对象。
同理,为了避免构建出两个对象这种问题的出现,Java在编译时对这种情况做了强校验,用户不能再同一个方法内调用多次this()或super(),同时为了避免对对象本身进行操作时,对象本身还未构建成功(也就找不到对应对象),所以对this()或super()的调用只能在构造方法中的第一行实现,防止异常。
在普通的成员方法中,如果调用super()或者this(),你是想要重新创建一个对象吗?抱歉Java为了保证自身对象的合理性,不允许你做这样的操作。
this()和super()为构造方法:
作用是在JVM堆中构建出一个对象
- 因此避免多次创建对象,同一个方法内只能调用一次this()或super()。
- 同时为了避免操作对象时对象还未构建成功,需要this()和super()的调用在第一行实现【以此来创建对象】,防止异常。