首页 > 代码库 > 【小白的java成长系列】——this关键字
【小白的java成长系列】——this关键字
先来看一下下面这段代码:
package me.javen.oop; public class ThisDemo { public static void main(String[] args) { Dog dog = new Dog("小花", 10);//创建对象 System.out.println(dog); } } class Dog{ private String name; private int age; public Dog(){}//无参构造 public Dog(String name,int age){//有参构造 name = name; age = age; } @Override public String toString() {//重写Object中toString方法,前面Object类中讲解过 return "Dog [name=" + name + ", age=" + age + "]"; } }
运行结果为:
Dog [name=null, age=0]
看到没有,没有设置上去,实例化的时候,name和age属性的值没有设置上去....
分析:
我们从实例化过程下手:
Dog dog = new Dog("小花", 10);其实调用的是Dog中的有参构造,这个前面讲过的,没什么问题吧~
进入有参构造:
name = name;
age = age;
大家会很奇怪,这边不是已经赋值了吗~
问题:这两个name和age分别表示的是什么?
当然前面的name和age表示的是类的属性,后面的name和age表示的传递的参数呀。。错~~这两个name和age都是就近取的,都是表示传递的参数,因为属性名是一样的。
修改如下:
public Dog(String name,int age){ this.name = name;//特指当前类中的属性 this.age = age; }运行结果:
Dog [name=小花, age=10]
那this关键字的作用是啥呢?其实你只要这么理解就可以的,this表示当前,什么的当前?当然是类的当前,对象的当前~可能这句话不好理解。举例:this.name = name --> this.name表示的就是当前类的name属性。
当然除了表示类之外还可以表示方法,也是当前的方法~也可以表示对象。
表示当前对象:
package me.javen.oop; public class ThisDemo { public static void main(String[] args) { Dog dog = new Dog("小花", 10); dog.printDog();//此时方法里面的this表示的就是dog这个对象 } } class Dog{ private String name; private int age; public Dog(){} public Dog(String name,int age){ this.name = name;//特指当前类中的属性 this.age = age; } public void printDog() { System.out.print(this);//表示当前的对象 } @Override public String toString() {//重写Object中toString方法,前面Object类中讲解过 return "Dog [name=" + name + ", age=" + age + "]"; } }
运行结果:
Dog [name=小花, age=10]
表示当前的方法:
class Dog{ private String name; private int age; public Dog(){} public Dog(String name,int age){ this.name = name;//特指当前类中的属性 this.age = age; } public void printDog() { System.out.print(this);//表示当前的对象 } public void fun(){ this.printDog();//调用当前类的方法 } @Override public String toString() {//重写Object中toString方法,前面Object类中讲解过 return "Dog [name=" + name + ", age=" + age + "]"; } }
此外,this还能指向构造方法,对于构造方法的使用如下:
class Dog{ private String name; private int age; public Dog(){} public Dog(String name,int age){ this.name = name;//特指当前类中的属性 this.age = age; } public Dog(String name){ this(name, 2);//还能指向当前的构造方法,此语句必须放在构造方法首行 } public void printDog() { System.out.print(this);//表示当前的对象 } public void fun(){ this.printDog();//调用当前类的方法 } @Override public String toString() {//重写Object中toString方法,前面Object类中讲解过 return "Dog [name=" + name + ", age=" + age + "]"; } }
我们可以看到
public Dog(String name){
this(name, 2);//还能指向当前的构造方法,此语句必须放在构造方法首行
}
public Dog(String name,int age){
this.name = name;//特指当前类中的属性
this.age = age;
}
这个构造方法。
需要注意的一点是:
如果使用了this来调用构造方法,则this的这条语句必须放在构造方法的首行。
下面是错误的写法:
讲到这边,基本知识都说完了,this关键字在开发的时候使用还是很频繁的,当然它的使用也很灵活,往往不知道指向的是哪里。。所以在使用的时候要特别注意的。。