错题集02_牛客网

总结:

两同两小一大原则:

方法名相同,参数类型相同

子类返回类型小于等于父类方法返回类型, 
子类抛出异常小于等于父类方法抛出异常, 
子类访问权限大于等于父类方法访问权限。

  1.  本题是问关于接口,实现接口方法的约束和子类覆盖父类方法的约束基本上是一样的,但接口有一点特殊的地方是接口的方法默认是public abstract,

所以在实现接口方法的时候,也必须使用public
2. “子类抛出异常小于等于父类方法抛出异常”——不管父类抛出何种异常,子类可以不抛出任何异常。同样的,如果接口方法定义抛出某种异常,在实现这个接

口方法的时候,可以抛出小于等于接口方法异常的异常,也可以不抛出任何异常。

因此继承之中,返回值类型有可能不同

错题集02_牛客网_02

总结:

A错误,类的实例方法是与该类的实例对象相关联的,不能直接调用,只能通过创建超类的一个实例对象,再进行调用

B错误,当父类的类方法定义为private时,对子类是不可见的,所以子类无法调用

C错误,子类具体的实例方法对父类是不可见的,所以无法直接调用, 只能通过创建子类的一个实例对象,再进行调用

D正确,实例方法可以调用自己类中的实例方法

错题集02_牛客网_03

总结:

这道题里方法中修改值都是修改形参的值,区别是一个通过形参修改堆值,而另一个仅仅只是修改形参。

详细分析一下:

char[] ch = {'a','b','c'};是数组,数组存放在堆中,所以当方法通过形参修改值时会去堆中修改。当成员变量ch再去访问时,堆中的值已经修改,所以输出dbc。

而String str = new String("hello");会进行两步操作:

1、先在堆中创建一个指定的对象"hello",并让str引用指向该对象。

2、在常量池中 寻找或新建 一个”hello”,并让堆中对象与之关联。

所以当方法为形参赋值时(str="world";),只是为形参在常量池中新建一个”world”并引用,也只修改了形参,成员变量str本身未被修改。

所以,当new了除String以外的对象时,即便通过形参修改值也会去堆中修改。

所以,当String str = new String("hello");时产生了1-2个对象。

Java的栈、堆、常量池和方法区。

在jdk1.7已经将运行时常量池放入堆内存中了。栈存放引用;堆存放new对象和数组;常量池存放常量。方法区——方法中的局部变量,存放在方法运行时临时建立的方法栈中,其随着栈的销毁而结束

错题集02_牛客网_04

总结:

这里主要是有一点:

1
Math.ceil(d1) 

ceil 方法上有这么一段注释:If the argument value is less than zero but greater than -1.0, then the result is negative zero

如果参数小于0且大于-1.0,结果为 -0

1
Math.floor(d1)

ceil 和 floor 方法 上都有一句话:If the argument is NaN or an infinity or positive zero or negative zero, then the result is the same as  the argument,意思为:如果参数是 NaN、无穷、正 0、负 0,那么结果与参数相同,

如果是 -0.0,那么其结果是 -0.0

错题集02_牛客网_05

总结:

这题有两个错误的地方,第一个错误是 wait() 方法要以 try/catch 包覆,或是掷出 InterruptedException 才行   
因此答案就是因为缺少例外捕捉的   InterruptedException

第二个错误的地方是, synchronized 的目标与 wait() 方法的物件不相同,会有 IllegalMonitorStateException ,不过 InterruptedException 会先出现,所以这不是答案

最后正确的程式码应该是这样:   
     void waitForSignal() {

Object obj = new Object();

         synchronized (obj) {

             try {

obj.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

obj.notify();

}

}