`
achievo_bruce
  • 浏览: 117010 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java语言的26个细节01

    博客分类:
  • java
阅读更多
Java作为一门优秀的面向对象的程序设计语言,正在被越来越多的人使用。本文试图列出作者在实际开发中碰到的一些Java语言的容易被人忽视的细节,希望能给正在学习Java语言的人有所帮助。
1,位移运算越界怎么处理
    考察下面的代码输出结果是多少?
    int a=5;
    System.out.println(a<<33);
按照常理推测,把a左移33位应该将a的所有有效位都移出去了,那剩下的都是零啊,所以输出结果应该是0才对啊,可是执行后发现输出结果是10,为什么呢?因为Java语言对位移运算作了优化处理,Java语言对a<<b转化为a<<(b%32)来处理,所以当要移位的位数b超过32时,实际上移位的位数是b%32的值,那么上面的代码中a<<33相当于a<<1,所以输出结果是10。
在java语言中,位移操作共分三种,左位移(<<),右位移(>>)和无符号右位移(>>>)。如果将位移运算表示为公式的话,即n operator s。其中,operator表示上述的三种位移操作之一;n和s表示操作数,必须是可以转化成int类型的,否则出现运行时错误。n是原始数值,s表示位移距离。该公式的含义是n按照operator运算符含义位移s位。位移的距离使用掩码32(类似于子网掩码),即位移距离总是在0~31之间,超出这个范围的位移距离(包括负数)会被转化在这个范围里。也就是说真正的位移距离是n%32,所以唐老师的位移距离33实际上是1。n<<s的结果(无论是否溢出)总是等价于n与2的n%32次幂的乘积。在唐老师的例子里面,位移距离是33%32即1,2的1次幂是2,5与2的乘积是10.所以最终结果是10。对于右位移操作n<<s的结果(无论是否溢出)总是等价于n与2的n%32次幂的商。(以上内容参考java规范15.9)

2,可以让i!=i吗?
当你看到这个命题的时候一定会以为我疯了,或者Java语言疯了。这看起来是绝对不可能的,一个数怎么可能不等于它自己呢?或许就真的是Java语言疯了,不信看下面的代码输出什么?
  double i=0.0/0.0;
  if(i==i){
      System.out.println("Yes i==i");
  }else{
      System.out.println("No i!=i");
  }
上面的代码输出"No i!=i",为什么会这样呢?关键在0.0/0.0这个值,在IEEE 754浮点算术规则里保留了一个特殊的值用来表示一个不是数字的数量。这个值就是NaN("Not a Number"的缩写),对于所有没有良好定义的浮点计算都将得到这个值,比如:0.0/0.0;其实我们还可以直接使用Double.NaN来得到这个值。在IEEE 754规范里面规定NaN不等于任何值,包括它自己。所以就有了i!=i的代码。

3,怎样的equals才安全?
    我们都知道在Java规范里定义了equals方法覆盖的5大原则:reflexive(反身性),symmetric(对称性),transitive(传递性),consistent(一致性),non-null(非空性)。那么考察下面的代码:
public class Student{
    private String name;
    private int age;
    public Student(String name,int age){
        this.name=name;
        this.age=age;
    }
    public boolean equals(Object obj){
        if(obj instanceof Student){
            Student s=(Student)obj;
            if(s.name.equals(this.name) && s.age==this.age){
                return true;
            }
        }
        return super.equals(obj);
    }
}
你认为上面的代码equals方法的覆盖安全吗?表面看起来好像没什么问题,这样写也确实满足了以上的五大原则。但其实这样的覆盖并不很安全,假如Student类还有一个子类CollegeStudent,如果我拿一个Student对象和一个CollegeStudent对象equals,只要这两个对象有相同的name和age,它们就会被认为相等,但实际上它们是两个不同类型的对象啊。问题就出在instanceof这个运算符上,因为这个运算符是向下兼容的,也就是说一个CollegeStudent对象也被认为是一个Student的实例。怎样去解决这个问题呢?那就只有不用instanceof运算符,而使用对象的getClass()方法来判断两个对象是否属于同一种类型,例如,将上面的equals()方法修改为:
   public boolean equals(Object obj){
        if(obj.getClass()==Student.class){
            Student s=(Student)obj;
            if(s.name.equals(this.name) && s.age==this.age){
                return true;
            }
        }
        return super.equals(obj);
    }
  这样才能保证obj对象一定是Student的实例,而不会是Student的任何子类的实例。
分享到:
评论

相关推荐

    java语言的26个细节

    【Java语言的26个细节】涵盖了Java编程中的一些易被忽视或误解的要点,以下是对其中几个细节的详细说明: 1. **位移运算越界处理**:Java中的位移运算符`和`&gt;&gt;`在处理整型数据时,会进行优化。对于左移运算`a,当...

    Java语言的26个细节

    Java语言的26个细节是每一个Java开发者都应掌握的核心概念和最佳实践。这26个细节涵盖了语言特性、编程规范、性能优化以及错误处理等多个方面。以下是对这些细节的详细解析: 1. **自动装箱与拆箱**:Java 5引入了...

    Java语言规范中文版(第三版)

    本书由“java之父”Jame Gosling 以及... 本书侧重于java技术细节和内幕,全面,准确,详尽地介绍了java语言及其语法,论述了java编译器所要检查的语法和java运行模式的各个方面,同时还描述了java语言最重要的新特征。

    Java语言的26个细节[原创

    Java语言的26个细节[原创。。。。。。。。。。。。。。。

    一个桌面程序,通过游戏闯关的方式来了解一些java的语言细节 .zip

    一个桌面程序,通过游戏闯关的方式来了解一些java的语言细节 一个桌面程序,通过游戏闯关的方式来了解一些java的语言细节 一个桌面程序,通过游戏闯关的方式来了解一些java的语言细节 一个桌面程序,通过游戏闯关的...

    Java语言规范 基于Java SE 8

    如果你想知道Java语言构造的精确含义以及各种技术细节,本书是好的资谭。 本书全面、准确而详细地讨论TJava编程语言,是Java语言新版本的规范。全书从Java基础的文法、类型、变量到高级特性lambda表达式、线程与锁等...

    一个桌面程序,通过游戏闯关的方式来了解一些java的语言细节.zip

    一个桌面程序,通过游戏闯关的方式来了解一些java的语言细节.zip一个桌面程序,通过游戏闯关的方式来了解一些java的语言细节.zip一个桌面程序,通过游戏闯关的方式来了解一些java的语言细节.zip一个桌面程序,通过...

    Java语言规范

    Oracle官方发布,Java编程语言及规范创建人撰写,国内资深Java技术专家翻译,Amazon畅销书!, 基于最新Java SE 8,完整且准确地阐述Java编程语言..., 对每一个使用Java语言进行企业级开发的程序员都是不可或缺的资源。

    Java语言程序设计教程 张席

    《Java语言程序设计教程》是张席编著的一本针对初学者和进阶者的学习资料,这本书深入浅出地介绍了Java编程语言的核心概念和技术。Java作为一种广泛应用的编程语言,其强大的跨平台能力和丰富的类库使其在软件开发...

    Java语言规范和JVM规范官网文档

    总的来说,Java语言规范和JVM规范是每个Java开发者深入学习的基石。通过研究这些文档,开发者不仅能理解语言的细节,还能掌握JVM的运行机制,从而编写出更高效、更稳定的代码。无论是初学者还是经验丰富的开发者,都...

    java语言重要概述

    Java语言重要概述 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年发布。它的设计目标是具有跨平台性、可移植性、安全性和高效性,使得Java成为开发桌面应用、Web...

    国家开放大学Java语言程序设计形考任务4

    Java语言是目前世界上最流行的编程语言之一,尤其在企业级应用开发中占据主导地位。国家开放大学的"Java语言程序设计"课程旨在让学生掌握Java的基本概念、语法和编程技巧。形考任务4是这个课程的一个重要组成部分,...

    java语言的详细入门教程

    ### Java语言的详细入门教程 #### 1.1 Java语言的发展 ##### 1.1.1 Java语言的产生 Java语言起源于1990年代初的Sun Microsystems,由James Gosling...接下来,我们将在第二章中进一步探讨Java语言的开发环境和工具。

    java语言说明书

    Java语言说明书是一个全面涵盖Java编程语言的资源,旨在帮助开发者深入理解并熟练运用Java进行软件开发。Java,作为一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle Corporation的一部分)于1995...

    JAVA语言入门 电子书

    Java语言作为一种广泛使用的编程语言,深受开发者喜爱,尤其对于初学者来说,它是进入计算机编程世界的理想选择。本书《JAVA语言入门》旨在为新手提供全面、易懂的Java学习指南。.chm文件是一种Windows帮助文档格式...

Global site tag (gtag.js) - Google Analytics