这种情况指的是在一个类中创建了多个对象,最先创建的对象直接指向类,后面创建的对象则指向第一个创建的对象。那么针对这种情况就会出现如下情况
1.照旧生成栈内存和堆内存,但是堆内存只会生成一个包含类中所有属性和方法的内存地址
2.因为后面创建的对象全部指向第一个对象,那么所有对象都将共享第一个对象的内存地址中的属性和方法
3.当任意一个对象给内存地址中的成员变量进行赋值操作的时候,其它对象在该操作之后直接调用被赋值的属性的时候就不再是默认值了,而是赋值之后的值
4.因为成语方法在类中已经被定义了,所以当多个对象指向同一个内存地址的时候,成员方法是一样的且无法在对象中进行改变
package demo_4;
public class student03_test {
//创建对象
public static void main(String[] args) {
student03 s = new student03();
//调用student03的成员变量
s.name="林青霞";
s.age=30;
//调用student03的成员方法
s.eat();
s.doHomework();
//创建s1对象 不让它指向student03类 让它直接指向第一个对象
student03 s1 =s;
s1.name="张曼玉";
s1.age=28;
s1.eat();
s1.doHomework();
//s1在改变成员变量之后 我们再使用变量s去输出成员变量 可以看到成员变量就不是变量s赋值的那个了 而是变成s1赋值的那个
System.out.println(s.name);
}
}
这里以黑马程序员的图和代码进行解释。当多个后面创建的对象指向第一个对象的时候。那么这时候所有的对象的内存地址都是一样的。也就是说在堆内存中只有一个内存地址。并且这个内存地址被多个对象共同使用。任意一个对象对里面的值进行改变的操作。那么其它的对象在调用这个值的时候就不再是默认值。当然这只针对成员变量。在成员方法的调用时,所有对象都将使用同样的成员方法,并且无法在对象中直接队成员方法进行改变