看如下代码:
1 public class ThisDemo{ 2 public static void main(String[] args){ 3 Dog d1 = new Dog(2,"小黄"); 4 Person p1 = new Person(d1,101,"周易"); 5 Person p2 = new Person(d1,10,"易周"); 6 p1.showInfo(); 7 p2.dog.showInfo(); 8 } 9 } 10 //定义一个人类 11 class Person{ 12 //成员变量 13 int age; 14 String name; 15 Dog dog;//引用类型 16 public Person(Dog dog,int age,String name){ 17 /*可读性不好 18 age=age; 19 name=name; 20 */ 21 //使用this区分局部变量与实例变量,提高可读性 22 this.age=age; 23 this.name=name; 24 this.dog = dog; 25 } 26 //显示人名字 27 public void showInfo(){ 28 System.out.println("人名是:"+name); 29 } 30 } 31 class Dog{ 32 int age; 33 String name; 34 public Dog(int age,String name){ 35 this.age = age; 36 this.name = name; 37 } 38 public void showInfo(){ 39 System.out.println("狗名叫"+this.name); 40 } 41 }
通过class Person创建了2个对象,在创建对象p1、p2的同时,java虚拟机将this代词指向了创建的对象p1、p2。this是属于对象的而不是属于类的。this只能在类定义方法中使用,不能在外部使用。
引用数据类型在内存中存在的形式:
如果数据是基本类型可以简单的认为将数据放置在源对象空间中,String对象准确地讲指向外边的空间。
p1空间的d1对象只是在此空间存储了一个d1引用名(对象名),d1对象放置的数据并不在p1里而是指向了独立的d1空间,所以说当p2也如此这般,p2里的d1对象也将指向同一个(地址)独立d1空间,达到了共享。当通过p1改变d1属性、属性值时,于是p2也会做相同改变。