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(); } }