super
在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用。
所以,super关键字有以下用法:
-
1, 引用: 父类对象 访问父类被遮盖的属性或调用父类被覆盖的方法。
super. :调用父类中属性或者方法
super.父类属性名:调用父类中的属性
super.父类方法名:调用父类中方法 -
2,super():用在子类的构造方法中,能够决定jvm在去构造父类对象时,调用父类哪一个构造方法
super(); 调用父类的无参构造方法
super(实参);调用父类的有参构造方法super必须放在构造方法中的第一个语句
如果一个构造方法的第一句话,不是this(。。。),也不是super(。。。),
系统会默认添加 super(); -
super常常用来把构造参数传给父类,去设置父类的属性;
-
构造方法常常用来设置属性,给属性赋值。
构造方法中无参构造方法很重要,要尽量保证每个类都写一个无参构造方法
this关键字:
this关键字两个重要用法:
- 1, 引用 当前对象 当实例变量和局部变量命名冲突的时候,用this,表示实例变量
this.属性名 表示当前对象的属性
this.方法名(实参); 表示调用当前对象的方法
用在构造方法或者成员方法中
注意:当局部变量和成员变量 发生冲突时,使用this.进行区分
若不冲突,写不写this.都可以
- 2, 用在构造方法中 this(参数1,参数2,….) 调用本类的其他构造方法
必须是构造方法中的第一个语句,所以this只能用一次调用其他构造方法(同super)
this();调用当前对象的无参构造方法
this(实参); 调用当前对象的有参构造方法
只能定义在构造方法内,只能定义在有效代码第一行
注意:避免构造方法的递归调用
下面程序清晰讲明了super,this关键字的区别和作用:
class TestSuper{
public static void main(String[] args) {
new B();//调用B 的无参构造方法
System.out.println("--------------");
new B("abcd");
}
}
class A{
private String name;
public A(){
System.out.println("A()");
}
public A(String str){
this.name = str;
System.out.println("A(String)"+name);
}
}
class B extends A{
public B(){
super(); //默认添加,可写可不写,调用父类无参构造方法
System.out.println("B()");
}
public B(String str){
super(str);
System.out.println("B(String)");
}
}
//测试super关键字和this关键字的使用与区别
class Super{
protected int a= 10;
public void method(){
System.out.println("Super method()");
}
}
//继承父类Super
class Sub extends Super{
int a = 20;
//方法 的覆盖
public void method(){
System.out.println("Sub method()");
}
public void print(){
int a = 30;
System.out.println(a);//30,局部变量优先
System.out.println(this.a);//20 引用当前实例对象
System.out.println(super.a);//10 父类引用
method();//sub method();
super.method();//Super method();
}
}