java this关键字的使用

java this关键字的使用

this调用构造器

①可以显式的使用"this(形参列表)"方式,调用本类中指定的其他构造器

class Person{
    private String name;
    public Person() {
        this("逆天的顺");
    }
    public Person(String name) {
   		this.name=name;
    }
}

②构造器中不能通过"this(形参列表)"方式调用自己。

class Person{
    private String name;
    public Person() {
        this("逆天的顺");
    }
    public Person(String name) {
        this();
    }
}

此处的Person()中调用了Person(String),而Person(String)中又调用了Person(),编译器会报错。

③当构造器的形参和类的属性相同时,必须使用"this.变量"的方式,表明此变量是属性。

class Person{
    private String name;
    public Person(String name) {
        name=name;
    }
}

有意思的是编译器不会报错,但运行以下代码时分辨不出哪个是属性,哪个是参数,如 以下代码当打印getName()会输出null(说明没有将"逆天的顺"赋值成功)

public class PersonTest {
    public static void main(String[] args) {
        Person person=new Person("逆天的顺");
        System.out.println(person.getName());//输出null;
    }
}
class Person{
    private String name;
    public Person(String name) {
        name=name;
    }
    public String getName() {
        return name;
    }
}

④如果一个类中有n个构造器,则最多有 n - 1构造器中使用了"this(形参列表)"。

先说明一点:”Java在初始化子类时必须先初始化父类“ 而怎么在初始化子类之前先初始化父类呢?那便是通过super()来调用父类构造器而通知父类。

那又有人问了:”不是说只能使用this()或者super()之中的一个吗?,那我用了this(),那不是不能使用super()了吗?,又怎么通过super()先初始化父类呢?“

class Person{

    public Person() {
    }
}
class Man extends Person{

    private String name;
    public Man(String name) {
        this();//调用Many()这个空参构造器
        this.name = name;
    }

    public Man() {diao
        //编译器将自动加上 super();
    }
}

以上代码"Man(String)“构造器通过this();调用了空参构造器"Man()”,虽然"Man()"没有声明super();但是构造器在没有声明this(),或super(),时编译器将自动加上 super();

而Man()这个构造器已经不能再使用this()关键字,因为这两个构造器不能同时调用对方,如上原因请看第②点。

总结一点:如果一个类中有n个构造器,则最多有 n - 1构造器中使用了this(形参列表)最后一个被调用的构造器便一定会有super()关键字(有可能没有写出来但/编译器将自动加上 super()😉"

代码中构造器"Man(String)"调用"Man()"而构造器"Man()"通过隐藏的super()
来访问父类的构造器,从而达到先初始化父类的目的,

⑤ "this(形参列表)"和"super()"必须声明在当前构造器的首行,
前面说过:必须先初始化父类才能初始化子类,

class Person{
    public Person() {
 }
 
class Man extends Person {

    private String name;
    public Man(String name) {
        this.name = name;
        this();//调用Many()这个空参构造器
    }

    public Man() {
        //编译器将自动加上 super();
    }
}

在Idea编写这个代码时我的Idea已经报错(各位大佬知道在哪里吗?)
哈哈,相信这个问题每一个大佬都知道(太弱鸡的问题了0.0)

public Man(String name) {
this.name = name;
this();//调用Many()这个空参构造器
}
里当我们通过构造器Many(String)创建一个对象时 ,这里先给属性name赋值,(代码执行是从第一行到下一行的)那么我先赋值说明我的就先将Man类初始化好了,再到第二行通过this();调用空参构造器——>然后Man()通过隐藏的super()构造器通知父类初始化,这里没有把this():放在第一行,导致了Man类先初始化,Person类后初始化,
违背了:必须先初始化父类才能初始化子类。所以this(),super()必须放第一行的原因就是防止先初始化子类。

我觉得通过"this(形参列表)"调用其它构造器,起到传递的作用,总会有最后一个被调用的构造器有super()去调用父类的构造器;

this调用方法(非构造方法)

①在类的方法中,我们可以使用"this.属性"或"this.方法"的方式,调用当前对象属性或方法。但是, 通常情况下,我们都择省略"this."。

class Person{
    public void sleep(){
        System.out.println("睡觉");
        this.eat();
    }
    public void eat(){
        System.out.println("吃饭");
    }
}

上面的this.eat();这里this.可以省略。
②构造器可以调用方法、但方法(非构造方法)不可以调用构造器

③当方法的形参和类的属性相同时,必须使用"this.变量"的方式,表明此变量是属性。(可以参考构造器上面说的第③点)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值