属性是引用类型怎么访问?
1.什么是引用?
简单来说,引用是一个变量,该变量中存放了堆中创建的对象在堆内存中的地址,在对象实例化后可以通过引用.属性名(或方法名的方式)访问对象的属性和方法。
2.引用变量一定是局部变量吗?
显然不是,举个例子
public class Student{
int id;
Study message//这个实例变量是Study类型的
public ststic void main(String[] args){
Study mes = new Study();
Student S1 = new Student();
S1.id = 1234;
S1.message = mes;
S1.message.name = "1111222";
S1.message.addr = "南京";
}
}
上述在Student类中定义了一种引用类型的实例变量Study message;其中,Study类定义如下:
public class Study{
String name;
String Addr;
}
在第一个程序中,我们发现
Study mes = new Study();
Student S1 = new Student();
其中,mes,S1都是定义在方法中的局部变量,new关键字在堆内存中创建对象后,返回了该对象在堆内存中的地址,分别保存在了对应引用类型的局部变量中,故称mes,S1为”引用“。即,引用变量中存放的是对象在堆内存中的地址
那么,值得思考的是:是否所有的引用变量都是存放在栈空间中的局部变量呢?
显然不是,如当我们实例化一个Student类时,在堆中分配了一段内存空间,其中包括实例变量 id,还有Study类型的实例变量message。通过语句:
Study mes = new Study();
S1.message = mes;
我们将引用mes中保存的地址付给了S1.message,根据引用的定义可知,此时S1.message也是指向Study类型的变量的一个引用,但是,显然S1.message是分配在堆内存中的Student类型对象的实例变量。
由此得出结论,不是所有的引用都是局部变量
画内存图分析如下:
public class Test02{
A a;
public static void main(String[] args){
D d = new D();
C c = new C();
B b = new B();
A a = new A();
Test02 t = new Test02();
t.a = a;
a.b = b;
b.c = c;
c.d = d;
System.out.println(t.a.b.c.d.i);
}
}
class A{
B b;
}
class B{
C c;
}
class C{
D d;
}
class D{
int i;
}