由于这里的 name 和 age 都是方法中的参数,赋值时属性并不是明确地被指出,因此这里不使用 this 指定的话会优先就近的属性赋值。
public Person(String name,int age){ name = name; age = age; }比如这里的name = name;,这里的赋值其实是将public Person(String name,int age)里的参数name 赋值给了name ,这就导致了 类 Person 里的属性 name 并没有进行赋值操作。
如果改成下面这样也可以避免这类错误:
public Person(String n,int a){ name = n; age = a; } class Person{ private String name; private int age; public Person(String name,int age){ this.name = name; //明确为类中的 name 属性赋值 this.age = age; //明确表示为类中的 age 属性赋值 } public String getInfo(){ return "姓名:" + name + ", 年龄:" + age; } } public class Test{ public static void main(String[] args) { Person per = new Person("Java",33); // 调用构造实例化对象 System.out.println(per.getInfo()); } }如果一个类中有多个构造方法的话,也可以利用 this 关键字互相调用
class Person{ private String name; private int age; public Person(){ System.out.println("一个新的 Person 对象被实例化。"); } public Person(String name,int age){ this(); // 在此处调用 Person 类中的无惨构造方法 this.name = name; this.age = age; } public String getInfo(){ return "姓名:" + name + ", 年龄:" + age; } } public class Test{ public static void main(String[] args) { Person per = new Person("Java",33); // 调用构造实例化对象 System.out.println(per.getInfo()); } }使用 this 调用方法必须也只能放在构造方法的第一行
此外,对于 this 调用构造方法的时候一定要留一个构造方法作为出口,即程序中至少存在一个构造方法是不使用 this 调用其他构造方法的
class Person{ private String name; private int age; public Person(){ this("Python",30); // 此处为错误的代码 System.out.println("一个新的 Person 对象被实例化。"); } public Person(String name){ this(); } public Person(String name,int age){ this(name); // 在此处调用 Person 类中的无惨构造方法 this.name = name; this.age = age; } public String getInfo(){ return "姓名:" + name + ", 年龄:" + age; } } public class Test{ public static void main(String[] args) { Person per = new Person("Java",33); // 调用构造实例化对象 System.out.println(per.getInfo()); } }this 最重要的特点就是表示当前对象,在 Java 中当前对象就是指当前正在调用类中方法的对象。
class Person{ public String getInfo(){ System.out.println("Person 类 --> " + this); //直接打印 this return null; } } public class Test{ public static void main(String[] args) { Person per1 = new Person(); Person per2 = new Person(); System.out.println("MAIN 方法 --> " + per1); //直接打印对象 per1.getInfo(); System.out.println("MAIN 方法 --> " + per2); //直接打印对象 per2.getInfo(); } }这里哪个对象调用了类中的方法,则 this 就表示哪个对象。
class Person{ private String name; private int age; public Person(String name,int age){ this.setName(name); this.setAge(age); } public String getName(){ return name; } public void setName(String n){ name = n; } public int getAge(){ return age; } public void setAge(int a){ age = a; } public boolean compare(Person per){ // 调用此方法时里面存在两个对象:当前对象、传入对象 Person p1 = this; //表示当前调用方法的对象,为 per1 Person p2 = per; // 传递到方法中的对象,为 per2 if(p1==p2){ //首先比较两个对象的地址是否相等 return true; } if (p2==null){ return false; } if(p1.name.equals(p2.name) && p1.age==p2.age){ return true; }else { return false; } } } public class Test{ public static void main(String[] args) { Person per1 = new Person("Java",30); //声明两个对象,内容完全相等 Person per2 = new Person("Java",30); //声明两个对象,内容完全相等 if (per1.compare(per2)){ //进行对象的比较 System.out.print("两个对象相等!"); }else { System.out.print("两个对象不相等!"); } } }以上程序在 Person 类中定义了一个 compare() 方法,此方法的主要功能就是专门完成两个对象的比较操作,在比较时,首先进行地址的比较,如果两个对象的地址一样,则肯定是同一个对象,如果地址不相等,则将一个个属性进行依次的比较。
南淮北安 认证博客专家 深度学习 Java Python 牛年大吉,牛气冲天!!!