Java-查漏补缺

12.Object的hashCode()和equals()方法的相互关系

    在JDK的API中规定Object类的hashCode()的原则如下:

  • 如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
  • 如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

    所以建议:重写hashCode()和equals()方法。且判断是否equals的所有因素应该尽可能和hashCode方法里的返回值一致(有联系)。

11.Java中String与byte[]的转换。

    注意:和外界交换任何信息都是以byte[]来进行的!,操作系统也有自己的编码表。

    Java是采用unicode编码(包含了我们中文编码),而我们中文汉字是采用GB2312编码,对了完成交互即,我用 

    unicode编码写入,你想要用其他编码(如GB2312)显示给你看,String提供了一个(,"编码字符集")来存储或查看

10.Java中的char是使用两个字节的,所以,超出assii码的数字范围,可能会打印出汉字。

9.静态代码块,构造代码块(重点),普通代码块(构造方法),同步代码块

      普通代码块: 跟在方法名后面的{.....}称为普通代码块。

      构造代码块:

                   在类中,前面没有任何前缀,后缀,仅是{.....}代码块。

                   在每个对象实例化(new)时,构造代码块都会有优于构造方法执行 , 实际上是

                   构造代码块的内容都会被系统自动添加到所有构造方法里面的最前面,才会出现了

                   构造代码块优于任何的构造方法执行。

           用途:(1)初始化实例变量(Instance Variable)

                      如果每个构造函数都要初始化变量,可以通过构造代码块来实现。当然也可以通过定义一个方法

                      然后在每个构造函数中调用该方法来实现,没错,可以解决,但是要在每个构造函数中都调用该方法,

                      而这就是其缺点,若采用构造代码块的方式则不用定义和调用,会直接由编译器写入到每个构造函数中

                      这才是解决此类问题的绝佳方式。

                        (2)初始化实例环境

                      一个对象必须在适当的场景下才能存在,如果没有适当的场景,则就需要在创建对象时创建此场景,

                      例如在JEE开发中,要产生HTTP Request必须首先建立HTTP Session,在创建HTTP Request时就可以

                      通过构造代码块来检查HTTP Session是否已经存在,不存在则创建之。

           优点:减少代码量,增强程序可读性

      静态代码块:在类被加载时(第一次实例化时),只会执行一次,且是最开始被执行的。

                   所以: A a=new A ();/执行顺序为:静态代码块-->构造代码块-->相应的构造方法。

 

7.封装是什么?为什么需要封装?封装的代码体现是什么?

    

    将相关的属性和方法封装到类里,将属性私有化,提供公共的方法供外界访问.

    封装的目的是为了数据的安全.

 

8:继承的关键字是什么?为什么需要继承?如何访问父类的成员?

   继承的出现打破了封装性.继承的关键字是extends.继承为了提高代码的可重用性.

   访问父类用的关键字是super:super访问构造方法时必须放在第一位.super不能作为实参.

1.成员变量和局部变量的默认值

         成员变量声明而为初始化赋值时,系统会自动为其赋值,默认是0,false,'\u0000',所以可以使用。

         而对于局部变量,系统不会为其初始化赋值,所以直接使用会报错。

        总结:成员变量可以不初始化,局部变量必须初始化

2.默认情况

       2.1,没有显示继承其他类的类,默认继承了Java的Object类

       2.2,返回值为void 的方法,其实在该方法体的最后默认写上了return;(只是隐藏起来了),所以

               在这方法里写return语句,只能放在最后一行。

       2.3,return的作用,在方法里,一是返回某个值(非void),二是结束方法(void)。在其他情况下是

             结束,不再执行下面的代码。注意:return 变量;可以在循环结构里直接跳出循环并返回值

       2.4,在类中,如果没有任何的构造方法,则默认有个无参数的构造方法, 且【注意】所有的无参数

             构造方法(无论是显式的还是隐式的)的第一句都隐藏了super()方法 , 即第一句是super()方法

             ,你只能覆盖掉它,如super(参数),即无论怎样第一句都有super(..)。所以子类继承父类后,

             如果父类没有无参数构造方法,则在子类的无参数构造方法里报错,因为子类它自动调用了

             super()方法去访问父类中的无参数方法。

       2.5,构造方法:只在new 对象(参数)时,相应的构造方法被调用。

3.final关键字使用规则 

      3.1 public static final 修饰的变量,必须在声明的同时赋值,否则报错。

      3.2 final修饰的成员变量,如果声明后不赋值,则只能在构造方法里显示赋一次的值。

            final修饰的局部变量,可以在方法体内声明后不赋值,在用之前赋一次值即可

      3.3 final标志的变量即变成常量,只能赋一次值。

4.object类

     equals()方法,wait()方法,notify()方法,notifyAll()方法,getClass()方法,finalize()方法

     toString()方法,System.out.print("info"+Person),Person类会自动调用它的toString方法

     toString方法会返回该对象的内存地址。

5.访问修饰符 

     4.1.private :只能被类的内部其他成员访问,注意:不能再方法体内声明变量的前面加private修饰符

                 子类可以继承父类的private变量,但是无法访问.

     4.2.默认修饰符:可以被同一包下的其他的类访问,如果子类与父类不在同一包下,则子类不可访问

                            父类的默认修饰符的成员

     4.3 protected :可以被同一包下的其他类访问,也可以被不同包下的子类访问

6.无法new出对象,即无法实例化有哪种情况

   1.抽象类,接口无法实例化

   2.构造方法是private修饰。

posted @ 2014-12-23 16:59  beyondbycyx  阅读(157)  评论(0编辑  收藏  举报