先来看一下下面这段代码:
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关键字在开发的时候使用还是很频繁的,当然它的使用也很灵活,往往不知道指向的是哪里。。所以在使用的时候要特别注意的。。