OCJP8题库解析(2)

发布于 2018-01-29  1.34k 次阅读


下文所有字符仅为个人观点,如有错误恳请指正。

All the characters below is a personal opinion, if there is any mistake, please correct me.

 

51)关于子类与父类之间类型转换的问题:

  • 父类→子类:当一个父类对象初始化是使用子类构造器时,在后续操作中可是使用强制类型转换成子类对象,虽然不报错但是编译器会提示没有意义,因为在使用子类构造器实例化的同时,在编译器中该对象就已经是子类对象的一个实例了(可以使用getClass方法查看)。
  • 子类→父类:不可行,将损失精度。
  • 调用一个对象的方法时,编译器将从对象本身所属的那个类开始查找是否拥有该方法,若有则调用,若没有则向上查找其父类是否拥有该方法,如此循环。

52)略。

53)List是一个接口,而ArrayListList接口的一个实现类。

54)printf方法默认使用toString转为字符串,toSting未重写的情况下继承与Object类返回的是变量地址。

55)concat方法返回的字符串需要变量接收。

56)57)58)略。

59)正确答案应为A,详见第51题。

60)略。

61)

  • A选项首先i变量没有作用,其次会重复打印。
  • C选项将会数组越界,变量j未减一。
  • i变量重复自加,导致漏打印。

62)63)略。

64)泛型不能使用基础类型。

65)66)答案出错,正确答案为A。

67)由于不能减少所以kwh变量必须大于0。

68)69)70)略。

71)LocalDate是java8中新增的一个不可变的日期时间对象,该类不存储或表示时间或时区。 相反,它是日期的描述,用于生日。 它不能代表时间线上的即时信息,而没有附加信息,如偏移或时区。plus方法将返回一个增加了指定偏移量的该日期的副本。

Period是java8中新增处理本地日期时间偏移的主要类。ofDays是该类下的一个静态方法,将获得Period代表的天数,即一个偏移量。

72)73)略。

74)this方法与super方法都必须处于构造方法的第一行,冲突导致出错。

75)略。

76)编译器无法预判断if语句的条件是否为真,则提示p,b,h未初始化,若将if条件改成true编译通过。

77)正确答案应为A,详见第51题。

78)79)略。

80)正确选项为ABE

  • 选项C:只有静态变量属于类本身可以在类中直接调用,fvar需要改成t.fvar。
  • 选项D:this方法无法在静态方法中使用。
  • 选项E:静态变量可以通过类名.变量名直接调用。
  • 选项F:同选项D。

81)翻译一下解析:LocalTime是一个接口,因此我们不能对其使用new关键字,排除A和B选项。

为了得到当前时间我们可以调用LocalTime接口的now方法,选项D错误的原因是LocalTime中并没有名为today的方法。

82)

  • Throwable是 Java 语言中所有错误或异常的超类。下一层分为ErrorException
  • Error类是指java运行时系统的内部错误和资源耗尽错误。应用程序不会抛出该类对象。如果出现了这样的错误,除了告知用户,剩下的就是尽力使程序安全的终止。
  • Exception又有两个分支,一个是运行时异常RuntimeException,如:NullPointerExceptionClassCastException;一个是检查异常CheckedException,如I/O错误导致的IOExceptionSQLException
  • RuntimeException是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。

83)高精度数据类型不能向低精度转换。详见http://blog.csdn.net/gulingfengze/article/details/54094193

84)数组越界异常,捕获后继续执行打印方法。

85)86)略。

87)答案应为E,boolean类型默认值为false。

88)Java7的新特性:

从Java7开始,你就可以在你的Java代码里把长整型数字比如10000000000写成一个更具可读性10_000_000_000。在字面常量数字中加下划线的一个重要的原因是避免一些难以通过看代码来发现的细微的错误。对比10000000000 和1000000000,我们很难发现少了一个0或多了一个0,但对于10_000_000_000和1_000_000_000却不然。

89)90)91)略。

92)关于Java类的初始化顺序:

  1. 初始化类变量(即static修饰的成员变量),并未赋值。不管写的位置在哪里,只要是类变量,系统总会先找到它进行变量初始化。
  2. 执行静态代码块和类变量定义式,两者根据写的位置来决定先后,先写先执行。其实从某种角度上看,可以把类变量定义赋值视为两部分:一部分是定义变量,一部分赋值。而这个赋值部分可以看做是一个静态代码块。两个静态代码块的执行顺序自然是看写的位置的先后了。
  3. 初始化实例变量(即未被static修饰的成员变量),并未赋值。同样的,不管写的位置在哪里,在创建对象时执行到这步时,系统总会找到它进行变量初始化。
  4. 执行构造代码块和实例变量定义赋值式,两者同样根据写的位置先后来决定执行顺序先后,同样可以按2中所写来理解。但是,这里要注意的就是构造代码块是可以调用静态变量的,实例变量定义赋值式可以看做是只对实例变量进行赋值的构造代码块。
  5. 执行构造函数。构造函数同样可以调用静态变量和实例变量。
    初始化结束。
    这里说明一点:这是初始化顺序,不等同于语句程序的执行过程(毕老师的视频里有个很详细的例子讲这个执行过程,不知道的一定要去看)。因此在上面的初始化顺序里没有成员函数(静态或者非静态都没有),这是因为成员函数都是调用了才执行,虽然静态函数已经被加载进了方法区,但初始化过程中并没有执行过。
  6. 如果有父类,父类先进行以上循环。

93)94)95)96)97)98)99)略。

100)重新指向新的数组后,为赋值的元素为int类型默认值(0)。


面向ACG编程