2019-03-07 Java super
2019-03-07 本文已影响0人
yangsunior
super
-
super 代表一个父类空间。
-
当本类的成员和局部变量同名用this区分;
当子父类中的成员变量同名用super区分父类。 -
问:子类构造对象时发现访问子类构造函数时,父类也运行了,为什么?
原因是:在子类的构造函数中第一行有一个默认的隐式语句。 super();
子类的实例化过程:子类中所有的构造函数默认都会访问父类中的空参数的构造函数。 -
问:为什么子类实例化的时候要访问父类中的构造函数呢?
子类继承了父类,获取到了父类中内容(属性)。在使用父类内容之前,要先看父类是如何对自己的内容进行初始化的。
所以,子类在构造对象时必须访问父类中的构造函数。 -
问:子类的构造函数中加入了super()语句
如果父类中没有定义空参数构造函数,那么子类的构造函数必须用super明确要调用父类中哪个构造函数。同时子类构造函数中如果使用this调用了本类构造函数时,那么super就没有了,因为super和this都只能定义第一行。所以只能有一个。注:supre语句必须要定义在子类构造函数的第一行。因为父类的初始化动作要先完成。
super实例代码分析
1. 子类默认使用super() 调用父类构造器
public class AJavaTest{
public static void main(String args[]) {
new AJavaTestZi();
}
}
class AJavaTestFu {
int num;
AJavaTestFu() {
num = 10;
System.out.println("Fu 001: " + num);
}
AJavaTestFu(int num) {
System.out.println("Fu 002: " + num);
}
}
class AJavaTestZi extends AJavaTestFu {
int num;
AJavaTestZi()
{
// super();//调用的就是父类中的空参数的构造函数。
System.out.println("AJavaTestZi 001");
}
}
OUTPUT:
Fu 001: 10
AJavaTestZi 001
2. this()
public class AJavaTest{
public static void main(String args[]) {
new AJavaTestZi(25);
}
}
class AJavaTestFu {
int num;
AJavaTestFu() {
num = 10;
System.out.println("Fu 001: " + num);
}
AJavaTestFu(int num) {
System.out.println("Fu 002: " + num);
}
}
class AJavaTestZi extends AJavaTestFu {
int num;
AJavaTestZi()
{
// super();//调用的就是父类中的空参数的构造函数。
System.out.println("AJavaTestZi 001");
}
AJavaTestZi(int x)
{
this();
System.out.println("AJavaTestZi 002: "+x);
}
}
OUTPUT:
Fu 001: 10
AJavaTestZi 001
AJavaTestZi 002: 25
3. 将this()改为super()
public class AJavaTest{
public static void main(String args[]) {
new AJavaTestZi(25);
}
}
class AJavaTestFu {
int num;
AJavaTestFu() {
num = 10;
System.out.println("Fu 001: " + num);
}
AJavaTestFu(int num) {
System.out.println("Fu 002: " + num);
}
}
class AJavaTestZi extends AJavaTestFu {
int num;
AJavaTestZi()
{
// super();//调用的就是父类中的空参数的构造函数。
System.out.println("AJavaTestZi 001");
}
AJavaTestZi(int x)
{
super();
System.out.println("AJavaTestZi 002: "+x);
}
等同于
AJavaTestZi(int x)
{
System.out.println("AJavaTestZi 002: "+x);
}
}
OUTPUT:
Fu 001: 10
AJavaTestZi 002: 25
4. 将super()改为super(30)
public class AJavaTest{
public static void main(String args[]) {
new AJavaTestZi(25);
}
}
class AJavaTestFu {
int num;
AJavaTestFu() {
num = 10;
System.out.println("Fu 001: " + num);
}
AJavaTestFu(int num) {
System.out.println("Fu 002: " + num);
}
}
class AJavaTestZi extends AJavaTestFu {
int num;
AJavaTestZi()
{
// super();//调用的就是父类中的空参数的构造函数。
System.out.println("AJavaTestZi 001");
}
AJavaTestZi(int x)
{
super(30);
System.out.println("AJavaTestZi 002: "+x);
}
}
OUTPUT:
Fu 002: 30
AJavaTestZi 002: 25
父类无参构造器不会再被调用。