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.变量"的方式,表明此变量是属性。(可以参考构造器上面说的第③点)