A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 贾联国 中级黑马   /  2012-5-1 17:48  /  2446 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 贾联国 于 2012-5-1 19:35 编辑

public class FinalTest1
{        
    public static final String X;
    public static final String Y;   
    static
{   
         X = "ab";   
         Y = "cd";   
    }   
     public static void main(String[] args)
{                        
         String a = "abcd";
   String b = X + Y;   
        if (a == b)   
             System.out.println("a等于b,它们是同一个对象");   
        else     
             System.out.println("a不等于b,它们不是同一个对象);               
     }   
}
运行结果 a不等于b,它们不是同一个对象


public class FinalTest2
{      
    public static final String X = "ab";  
    public static final String Y = "cd";
    public static void main(String[] args)
{           
         String a = "abcd";
   String b = X + Y;   
        if (a == b)     
             System.out.println("a等于b,它们是同一个对象");   
        else   
             System.out.println("a不等于b,它们不是同一个对象");              
     }   
}   
运行结果 a等于b,它们是同一个对象

两端代码运行结果完全不同,这里面的变量值数值上却相同,请问是哪里不同啊?

7 个回复

倒序浏览
本帖最后由 kevindavid 于 2012-5-1 19:15 编辑

public static final String X;
    public static final String Y;   
    static
{   
         X = "ab";   
         Y = "cd";   
    }   
public static void main(String[] args)
{                        
         String a = "abcd";
   String b = X + Y;   
        if (a == b)   
这 段代码 之所以输出a不等于b,它们不是同一个对象就是因为abcd值位置的原因。在这段代码中
public static final String X;
    public static final String Y;   
    static
{   
         X = "ab";   
         Y = "cd";   
    }    这 是一个独立的封装好了放在主函数里面的功能,而后面b=x+y是调用的这个功能
而a=abcd是直接赋值的与这个功能无关。也可以说是主函数中两个无关的值 做比较所以会输出
a不等于b,它们不是同一个对象

和  {      
    public static final String X = "ab";  
    public static final String Y = "cd";
    public static void main(String[] args)
{           
         String a = "abcd";
   String b = X + Y;   
        if (a == b)     
             System.out.println("a等于b,它们是同一个对象");   
        else   
             System.out.println("a不等于b,它们不是同一个对象");              
     }   
而这段代码看起来和上面是一样的但是他们却大有区别。。在这段代码中X,Y只是这个主函数中的两个常量,
也可以说是直接给x.y赋的一个常量值吧。而a=abcd也是给a赋的一个变量值为abcd而b=x+y为加学运算,所以两个值都是abcd
但是因为是在一个主函数内而且是在同一个范围内相同的值。所以a==b所以输出   a等于b,它们是同一个对象
有不对的地方希望大家可以提出来 继续 改进。这个因为表达能力欠佳确实不知道怎么说,
回复 使用道具 举报
本帖最后由 贾联国 于 2012-5-1 18:45 编辑
kevindavid 发表于 2012-5-1 18:31
public static final String X;
    public static final String Y;
X = "ab";   


+是把两个字符串连在一起,“ab”+“cd”=“abcd”,没错的
这程序完全可以运行,final是可以赋值的,不过只能赋一次
回复 使用道具 举报
贾联国 发表于 2012-5-1 18:40
+是把两个字符串连在一起,“ab”+“cd”=“abcd”,没错的
这程序完全可以运行,final是可以赋值的,不 ...

是的刚那个是咱说呢没看清楚 说错了你看一下我改好了的!然后再说一下那里错了好 不
回复 使用道具 举报
kevindavid 发表于 2012-5-1 19:16
是的刚那个是咱说呢没看清楚 说错了你看一下我改好了的!然后再说一下那里错了好 不 ...


如果原因是因为同一个范围的内相同的值,我们把他们都拿到main函数外面
那么我们更改代码

public class FinalTest2
{      
    public static final String X = "ab";  
    public static final String Y = "cd";
    public static String b = X + Y; //将b提取出来
        public static void main(String[] args)
        {           
         String a = "abcd";
                    
        if (a == b)     
             System.out.println("a等于b,它们是同一个对象");   
        else   
             System.out.println("a不等于b,它们不是同一个对象");              
     }   
}   
结果依然是相同

public class FinalTest1
{        
    public static final String X;
    public static final String Y;  
    static
        {   
         X = "ab";   
         Y = "cd";   
    }   
        public static String b = X + Y; //将b提取出来
     public static void main(String[] args)
        {                        
         String a = "abcd";
                  
        if (a == b)   
             System.out.println("a等于b,它们是同一个对象");   
        else     
             System.out.println("a不等于b,它们不是同一个对象"+a+b);               
     }   
}
结果依旧是不同
回复 使用道具 举报
本帖最后由 kevindavid 于 2012-5-1 20:15 编辑
贾联国 发表于 2012-5-1 19:43
如果原因是因为同一个范围的内相同的值,我们把他们都拿到main函数外面
那么我们更改代码

是“{}”的位置 这个代表他的区域,所以最后导致位置 不同!你难道没发觉前面的那个x,y是封装起来做为一个功能来掉用的么?而后面只是定义的两个值 ,然后相加  得到的B,刚有事出去了呵呵
你看这两张图片中的“{}”的位置

名.jpg (5.14 KB, 下载次数: 45)

名.jpg

未名.jpg (7.18 KB, 下载次数: 45)

未名.jpg
回复 使用道具 举报
kevindavid 发表于 2012-5-1 20:10
是“{}”的位置 这个代表他的区域,所以最后导致位置 不同!你难道没发觉前面的那个x,y是封装起来做为一 ...


那这个静态的X和Y在内存是怎么存的呢?
静态在加载函数的时候已经加载进内存了,封装起来的
static
        {   
         X = "ab";   
         Y = "cd";   
    }   
也是静态的啊,加载进内存的时候是什么样的啊,还有,到底是什么时候调用的X = "ab" ,Y = "cd"和b=X+Y的呢?是在a=“abcd”之后吗?
b=X+Y不也是在常量池里创建了一个“abcd”对象吗?这个对象和a=“abcd”为什么不能一样呢?
在{}里定义的字符串也是从常量池里取出来的,那么调用b=X+Y,不也应该是把常量池中的字符串相加变成“abcd”的吗?

public class FinalTest3
{        
    public static final String X;
     static
    {   
         X = "ab";      //常量池中的“ab”
    }   
     public static void main(String[] args)
        {                        
         String a = "ab"; //建立a=常量池中的“ab”
                  
        if (a == X)   
             System.out.println("a等于X,它们是同一个对象");   
        else     
             System.out.println("a不等于X,它们不是同一个对象");               
     }   
}
运行结果是a等于x ,这是为什么啊?
回复 使用道具 举报
本帖最后由 kevindavid 于 2012-5-1 21:06 编辑
贾联国 发表于 2012-5-1 20:46
那这个静态的X和Y在内存是怎么存的呢?
静态在加载函数的时候已经加载进内存了,封装起来的
static

咱说呢!我也没啥可说的了!建议你看一下第五到第七天左右里面应该有这些内容。还有注意代码的{}所表示的区间位置   其实你这个也不是final的问题。而是封装的问题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马