引用数据:
引用 不同的表面,相同的结果。
new:出现new一定会开辟一个新的堆内存!;
如果声明并实例化两个对象,会出现两个堆内存!
class Book{//定义一个类
String title;//书的名字
double price;//书的价格
public void getInfo(){//此对象将由方法调用
System.out.println.("图书名称"+title+"图书价格"+price)
}
}
public class TestDemo{
public static void main(String[] args){
Book booka = new Book();//声明并实例化一个对象
booka.title="Java开发";//操作属性内容,如果不设置值那么会输出默认值;
booka.price="89.5";//操作属性内容
Book bookb =new Book();
bookb.title="Jsp开发";
bookb.price="69.5";
bookb.getInto();
booka.getInto();//代码执行后,这两个对象完全不冲突。
}
}
上面代码:new出了两个栈内存,并且分别保存了从类中获取的属性,都具有其默认值。
class Book{//定义一个类
String title;//书的名字
double price;//书的价格
public void getInfo(){//此对象将由方法调用
System.out.println.("图书名称"+title+"图书价格"+price)
}
}
public class TestDemo{
public static void main(String[] args){
Book booka = new Book();//声明并实例化一个对象
Book bookb =null;//声明对象
booka.title="Java开发";//操作属性内容,如果不设置值那么会输出默认值;
booka.price="89.5";//操作属性内容
bookb = booka;//引用传递
bookb.price="69.5";
booka.getInto();//输出的价格为69.5
}
}
严格来说booka和bookb保存的是地址信息,所以以上的引用过程相当于把booka的地址赋给了bookb。
可以理解为复制了一把钥匙,原来bookb的钥匙换掉了换成了和booka一样的钥匙。但是钥匙名还是叫做bookb和booka。此时两个对象指向的是同一个堆内存空间,此时任何一个对象改变了堆内存空间,那么都会影响到其他对象.
在引用的操作过程中,一个堆内存可以同时被多个栈内存所指向,但是一块栈内存只能保存一个堆内存的地址!
class Book{//定义一个类
String title;//书的名字
double price;//书的价格
public void getInfo(){//此对象将由方法调用
System.out.println.("图书名称"+title+"图书价格"+price)
}
}
public class TestDemo{
public static void main(String[] args){
Book booka = new Book();//声明并实例化一个对象
Book bookb =new Book();
booka.title="Java开发";//操作属性内容,如果不设置值那么会输出默认值;
booka.price="89.5";//操作属性内
bookb.title="Jsp开发";
bookb.price="69.5";
bookb = booka;//引用关系
bookb.price=79.8;
booka.getInto();//结果输出 java开发,79.8
}
}
new开辟了两个堆内存,bookb=booka;一个栈只能指向一个堆,所以bookb先和原来地址断开,再指向新的连接。那么原来bookb所对应的地址就成为了不被使用的,即为垃圾。bookb.price=79.8;此时bookb指向的是booka也指向的空间,所以在改变bookb所对应的堆内存时其他对象指向此堆内存也随之改变。