错题集02
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了错题集02相关的知识,希望对你有一定的参考价值。
总结:
两同两小一大原则:
方法名相同,参数类型相同
子类返回类型小于等于父类方法返回类型,
子类抛出异常小于等于父类方法抛出异常,
子类访问权限大于等于父类方法访问权限。
本题是问关于接口,实现接口方法的约束和子类覆盖父类方法的约束基本上是一样的,但接口有一点特殊的地方是接口的方法默认是public abstract,
所以在实现接口方法的时候,也必须使用public
2. “子类抛出异常小于等于父类方法抛出异常”——不管父类抛出何种异常,子类可以不抛出任何异常。同样的,如果接口方法定义抛出某种异常,在实现这个接
口方法的时候,可以抛出小于等于接口方法异常的异常,也可以不抛出任何异常。
因此继承之中,返回值类型有可能不同
总结:
A错误,类的实例方法是与该类的实例对象相关联的,不能直接调用,只能通过创建超类的一个实例对象,再进行调用
B错误,当父类的类方法定义为private时,对子类是不可见的,所以子类无法调用
C错误,子类具体的实例方法对父类是不可见的,所以无法直接调用, 只能通过创建子类的一个实例对象,再进行调用
D正确,实例方法可以调用自己类中的实例方法
总结:
这道题里方法中修改值都是修改形参的值,区别是一个通过形参修改堆值,而另一个仅仅只是修改形参。
详细分析一下:
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对象和数组;常量池存放常量。方法区——方法中的局部变量,存放在方法运行时临时建立的方法栈中,其随着栈的销毁而结束
总结:
这里主要是有一点:
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
总结:
这题有两个错误的地方,第一个错误是 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();
}
}
以上是关于错题集02的主要内容,如果未能解决你的问题,请参考以下文章