this和super关键字

1 篇文章 0 订阅
1 篇文章 0 订阅

this和super关键字

  • this用于指代当前对象
  • super用于指代父类对象
  • this()表示调用另一个构造器,super()表示调用父类的某个构造器,()中的参数决定调用的是那个构造器
public class A{
    public A(){
    //调用A(String)这个构造方法
    this("aaaa")//调用当前类中的另一个构造器
    }
    public A(String a){
    System.out.println(a);
    }
}

//其他写法
public A(String a){
    this();//在当前类中调用另一个构造方法的语句必须是构造方法中的第一句
    System.out.println(a);
    }
//错误示范
public A(String a){
    if(a!=null)
    this();//语法报错
    System.out.println(a);
}
//定义构造器时,如果构造方法中的第一句不是this()或者super()时,默认第一句就是super()表示调用父类的构造器
public class extends A{
    public B(){
    super();//表示调用父类的无参构造器
    }
}
//父类
public class A(){
    private A(){}
    public A(int k){}
}
//子类
public class B extends A{
    public B(){
    super(123);//如果不写则语法报错,因为默认调用父类的无参构造器,但是弗雷德无参构造为private,子类不能访问
    //super(123)表示调用父类中的带参构造器public A(int k)
    }
}
  • this.成员属性用于表示当前对象的某个成员,一般用于局部变量和属性名称一致的场景下。
  • super.成员属性用于表示父类中定义的某个属性,一般用于子类中覆盖了某个父类属性的场景
public class A{
    private String name;.
    public void setName()String name){
    //局部变量名name和属性name重名,可以使this.name表示这个属性,按照就近原则,当前类中的name是局部变量
         this.name=name;
    }
}
public class A{
    String name = "name";
}
public class B extends A{
    private int name=123;//和父类中的属性name重名,按照就近原则,当前类中的name就是子类中声明的name,而不是父类中声明的name
    
    public void pp(){
        System.out.println("子类中声明的name:"+name);//也可以写成this.name
        System.out.println("父类中声明的name:"+super.name);//使用super.name引用父类中声明的name属性,还需要考虑范围限定词的问题
    }
}
  • this.成员方法()用于表示当前对象的某个成员方法
  • super.成员方法()用于表示当前类的父类中定义过的耨个成员方法,一般用于覆盖定义(就近原则)
public class A {
    public void pp() {
        System.out.println("this is A class");
    }
}

public class B extends A {
    public void pp() {//子类中定义的方法签名和父类中的一致,实际上就是方法的覆盖
        System.out.println("this is B class");
    }
    public void cc() {
    // this.pp();//调用B类中声明的方法pp
	    System.out.println("this is B.cc()");
		super.pp();//调用父类中被子类同名方法覆盖的方法,注意范围限定词
	}
    public static void main(String[] args) {
        new B().cc();
    }
}
  • 在static方法中不允许使用this或super之类的关键字
public class A {
    protected Long id;
	public void pp() {
		System.out.println("this is A class");
	}
	public static void main(String[] args) {
		// System.out.println(this.id);//典型的语法错误,在static方法中不允许出现this或者super
		A a=new A();
		System.out.println(a.id);
	}
}
//子类
public class B extends A {
	private String id;
	public void show() {
		System.out.println(super.id);
	}
public static void main(String[] args) {
	B b=new B();
	System.out.println(b.id);
	b.show();
}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值