this和super的用法
this用于指代当前对象,super用于指代父类的内存空间的标识
this关键字
this代表其所在函数所属对象的引用。换言之,this代本类的对象引用
1、当成员变量和局部变量重名,可以用关键字this来区分,this就是所在函数所属对象的引用
2、对象调用了this所在的函数,this就代表哪个对象。一般方法调用默认加this
3、通过this在构造函数中调用其它构造函数的时候,只能定义在构造函数的第一行,因为初始化动作要先执行,否则会报错
package com.yan5;
//this
public class Test4 {
public static void main(String[] args) {
new A4(10);
}
}
class A4 {
String name;
private int age;
public A4() {
// this();
name="zhangsan";
System.out.println("A4无参构造器");
}
public A4(String name1) {
name=name1;
System.out.println("A4有一个string类型参数的构造器");
}
public A4(int k) {
// this(); //调用当前类的无参构造器,注意一定是另外一个构造器
this("zhangsan");//调用当前类的另外一个构造器
//注意:要求如果需要调用其它构造器,则this()必须是构造器种的第一句话
age=k;
System.out.println("A4有一个int类型参数的构造器");
}
public void pp() {
// this(); 不允许在非构造器种调用this()
}
}
class C4{
private String name;
public C4(String name) {
//当属性名称和局部变量的名称一致时,按照就近原则,直接使用的就是局部变量
System.out.println(name); //和属性无关
this.name=name;//this用于指代当前对象
}
public void setName(String name) {
System.out.println(name); //和属性无关
this.name=name;
}
public void setAge(String name1) {
this.name=name1; //this.可写可不写
}
public void pp() {
this.setAge("ddd"); //this用于表示当前对象,this.可写可不写
}
}
super关键字
当本类的成员和局部变量同名用this区分,当子父类的成员变量同名用super区分父类
当子父类中出现函数一模一样的情况,会运行子类的函数。这种现象,称为覆盖操作,这是函数在子父类中的特性。在子类覆盖方法中,继续使用被覆盖的方法可以通过 super.函数名 来获取
this()表示调用当前类中的另外一个构造器,()中可以带有参数;super()表示调用父类中的某个构造器,()中可以带有参数
package com.yan5;
//super
public class Test5 {
public static void main(String[] args) {
A5 aa = new B5(); //属性的覆盖并使用父类声明变量,创建子类对象会导致出现二义性,所以一般不用属性的覆盖
System.out.println(aa.id); //输出的是父类种的属性值
System.out.println(aa.getId());
System.out.println(((B5)aa).getId1());
aa.pp();
}
}
class A5 {
int id = 99;
protected String age="bbb";
public A5(int k) {
System.out.println("int类型参数构造器");
}
public int getId() {
return this.id;
}
public void pp() {
System.out.println("A5:"+this.id);
}
}
class C5{
public C5() {
super();
}
}
class B5 extends A5 {
String id = "zhangsan";
//在一个构造器方法种第一句话一定是super()或者this()
public B5() {
super(10);
// super();
}
public String getId1() {
return this.id;
}
public void pp() {
System.out.println(super.age);
System.out.println(age);
System.out.println("B5"+super.id); //super用于指代父类对象 super.id表示父类种被覆盖的属性
System.out.println("B5:"+this.id);
//访问被覆盖的父类种定义的方法
System.out.println("======================");
super.pp();
}
}
this()和super()
this()表示调用当前类中的另外一个构造器,()中可以带有参数
super()表示调用父类中的某个构造器,()中可以带有参数
特殊情况:
问题:父类已经定义了带参构造器后是否还有无参构造器?
没有,因为只有当不定义构造器时,系统才提供一个无参构造器。当自定义构造器时,系统不再提供无参构造器因为子类的构造器中没有显式调用父类构造器,所以子类构造器方法中第一句是 super() 表示调用父类中的无参构造器,但是父类中没有无参构造器,所以报错
this和super的三种用法:
1、从语义的角度上说, this 用于指代当前对象; super 用于指代父类对象2、 this() 表示调用另外一个构造器 ,super() 表示调用父类中的某个构造器, () 中的参数决定调用的是哪个构造器3、 this. 成员属性用于表示当前对象的某个成员,一般用于局部变量和属性名称一致的场景下。 super. 成员属性用于表示父类中定义的某个属性,一般用于子类中覆盖定义了某个父类属性的场景下。4、 this. 成员方法 () 用于表示当前对象的某个成员方法; super. 成员方法 () 用于表示当前类的父类中定义的某个成员方法,一般用于覆盖定义时【就近原则】。5、在 static 方法中不允许使用 this/super 之类关键字