`
liuwei1981
  • 浏览: 769188 次
  • 性别: Icon_minigender_1
  • 来自: 太原
博客专栏
F8258633-f7e0-30b8-bd3a-a0836a5f4de5
Java编程Step-by...
浏览量:160466
社区版块
存档分类
最新评论

java解惑--动物庄园

阅读更多
 下面的java程序打印结果是什么?
public class AnimalFarm{
   public static void main(String[] args){
        final String pig = "length: 10";
        final String dog = "length: "+pig.length();
        System.out.println("Animal are equal:" +pig == dog);  
    }
}

    对这个程序进行表面分析后,可能会认为它应该打印Animal are equal: true。毕竟,pig和dog都是final的String类型变量,他们都被初始化为字符串序列“length:10”。换句话说,被pig和dog引用的字符串是且永远是彼此相等的。然而,==操作符并不测试两个对象是否相等,它测试的是两个对象的引用是否相同。在本例中,他们并非引用到同一个对象。

   String类型的编译期常量是内存限定的,任何两个String类型的常量表达式,如果指定的是相同的字符序列,那么他们就用同一个对象引用来表示。如果常量表达式来初始化pig和dog,那么他们确实会指向相同的对象,但是dog并不是常量表示式初始化的,既然语言已经对在常量表达式中允许出现的操作做了限制,而方法调用又不在其中,那么,这个程序就应该打印 Animal are equal: false。

  实际上仍然不对,运行该程序,就会发现它打印的只是false,并没有其他的东西。它没有打印Aniaml are equal:,它怎么不打印这个字符串常量呢?毕竟要打印它才是正确的,+操作符在这里出现了问题,不论式用着将加法还是字符串链接操作,它都比==操作符优先级高,应此,println方式的参数实际上式按照下面的方式计算的:

System.out.println(("Animal are equal:"+pig)==dog);

    这个布尔表达式的值当然是false有一个能够避免此类错误的方式,在使用字符串连接操作符时候,总是将不平凡的操作时用括号括起来

   如果可以的话,你的代码应该很少依赖于字符串常量的内存限定机制

   在比较对象引用的时候,应该优先使用equals方法而不是==操作符,除非需要比较的是对象的标识而不是对象的值。很明显,在按照以上原则修改之后,它将打印true:
   

System.out.println("Animal are equal:" +pig.equals(dog));

 

 

    

分享到:
评论
3 楼 lijie250 2008-05-06  
Joo 写道
一个分配在堆上 一个分配在栈上 自然不一样

pig是棧,dogs是堆?
2 楼 liuwei1981 2008-05-06  
程序最开始只输出false,是操作符优先级的问题
1 楼 Joo 2008-05-06  
一个分配在堆上 一个分配在栈上 自然不一样

相关推荐

    java解惑--疑难问题解疑

    本文将针对"java解惑--疑难问题解疑"的主题,对一些常见的Java疑难问题进行详细解析,旨在帮助初学者更好地理解和解决这些问题。 1. **内存管理与垃圾回收**:Java通过自动垃圾回收机制来管理内存,这为开发者减轻...

    java解惑 - 最后的笑声

    《Java解惑——最后的笑声》这篇博文主要探讨了Java编程中一些常见但往往被忽视的问题,这些问题可能会在开发过程中导致意料之外的错误或性能瓶颈。作为一个专业的IT大师,我将深入解析这些知识点,帮助你更好地理解...

    java解惑-语法细节介绍

    ### Java解惑——语法细节介绍 #### 概述 Java作为一种广泛应用的编程语言,拥有庞大的用户群体和丰富的应用场景。在日常开发过程中,我们往往会遇到一些容易忽视却又十分重要的语法细节。这些细节虽然不起眼,但...

    JAVA解惑-Pg285.pdf

    表达式之谜,符号之谜,循环之谜,异常之谜,类之谜,库之谜,各种谜题。

    java 解惑 java 解惑 java 解惑

    java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑

    Java解惑(中文版)_java_java解惑_solve65p_

    《Java解惑(中文版)》是一本专为Java初学者设计的学习资料,旨在帮助读者解答在学习Java过程中遇到的各种困惑。"solve65p"可能代表这本书包含65个问题或主题,每个都深入浅出地进行了讲解,旨在解决初学者在编程...

    Java学习利器-JAVA解惑

    然而,学习Java的过程中,初学者或经验丰富的开发者都可能会遇到一些棘手的问题,这就是"Java学习利器-JAVA解惑"想要解决的问题。 这份名为"JAVA解惑"的PDF文档,可能是由一位经验丰富的Java开发者或者教育者编写的...

    最新版的Java-解惑

    《Java解惑》是一本专为Java初学者和进阶者设计的指南,旨在帮助读者解决在学习和实践中遇到的各种问题。这本书深入浅出地解析了Java编程中的常见困惑,涵盖了语言基础、类库应用、多线程、网络编程、异常处理、内存...

    JAVA 解惑 java经典

    "JAVA解惑"的主题针对的是Java学习过程中遇到的一些常见问题和难点,旨在帮助开发者深入理解和解决这些问题。以下是基于这个主题和描述可能涵盖的一些关键知识点: 1. **Java基础**:这可能包括变量、数据类型、...

    Java解惑 中文版

    《Java解惑中文版》是一本专为Java程序员设计的指南,旨在帮助读者解决在编程过程中遇到的各种问题,提升程序的健壮性。本书深入浅出地探讨了Java语言的核心概念、常见疑惑以及最佳实践,旨在使开发者能够编写出更...

    Java PUZZLE Java 解惑

    Java PUZZLE Java 解惑 Java PUZZLE Java 解惑 Java PUZZLE Java 解惑Java PUZZLE Java 解惑 Java PUZZLE Java 解惑 Java PUZZLE Java 解惑

    2010年-Java解惑(中文)

    《Java解惑(中文)》是一本专注于解决Java编程中常见问题和困惑的资源集合,旨在帮助初学者和有经验的开发者更好地理解和掌握Java语言。本文将深入探讨Java编程中的关键概念、常见问题以及解决方案。 1. **Java...

    Java解惑 布洛克 著;陈昊鹏 译

    《Java解惑》 布洛克 著;陈昊鹏 译 扫描清晰带目录,仅供参阅,请支持正版

    Java解惑.pdf

    这份“Java解惑.pdf”文档很可能包含了解决Java开发者在编程过程中遇到的常见问题和困惑的详细解答。以下是可能涵盖的一些Java相关知识点: 1. **基础语法**:Java的基础语法包括变量、数据类型、运算符、流程控制...

    java解惑 PDF版

    文档《java解惑 PDF版》中列举了95个这样的谜题,每个谜题都旨在帮助开发者理解并纠正一些常见的错误理解。以下是根据提供的部分内容解析的几个相关知识点。 ### 表达式谜题与取余操作符(%)的行为 在Java中,...

Global site tag (gtag.js) - Google Analytics