VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2247|回复: 16

关于对象引用,还是没搞明白

[复制链接]

2

主题

16

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
发表于 2020-3-24 10:00:01 | 显示全部楼层 |阅读模式
class Base
{
        public int i;
        public Base(int a)
        {
                i=a;
        }
}

public class StringTest {
  public static void changeStr(String str){
    str="welcome";
  }
  public static void changeBase(Base b)
  {
          b.i=6;
  }
  
  public static void main(String[] args) {
    String str="1234";
    Base base= new Base(3);
    changeBase(base);       
    System.out.println(base.i);       
    changeStr(str);
    System.out.println(str);
  }
}

我以为我明白了,可惜还是没明白
changeBase按“对象引用”的规则修改了i的值,
可是changeStr却没按“对象引用”规则,依然是“1234”
为什么呢?
回复

使用道具 举报

0

主题

1

帖子

0.00

积分

新手上路

Rank: 1

积分
0.00
发表于 2020-3-24 13:58:36 | 显示全部楼层

class Base
{
        public int i;
        public Base(int a)
        {
                i=a;
        }
}

public class StringTest {
  public static void changeStr(String str){
    str="welcome";
  }
  public static void changeBase(Base b)
  {
          b.i=6;
  }
  
  public static void main(String[] args) {
    String str="1234";
    Base base= new Base(3);
    changeBase(base);      
    System.out.println(base.i);      
    changeStr(str);
    System.out.println(str);
  }
}
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-7-3 21:45:02 | 显示全部楼层
String对象有点特别
一但生成一个String对象
你就永远无法改变它
回复

使用道具 举报

1

主题

51

帖子

32.00

积分

新手上路

Rank: 1

积分
32.00
发表于 2020-7-4 01:00:01 | 显示全部楼层
第一个改变,传的是对象进去,“对象引用”的规则.
JAVA里面不存在传地址,所以依然是“1234”
回复

使用道具 举报

1

主题

20

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
发表于 2020-7-5 23:15:02 | 显示全部楼层
第一个传的是对象b 对象b是不能改变的
第二个传的是string string自然也不能直接改变
回复

使用道具 举报

0

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-7-6 11:00:02 | 显示全部楼层
你这样改下你看看
  public static String changeStr(String str){
    return "welcome";
  }
  public static void changeBase(Base b)
  {
  b.i=6;
  }
  
  public static void main(String[] args) {
    String str="1234";
    Base base= new Base(3);
    changeBase(base);
    System.out.println(base.i);
    str = changeStr(str);  
    System.out.println(str);
  }

String是不变类,必须显示更改结果
回复

使用道具 举报

2

主题

16

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
 楼主| 发表于 2020-7-7 11:15:01 | 显示全部楼层
楼上  我试引用  你返回值有什么用啊

楼上的楼上:
第一个传的是对象b 对象b是不能改变的             //可是b变了
第二个传的是string string自然也不能直接改变     //这句是根据上一句推导出来的,所以这句也不成立
回复

使用道具 举报

0

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-7-7 22:45:01 | 显示全部楼层
String and 基本类型都是fianl型的!你可以看看引用传递和值传递部分的书
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-7-17 21:45:01 | 显示全部楼层
str = changeStr(str);语句的作用其实就相当于

str = "welcome";直接把返回值赋给str,所以显示出来字符串改变了
回复

使用道具 举报

3

主题

17

帖子

14.00

积分

新手上路

Rank: 1

积分
14.00
发表于 2020-7-17 23:45:01 | 显示全部楼层
我是这样理解的:改变的是str的副本
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表