自己总结的打算做博客的, 拿出来分享。
1.
( 1 ).在子类构造方法中要调用父类的构造方法,用“super(参数列表)”的方式调用,参数不是必须的。
( 2 ).但是父类是有参数的构造函数时,子类一定要有与之对应构造函数,因为子类第一句默认的是super();
( 3 ).同时还要注意的一点是:“super(参数列表)”这条语句只能用在子类构造方法体中的第一行。
( 4 ).无论子类构造函数怎么互相调用,子类总有一个构造函数用super关键字访问父类构造函数,否则编译失败
class test1
{
public static void main(String[] args)
{
B b = new B(3);
b.method();
}
}
class A
{
int i;
A(int i)
{
this.i=i;
}
void show()
{
System.out.println("haha"+i);
}
}
class B extends A
{
int j;
B(int j)
{
this();//在这里要么是this();要么是super();它们都必须放在第一句。
this.j=j;
//super(j);//传给了父类,然后父类去初始化,在本类中j没有初始化 还是默认值:0。
//this.j=j;//打开this.j=j; 此时在本类中初始化j,所以j=3.
}
B()
{
super(3);//无论怎样子类总有一个构造函数访问父类构造函数,否则编译失败
}
void method()
{
super.show();
System.out.println(this.j);
}
}
/*
haha3
3
*/
=================================================================================================================================
2.当子类方法中的局部变量或者子类的成员变量与父类成员变量同名时,
也就是子类局部变量覆盖父类成员变量时,用“super.成员变量名”来引用父类 成员变量。
当然,如果父类的成员变量没有被覆盖,也可以用“super.成员变量名”来引用父类成员变量,不过这是不必要的。
class test1
{
public static void main(String[] args)
{
B b = new B(3);
b.method();
}
}
class A
{
int i;
A(int i)
{
this.i=i;
}
void show()
{
System.out.println("haha"+i);
}
}
class B extends A
{
int i;
B(int i)
{
this();//在这里要么是this();要么是super();它们都必须放在第一句。
this.i=i;
//super(j);//传给了父类,然后父类去初始化,在本类中j没有初始化 还是默认值:0。
//this.j=j;//打开this.j=j; 此时在本类中初始化j,所以j=3.
}
B()
{
super(3);//无论怎样子类总有一个构造函数访问父类构造函数,否则编译失败
//super.i=6;修改父类成员变量。
System.out.println(i);
System.out.println(super.i);
}
void method()
{
super.show();
System.out.println(this.i);
}
}
/*
0
3
haha3
3
*/
==================================================================================================================================
3.当子类的成员方法覆盖了父类的成员方法时,也就是子类和父类有完全相同的方法定义(但方法体可以不同),
此时,用“super.方法名(参数列表)”的方式访问父类的方法。
class test2
{
public static void main(String[] args)
{
B b = new B(3);
b.show();
}
}
class A
{
int i;
A(int i)
{
this.i=i;
}
void show()
{
System.out.println("haha"+i);
}
}
class B extends A
{
int i;
B(int i)
{
this();//在这里要么是this();要么是super();它们都必须放在第一句。
this.i=i;
//super(j);//传给了父类,然后父类去初始化,在本类中j没有初始化 还是默认值:0。
//this.j=j;//打开this.j=j; 此时在本类中初始化j,所以j=3.
}
B()
{
super(3);//无论怎样子类总有一个构造函数访问父类构造函数,否则编译失败
//super.i=6;
//System.out.println(i);
//System.out.println(super.i);
}
void show()
{
super.show();//调用父类方法
}
}
===================================================================================================================================
第四、super关键字只能用在类体中非静态部分,比如构造函数与成员方法中,若在main函数中调用或静态方法中编译会出错,
报Cannot use super in a static context的错误!
super 和this 谁调用他,他就代表谁,而调用是在对象建立以后才执行的,但是,静态是随着类的加载而加载的,先于对象产生,
所以在静态方法中调用会出错。
|