java中什么是赋值,在java中 变量之间是如何赋值的
大家好,如果您还对java中什么是赋值不太了解,没有关系,今天就由本站为大家分享java中什么是赋值的知识,包括在java中 变量之间是如何赋值的的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
JAVA 给数组赋值
int[]b;
int[]a={1,2,3,4};
b=a;
答:可以这样对数组进行赋值。
但是这种方式对数组进行赋值,实际上是一种浅层复制.
也就是说,b实际上就是a,它们的内存地址值都是一样的,当a发生改变,那么b也会跟着改变。
为了真正意义上实现赋值,那么我们应该对数组进行深层复制。
深层复制后,无论a怎么改变,都不会影响到b。
具体代码如下
packagecore.com;
importjava.util.Arrays;
publicclassDemoCopy{
publicstaticvoidmain(String[]args){
//---------浅层复制--------
int[]a;
int[]b={1,2,3,4};
a=b;//浅层复制.当b改变的时候,a会跟着改变
System.out.println(Arrays.toString(a));//输出数组a,[1,2,3,4]
b[0]=5;//改变数组b,数组a也会跟着改变
System.out.println(Arrays.toString(a));//输出数组a,[5,2,3,4]
System.out.println(a==b);//输出truea就是b
//-----------分割线--------
//深层复制方法一:
String[]c;
String[]d={"a","b","c"};
c=newString[d.length];//需要初始化数组长度
for(inti=0;i<d.length;i++){//循环复制,
c[i]=d[i];
}
d[0]="y";//改变数组d,不会影响c
System.out.println(Arrays.toString(c));//
System.out.println(c==d);
//-------------分割线---------
//深层复制方法二:
int[]ary1;
int[]ary2={8,8,8};
ary1=newint[ary2.length];
System.arraycopy(ary2,0,ary1,0,ary2.length);//调用函数进行深层复制
ary2[0]=6;//改变数组ary2,并不会影响ary1
System.out.println(Arrays.toString(ary1));
System.out.println(ary1==ary2);
}
}
控制台输出
[1,2,3,4]
[5,2,3,4]
true
[a,b,c]
false
[8,8,8]
false
java的赋值
拿楼主的举例,有一个Person.java类。首先Person p=new Person();Person p1;
Person p2=new Person();
分析p p1 p2在栈内存和堆内存。栈内存中有3个,分别是p p1 p2,堆内存中有2个p p2。
因为p1没有通过new来创建实例,所以只在栈内存存在。这时是p指向p的堆内存,p2指向p2的堆内存。现在p1= p或者p2= p;这样操作之后只是把指向改变了(p p1 p2都指向了p的堆内存),其余没变。这时堆内存中p2就变成了垃圾内存了。
。
在java中 变量之间是如何赋值的
一、基本类型数据赋值
实验1:定义一个int类型变量a= 3,并将a赋值给int b,然后将a,赋值为5,那么b的值是3还是5呢?
int a= 3;
int b= a;
a= 5;
System.out.println(" a="+ a+" b="+b);
运行程序,打印结果为:
a= 5 b=3
我们看到,b并没有随a的改变而改变。基本数据类型是值赋值。
二、String类型数据赋值
实验2:定义一个String类型变量s1赋值为“a”,并将s1赋值给String s2;然后将s1赋值为“b”,那么s2的值是“a”还是“b”?
String s1="a";
String s2= s1;
s1="b";
System.out.println("s1="+s1+" s2="+ s2);
运行程序,打印结果为:
s1= b s2=a
我们看到,s2并没有随s1的改变而改变。
三、自定义数据类型赋值
实验3:创建一个TUser u1,并将u1赋值给TUser u2,将 u1重新赋值,u2会随着u1改变而改变吗?
TUser u1= new TUser();
u1.setId(1);
TUser u2= u1;
u1= new TUser();
u1.setId(2);
System.out.println("ui:"+u1+"\t\n"+"u2:"+ u2);
运行程序,打印结果为:
u1:TUser(id=2)
u2: TUser(id=1)
我们看到u2并没有随着u1的改变而改变。
如果我们不改变u1指向的地址,而是改变u1指向地址所对应的数据(即将 u1= new TUser();注释掉)。那么u1,u2打印的记过将都会是 TUser(id=2)
通过以上三个实验我们发现:
变量之间的赋值,可以说没有所谓的值赋值和地址赋值。
简而言之,将一个变量a赋值给另一个变量b,是将这个变量a的值,拷贝一份给变量b(如果a是引用类型,就拷贝引用,如果是基本类型,就拷贝原始值)
java 实例变量的定义 赋值 和实例化的区别
其实你的问题不在这而是全局变量和区域变量的问题
如你描述的
如果在第一个方法已经给这个d赋值那么下个方法如果重新赋值,这个d默认就是方法1执行后d的值这是个全局变量
如果是在方法外赋值每次调用这个类就先给d重新赋值,然后加载你的方法相当于d是个常量
无论你执行那个方法 d的初始值都是你在方法外赋值的那个
具体该在方法外还是内看具体需求
赋值和 new的区别
其实这是对存储堆和栈的问题
如果直接赋值它在栈中的位置不变只是堆里的数据有变化
如果new了则是先在栈中添加数据然后再在堆里添加数据栈的数据指向堆中数据
文章分享结束,java中什么是赋值和在java中 变量之间是如何赋值的的答案你都知道了吗?欢迎再次光临本站哦!