当前位置:编程学习 > JAVA >>

运行结果你是什么。。

public class MyMain{
public static void main(String[] args) throws Exception {
String a = "s";
StringBuffer b = new StringBuffer("sb"); 
int[] c = {1};
Integer d = new Integer(5);
getRes(a);
getRes(b);
getRes(c);
getRes(d);
System.out.println(a+"--"+b.toString()+"--"+c[0]+"--"+d);
}

public static void getRes(String a)      { a = a+"sssss";}
public static void getRes(StringBuffer b){ b.append("sb");}
public static void getRes(int[] c)       { c[0] = c[0]+1;}
public static void getRes(Integer d)     { d = d+1;}
} --------------------编程问答-------------------- 问下哪些对象是值传递??求解答 --------------------编程问答-------------------- s--sbsb--2--5 --------------------编程问答-------------------- 问下哪些对象是值传递??求解答  --------------------编程问答-------------------- bd是new出来的对象,是引用传递。剩下的值传递 --------------------编程问答--------------------
引用 4 楼 magi1201 的回复:
bd是new出来的对象,是引用传递。剩下的值传递
还有c,数组和对象是引用传递 --------------------编程问答-------------------- 最后一个5我也不明白,等大神来解答

Integer 是对象啊,怎么值没变,内存怎么画的 --------------------编程问答--------------------
引用 6 楼 u011935764 的回复:
最后一个5我也不明白,等大神来解答

Integer 是对象啊,怎么值没变,内存怎么画的
 跑了下,果然最后一个是5,难道是java自动解包为int的效果吗? --------------------编程问答--------------------
引用 7 楼 magi1201 的回复:
Quote: 引用 6 楼 u011935764 的回复:

最后一个5我也不明白,等大神来解答

Integer 是对象啊,怎么值没变,内存怎么画的
 跑了下,果然最后一个是5,难道是java自动解包为int的效果吗?


这个我也很纠结啊,以前都不知道,看看大神怎么说 --------------------编程问答--------------------
引用 8 楼 u011935764 的回复:
这个我也很纠结啊,以前都不知道,看看大神怎么说
如果自己解包为int,那就好解释了,直接值传递,6为方法内的,没有带出方法,main中的依然为5 --------------------编程问答--------------------
引用 9 楼 magi1201 的回复:
Quote: 引用 8 楼 u011935764 的回复:

这个我也很纠结啊,以前都不知道,看看大神怎么说
如果自己解包为int,那就好解释了,直接值传递,6为方法内的,没有带出方法,main中的依然为5


为什么在这里会自动解包啊。这里传的是个Integer 对象吧。

我在DEBUG看一下 --------------------编程问答--------------------
引用 6 楼 u011935764 的回复:
最后一个5我也不明白,等大神来解答

Integer 是对象啊,怎么值没变,内存怎么画的

java中都是值传递,没有引用传递 --------------------编程问答--------------------
引用 10 楼 u011935764 的回复:
Quote: 引用 9 楼 magi1201 的回复:

Quote: 引用 8 楼 u011935764 的回复:

这个我也很纠结啊,以前都不知道,看看大神怎么说
如果自己解包为int,那就好解释了,直接值传递,6为方法内的,没有带出方法,main中的依然为5


为什么在这里会自动解包啊。这里传的是个Integer 对象吧。

我在DEBUG看一下

    public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }
--------------------编程问答--------------------
引用 12 楼 fudongrifdr 的回复:
Quote: 引用 10 楼 u011935764 的回复:

Quote: 引用 9 楼 magi1201 的回复:

Quote: 引用 8 楼 u011935764 的回复:

这个我也很纠结啊,以前都不知道,看看大神怎么说
如果自己解包为int,那就好解释了,直接值传递,6为方法内的,没有带出方法,main中的依然为5


为什么在这里会自动解包啊。这里传的是个Integer 对象吧。

我在DEBUG看一下

    public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }


元首,我刚才DEBUG了,发现传值的时候,确实把地址传过去了,
但是
public static void getRes(Integer d) {//传过来的时候id=27
d = d + 1; // 这时id=37,说明这是一个新对象,原对象的值未改变
}
--------------------编程问答--------------------
引用 13 楼 u011935764 的回复:
Quote: 引用 12 楼 fudongrifdr 的回复:

Quote: 引用 10 楼 u011935764 的回复:

Quote: 引用 9 楼 magi1201 的回复:

Quote: 引用 8 楼 u011935764 的回复:

这个我也很纠结啊,以前都不知道,看看大神怎么说
如果自己解包为int,那就好解释了,直接值传递,6为方法内的,没有带出方法,main中的依然为5


为什么在这里会自动解包啊。这里传的是个Integer 对象吧。

我在DEBUG看一下

    public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }


元首,我刚才DEBUG了,发现传值的时候,确实把地址传过去了,
但是
public static void getRes(Integer d) {//传过来的时候id=27
d = d + 1; // 这时id=37,说明这是一个新对象,原对象的值未改变
}
刚洗澡想通了 public final class Integer extends Numberimplements Comparable<Integer> 这货跟String 一样是final的,全通了 --------------------编程问答--------------------
引用 13 楼 u011935764 的回复:
Quote: 引用 12 楼 fudongrifdr 的回复:

Quote: 引用 10 楼 u011935764 的回复:

Quote: 引用 9 楼 magi1201 的回复:

Quote: 引用 8 楼 u011935764 的回复:

这个我也很纠结啊,以前都不知道,看看大神怎么说
如果自己解包为int,那就好解释了,直接值传递,6为方法内的,没有带出方法,main中的依然为5


为什么在这里会自动解包啊。这里传的是个Integer 对象吧。

我在DEBUG看一下

    public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }


元首,我刚才DEBUG了,发现传值的时候,确实把地址传过去了,
但是
public static void getRes(Integer d) {//传过来的时候id=27
d = d + 1; // 这时id=37,说明这是一个新对象,原对象的值未改变
}

是滴,从某个角度来说,java中就只存在值传递
--------------------编程问答--------------------
引用 14 楼 magi1201 的回复:
Quote: 引用 13 楼 u011935764 的回复:

Quote: 引用 12 楼 fudongrifdr 的回复:

Quote: 引用 10 楼 u011935764 的回复:

Quote: 引用 9 楼 magi1201 的回复:

Quote: 引用 8 楼 u011935764 的回复:

这个我也很纠结啊,以前都不知道,看看大神怎么说
如果自己解包为int,那就好解释了,直接值传递,6为方法内的,没有带出方法,main中的依然为5


为什么在这里会自动解包啊。这里传的是个Integer 对象吧。

我在DEBUG看一下

    public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }


元首,我刚才DEBUG了,发现传值的时候,确实把地址传过去了,
但是
public static void getRes(Integer d) {//传过来的时候id=27
d = d + 1; // 这时id=37,说明这是一个新对象,原对象的值未改变
}
刚洗澡想通了 public final class Integer extends Numberimplements Comparable<Integer> 这货跟String 一样是final的,全通了


final 的啊,我擦。龙套了 --------------------编程问答--------------------
引用 4 楼 magi1201 的回复:
bd是new出来的对象,是引用传递。剩下的值传递

String是不可变类 --------------------编程问答--------------------
引用 16 楼 u011935764 的回复:
final 的啊,我擦。龙套了
 刚洗澡时想到了这种可能,也是一种非常合理的可能,回来查了下API,果然被猜中了,哈哈。 --------------------编程问答--------------------
引用 18 楼 magi1201 的回复:
Quote: 引用 16 楼 u011935764 的回复:

final 的啊,我擦。龙套了
 刚洗澡时想到了这种可能,也是一种非常合理的可能,回来查了下API,果然被猜中了,哈哈。


关注下。学习交流哈 --------------------编程问答--------------------
引用 17 楼 GaoXin_ 的回复:
Quote: 引用 4 楼 magi1201 的回复:

bd是new出来的对象,是引用传递。剩下的值传递

String是不可变类
StringBuffer是可变的,b是StringBuffer,刚论证完Integer也是不可变的。 --------------------编程问答-------------------- 这个题 a是值传递,bcd是引用传递。不同于bc的是,d传引用进去后,参加运算时,因为Integer为final型,值不可变,所以重新在堆中new 了一个新的Integer,将值赋为6,但出方法后,这个6就没有再被引用了,main方法中的d依然指向最初的5的那个内存地址。 --------------------编程问答-------------------- shenmedoumeiyouchuxian --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 16 楼 u011935764 的回复:
Quote: 引用 14 楼 magi1201 的回复:

Quote: 引用 13 楼 u011935764 的回复:

Quote: 引用 12 楼 fudongrifdr 的回复:

Quote: 引用 10 楼 u011935764 的回复:

Quote: 引用 9 楼 magi1201 的回复:

Quote: 引用 8 楼 u011935764 的回复:

这个我也很纠结啊,以前都不知道,看看大神怎么说
如果自己解包为int,那就好解释了,直接值传递,6为方法内的,没有带出方法,main中的依然为5


为什么在这里会自动解包啊。这里传的是个Integer 对象吧。

我在DEBUG看一下

    public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }


元首,我刚才DEBUG了,发现传值的时候,确实把地址传过去了,
但是
public static void getRes(Integer d) {//传过来的时候id=27
d = d + 1; // 这时id=37,说明这是一个新对象,原对象的值未改变
}
刚洗澡想通了 public final class Integer extends Numberimplements Comparable<Integer> 这货跟String 一样是final的,全通了


final 的啊,我擦。龙套了

不是因为final的原因,你可以自己写一个类,定义成final的,当传入的时候一样会改变,不存在不可变类对象传递就不会改变,这跟可变不可变没关系 --------------------编程问答--------------------
引用 16 楼 u011935764 的回复:
Quote: 引用 14 楼 magi1201 的回复:

Quote: 引用 13 楼 u011935764 的回复:

Quote: 引用 12 楼 fudongrifdr 的回复:

Quote: 引用 10 楼 u011935764 的回复:

Quote: 引用 9 楼 magi1201 的回复:

Quote: 引用 8 楼 u011935764 的回复:

这个我也很纠结啊,以前都不知道,看看大神怎么说
如果自己解包为int,那就好解释了,直接值传递,6为方法内的,没有带出方法,main中的依然为5


为什么在这里会自动解包啊。这里传的是个Integer 对象吧。

我在DEBUG看一下

    public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }


元首,我刚才DEBUG了,发现传值的时候,确实把地址传过去了,
但是
public static void getRes(Integer d) {//传过来的时候id=27
d = d + 1; // 这时id=37,说明这是一个新对象,原对象的值未改变
}
刚洗澡想通了 public final class Integer extends Numberimplements Comparable<Integer> 这货跟String 一样是final的,全通了


final 的啊,我擦。龙套了

这根final不final没有关系、、 --------------------编程问答--------------------
引用 25 楼 fudongrifdr 的回复:
这根final不final没有关系、、
 那该如何解释呢,元首,看我哪里又给理解错啦  --------------------编程问答--------------------
引用 25 楼 fudongrifdr 的回复:
这根final不final没有关系、、


String是final的,当你在方法中传递String时是引用传递,但是你不能改变这个String对象的值.

我一直是这么理解的

那应该咋回事? --------------------编程问答--------------------
引用 26 楼 magi1201 的回复:
那该如何解释呢,元首,看我哪里又给理解错啦 


引用 27 楼 u011935764 的回复:
String是final的,当你在方法中传递String时是引用传递,但是你不能改变这个String对象的值.
[/img]


JAVA中的参数传递全是以值传递的。是基本类型,就copy一个基本类型传进方法;是引用,就拷贝一个引用地址传进去方法,而并不是直接把地址交给他
public final class A {

int x =10;

public static void p(A a) {
a = new A();
a.x = 5;
}

public static void main(String args[]) {
A a = new A();
System.out.println(a.x);
p(a);
System.out.println(a.x);
}

}

我定义了一个final的A,穿进去把a重新指向了一个新的对象。改变他的属性值,而方法执行之后,打印a还是指向之间那个对象,说明我们传的是引用的值。而不是类似C++引用传递 --------------------编程问答-------------------- java还有引用传递?不都是值传递吗? --------------------编程问答-------------------- s--sbsb--2--5 --------------------编程问答--------------------
引用 26 楼 magi1201 的回复:
Quote: 引用 25 楼 fudongrifdr 的回复:

这根final不final没有关系、、
 那该如何解释呢,元首,看我哪里又给理解错啦 


引用 27 楼 u011935764 的回复:
Quote: 引用 25 楼 fudongrifdr 的回复:

这根final不final没有关系、、


String是final的,当你在方法中传递String时是引用传递,但是你不能改变这个String对象的值.

我一直是这么理解的

那应该咋回事?


至于他这个StringBuffer为什么会打印sbsb,是因为把sb的地值copy传过去了,但仍然指向的是同一个对象,并未指定新的对象,所有看上去向是传的地址,实际是引用的值的拷贝 --------------------编程问答--------------------
引用 31 楼 fudongrifdr 的回复:
至于他这个StringBuffer为什么会打印sbsb,是因为把sb的地值copy传过去了,但仍然指向的是同一个对象,并未指定新的对象,所有看上去向是传的地址,实际是引用的值的拷贝
 那哪些对象仍然指向的是同一个对象,这个如何判断呢? --------------------编程问答--------------------
引用 32 楼 magi1201 的回复:
Quote: 引用 31 楼 fudongrifdr 的回复:

至于他这个StringBuffer为什么会打印sbsb,是因为把sb的地值copy传过去了,但仍然指向的是同一个对象,并未指定新的对象,所有看上去向是传的地址,实际是引用的值的拷贝
 那哪些对象仍然指向的是同一个对象,这个如何判断呢?

这得看你执行的操作有没有new新对象吧,反正记住引用记录了对象的地址,而给方法传引用类型参数,实际是把这个地址值的copy传过去了 --------------------编程问答-------------------- 除了public static void getRes(StringBuffer b){ b.append("sb");}
public static void getRes(int[] c)       { c[0] = c[0]+1;}
这两个的值会发生改变,其他的没影响! --------------------编程问答--------------------
引用 28 楼 fudongrifdr 的回复:
JAVA中的参数传递全是以值传递的。是基本类型,就copy一个基本类型传进方法;是引用,就拷贝一个引用地址传进去方法,而并不是直接把地址交给他
public final class A {

int x =10;

public static void p(A a) {
a = new A(); //新对象
a.x = 5; // 新对象的变量
}

public static void main(String args[]) {
A a = new A();
System.out.println(a.x); //打印原对象的值
p(a);
System.out.println(a.x);//打印原对象的值
}

}

我定义了一个final的A,穿进去把a重新指向了一个新的对象。改变他的属性值,而方法执行之后,打印a还是指向之间那个对象,说明我们传的是引用的值。而不是类似C++引用传递


元首,java的值传递,你说的我明白了。

public static void getRes(String a) { //这传的是一份地址的拷贝
a = a + "sssss"; //这里a+"ssss"赋值给"a"后,此时的a是一个新对象
}

但是StringBuffer 操作的是同一地址的"内容(sb)",是这样吧 --------------------编程问答--------------------
引用 35 楼 u011935764 的回复:
Quote: 引用 28 楼 fudongrifdr 的回复:

JAVA中的参数传递全是以值传递的。是基本类型,就copy一个基本类型传进方法;是引用,就拷贝一个引用地址传进去方法,而并不是直接把地址交给他
public final class A {

int x =10;

public static void p(A a) {
a = new A(); //新对象
a.x = 5; // 新对象的变量
}

public static void main(String args[]) {
A a = new A();
System.out.println(a.x); //打印原对象的值
p(a);
System.out.println(a.x);//打印原对象的值
}

}

我定义了一个final的A,穿进去把a重新指向了一个新的对象。改变他的属性值,而方法执行之后,打印a还是指向之间那个对象,说明我们传的是引用的值。而不是类似C++引用传递


元首,java的值传递,你说的我明白了。

public static void getRes(String a) { //这传的是一份地址的拷贝
a = a + "sssss"; //这里a+"ssss"赋值给"a"后,此时的a是一个新对象
}

但是StringBuffer 操作的是同一地址的"内容(sb)",是这样吧

--------------------编程问答--------------------
引用 36 楼 fudongrifdr 的回复:
元首,java的值传递,你说的我明白了。

public static void getRes(String a) { //这传的是一份地址的拷贝
a = a + "sssss"; //这里a+"ssss"赋值给"a"后,此时的a是一个新对象
}

但是StringBuffer 操作的是同一地址的"内容(sb)",是这样吧
 还没明白,String 指向新对象了,Integer指向新对象了,StringBuffer没有,这个怎么判断,String和Integer对象不可变吗? --------------------编程问答--------------------
引用 37 楼 magi1201 的回复:
Quote: 引用 36 楼 fudongrifdr 的回复:


元首,java的值传递,你说的我明白了。

public static void getRes(String a) { //这传的是一份地址的拷贝
a = a + "sssss"; //这里a+"ssss"赋值给"a"后,此时的a是一个新对象
}

但是StringBuffer 操作的是同一地址的"内容(sb)",是这样吧
 还没明白,String 指向新对象了,Integer指向新对象了,StringBuffer没有,这个怎么判断,String和Integer对象不可变吗?
 
a = a+"sssss"会创建新对象啊,StringBuffer的append方法不会产生新对象。。 --------------------编程问答--------------------
引用 38 楼 fudongrifdr 的回复:
Quote: 引用 37 楼 magi1201 的回复:

Quote: 引用 36 楼 fudongrifdr 的回复:


元首,java的值传递,你说的我明白了。

public static void getRes(String a) { //这传的是一份地址的拷贝
a = a + "sssss"; //这里a+"ssss"赋值给"a"后,此时的a是一个新对象
}

但是StringBuffer 操作的是同一地址的"内容(sb)",是这样吧
 还没明白,String 指向新对象了,Integer指向新对象了,StringBuffer没有,这个怎么判断,String和Integer对象不可变吗?
 
a = a+"sssss"会创建新对象啊,StringBuffer的append方法不会产生新对象。。
元首,讲讲String和Integer不创建对象的原因,顺便元首还知道哪些包装类像这样传不创建对象  --------------------编程问答--------------------
引用 37 楼 magi1201 的回复:
Quote: 引用 36 楼 fudongrifdr 的回复:


元首,java的值传递,你说的我明白了。

public static void getRes(String a) { //这传的是一份地址的拷贝
a = a + "sssss"; //这里a+"ssss"赋值给"a"后,此时的a是一个新对象
}

但是StringBuffer 操作的是同一地址的"内容(sb)",是这样吧
 还没明白,String 指向新对象了,Integer指向新对象了,StringBuffer没有,这个怎么判断,String和Integer对象不可变吗?


其实这个问题应该这样理解public static void getRes(Integer d)     { d = d+1;}
这里 d=d+1,d是一个新的引用,其实里面有se5里面的自动装箱和拆箱,其实真正的源码应该是d=new Integer(d+1);当然d+1也是拆箱,这里其实new了一个新对象,其实就是一个新的引用指向了真正的对象d+1的存储单元,在主程序的d引用其实没有改变,这不同于普通对象的传递,普通对象传入getRes(Entity e),e也是一个不同于主程序里面的另一个引用,但是用set修改属性时,始终指向的是原来的存储单元,所以主程序里面e指向的存储单元改变,值改变 --------------------编程问答-------------------- 其实所有的原因都是因为不可变类和可变类,jdk的不可变类:jdk的java.lang包中 Boolean, Byte, Character, Double, Float, Integer, Long, Short, String.这些类传递时,都会new新的对象出来,final只是保证该类不可被继承。
可以参考 可变类与不可变类 --------------------编程问答--------------------
引用 41 楼 magi1201 的回复:
其实所有的原因都是因为不可变类和可变类,jdk的不可变类:jdk的java.lang包中 Boolean, Byte, Character, Double, Float, Integer, Long, Short, String.这些类传递时,都会new新的对象出来,final只是保证该类不可被继承。
可以参考 可变类与不可变类

你当然可以记下来这些是不可变类,但是我觉得更深层次的原因是s = s+"str",为什么类对象可以和字符串相加,它是执行什么操作以及引用,基本类型和对象分别存储在哪
 如果你能够分析出来,才能说你的基础不错 --------------------编程问答--------------------
引用 42 楼 u011310990 的回复:
Quote: 引用 41 楼 magi1201 的回复:

其实所有的原因都是因为不可变类和可变类,jdk的不可变类:jdk的java.lang包中 Boolean, Byte, Character, Double, Float, Integer, Long, Short, String.这些类传递时,都会new新的对象出来,final只是保证该类不可被继承。
可以参考 可变类与不可变类

你当然可以记下来这些是不可变类,但是我觉得更深层次的原因是s = s+"str",为什么类对象可以和字符串相加,它是执行什么操作以及引用,基本类型和对象分别存储在哪
 如果你能够分析出来,才能说你的基础不错
 java运行时的内存分配图,看过几次,现在就记住了对象堆栈的分配,还是要多看  --------------------编程问答--------------------
引用 40 楼 u011310990 的回复:
Quote: 引用 37 楼 magi1201 的回复:

Quote: 引用 36 楼 fudongrifdr 的回复:


元首,java的值传递,你说的我明白了。

public static void getRes(String a) { //这传的是一份地址的拷贝
a = a + "sssss"; //这里a+"ssss"赋值给"a"后,此时的a是一个新对象
}

但是StringBuffer 操作的是同一地址的"内容(sb)",是这样吧
 还没明白,String 指向新对象了,Integer指向新对象了,StringBuffer没有,这个怎么判断,String和Integer对象不可变吗?


其实这个问题应该这样理解public static void getRes(Integer d)     { d = d+1;}
这里 d=d+1,d是一个新的引用,其实里面有se5里面的自动装箱和拆箱,其实真正的源码应该是d=new Integer(d+1);当然d+1也是拆箱,这里其实new了一个新对象,其实就是一个新的引用指向了真正的对象d+1的存储单元,在主程序的d引用其实没有改变,这不同于普通对象的传递,普通对象传入getRes(Entity e),e也是一个不同于主程序里面的另一个引用,但是用set修改属性时,始终指向的是原来的存储单元,所以主程序里面e指向的存储单元改变,值改变


同意,应该就是这样吧.再底层的东西也没那能力研究......
String a="a";int b=1;//存储方式相同
String a=new String("a"); Integer b=new Integer(1);//存储方式相同
a+"aaa"; b+1;//在处理上应该是相同,都创建的新对象 --------------------编程问答-------------------- --------------------编程问答--------------------
真心学习了,又学会了一个知识点。。。。。。。 --------------------编程问答--------------------
引用 40 楼 u011310990 的回复:
其实这个问题应该这样理解public static void getRes(Integer d)     { d = d+1;}
这里 d=d+1,d是一个新的引用,其实里面有se5里面的自动装箱和拆箱,其实真正的源码应该是d=new Integer(d+1);当然d+1也是拆箱,这里其实new了一个新对象,其实就是一个新的引用指向了真正的对象d+1的存储单元,在主程序的d引用其实没有改变,这不同于普通对象的传递,普通对象传入getRes(Entity e),e也是一个不同于主程序里面的另一个引用,但是用set修改属性时,始终指向的是原来的存储单元,所以主程序里面e指向的存储单元改变,值改变
觉得还是从可变类和不可变类的角度来理解更好懂一点,因为是不可变类,所以参加运算时,就新 new 了对象。导致新的结果不能存在之前的内存地址,原来的值依然存在。 --------------------编程问答--------------------
引用 47 楼 magi1201 的回复:
[b]
觉得还是从可变类和不可变类的角度来理解更好懂一点,因为是不可变类,所以参加运算时,就新 new 了对象。导致新的结果不能存在之前的内存地址,原来的值依然存在。


“可变类和不可变类”没听过这种定义,是不是把final理解错了
fianl修饰类,只说明类不可被继承。final类的所有方法默认是final的,不可重写,因为类不能继承,就不肯能重写。如String。
fianl修饰变量,表示变量所指向的地址不可修改,即指向的对象不可变。对象里的属性是可变的。
--------------------编程问答--------------------
引用 48 楼 hunhunabc 的回复:
Quote: 引用 47 楼 magi1201 的回复:

[b]
觉得还是从可变类和不可变类的角度来理解更好懂一点,因为是不可变类,所以参加运算时,就新 new 了对象。导致新的结果不能存在之前的内存地址,原来的值依然存在。


“可变类和不可变类”没听过这种定义,是不是把final理解错了
fianl修饰类,只说明类不可被继承。final类的所有方法默认是final的,不可重写,因为类不能继承,就不肯能重写。如String。
fianl修饰变量,表示变量所指向的地址不可修改,即指向的对象不可变。对象里的属性是可变的。
恩 是的 我之前对类前面的final理解不到位,造成了理解的错误。不可变类,一旦创建,变不可再修改其值,所以String Integer等类new出的对象参加运算时,都会生成新的对象,不可修改之前传入的对象值。final 只强调该引用指向的内存地址不可改变,如试图改变final修饰的对象的内存地址,编译报错。
补充:Java ,  Java EE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,