1、
有错吗?
答案: [b]错[/b]。局部变量前不能放置任何访问修饰符 (private,public,和protected)。Final可以用来修饰局部变量(final如同abstract和strictfp,都是非访问修饰符,strictfp只能修饰class和method而非variable)。
2、
这个比较明显。
答案: [b]错[/b]。Int x被修饰成final,意味着x不能在addOne method中被修改。
3.
和上面的很相似,都是关于final的问题,这有错吗?
答案:[b] 正确[/b]。在addOne method中,参数o被修饰成final。如果在addOne method里我们修改了o的reference (比如: o = new Other();),那么如同上例这题也是错的。但这里修改的是o的member vairable(成员变量),而o的reference并没有改变。
4、
有什么错呢? 看不出来啊。
答案: [b]正确[/b]。输出的是"I = 0"。Int i属於instant variable (实例变量,或叫成员变量)。Instant variable有default value。Int的default value是0。
5.
和上面一题只有一个地方不同,就是多了一个final。这难道就错了吗?
答案: [b]错[/b]。Final int i是个final的instant variable (实例变量,或叫成员变量)。Final的instant variable没有default value,必须在constructor (构造器)结束之前被赋予一个明确的值。可以修改为"final int I = 0;"。
6、
答案:错误。在编译时会发生错误(错误描述不同的JVM有不同的信息,意思就是未明确的x调用,两个x都匹配(就象在同时import java.util和java.sql两个包时直接声明Date一样)。对于父类的变量,可以用super.x来明确,而接口的属性默认隐含为 public static final.所以可以通过A.x来明确。
7、
这个错误不容易发现。
答案: [b]错[/b]。"interface Rollable extends Playable, Bounceable"没有问题。Interface可继承多个interfaces,所以这里没错。问题出在interface Rollable里的"Ball ball = new Ball("PingPang");"。任何在interface里声明的interface variable (接口变量,也可称成员变量),默认为public static final。也就是说"Ball ball = new Ball("PingPang");"实际上是"public static final Ball ball = new Ball("PingPang");"。在Ball类的Play()方法中,"ball = new Ball("Football");"改变了ball的reference,而这里的ball来自Rollable interface,Rollable interface里的ball是public static final的,final的object是不能被改变reference的。因此编译器将在"ball = new Ball("Football");"这里显示有错。
public class Something {
void doSomething () {
private String s = "";
int l = s.length();
}
}
有错吗?
答案: [b]错[/b]。局部变量前不能放置任何访问修饰符 (private,public,和protected)。Final可以用来修饰局部变量(final如同abstract和strictfp,都是非访问修饰符,strictfp只能修饰class和method而非variable)。
2、
public class Something {
public int addOne(final int x) {
return ++x;
}
}
这个比较明显。
答案: [b]错[/b]。Int x被修饰成final,意味着x不能在addOne method中被修改。
3.
public class Something {
public static void main(String[] args) {
Other o = new Other();
new Something().addOne(o);
}
public void addOne(final Other o) {
o.i++;
}
}
class Other {
public int I;
}
和上面的很相似,都是关于final的问题,这有错吗?
答案:[b] 正确[/b]。在addOne method中,参数o被修饰成final。如果在addOne method里我们修改了o的reference (比如: o = new Other();),那么如同上例这题也是错的。但这里修改的是o的member vairable(成员变量),而o的reference并没有改变。
4、
class Something {
int I;
public void doSomething() {
System.out.println("I = " + i);
}
}
有什么错呢? 看不出来啊。
答案: [b]正确[/b]。输出的是"I = 0"。Int i属於instant variable (实例变量,或叫成员变量)。Instant variable有default value。Int的default value是0。
5.
class Something {
final int I;
public void doSomething() {
System.out.println("I = " + i);
}
}
和上面一题只有一个地方不同,就是多了一个final。这难道就错了吗?
答案: [b]错[/b]。Final int i是个final的instant variable (实例变量,或叫成员变量)。Final的instant variable没有default value,必须在constructor (构造器)结束之前被赋予一个明确的值。可以修改为"final int I = 0;"。
6、
Interface A{
int x = 0;
}
class B{
int x =1;
}
class C extends B implements A {
public void pX(){
System.out.println(x);
}
public static void main(String[] args) {
new C().pX();
}
}
答案:错误。在编译时会发生错误(错误描述不同的JVM有不同的信息,意思就是未明确的x调用,两个x都匹配(就象在同时import java.util和java.sql两个包时直接声明Date一样)。对于父类的变量,可以用super.x来明确,而接口的属性默认隐含为 public static final.所以可以通过A.x来明确。
7、
interface Playable {
void play();
}
interface Bounceable {
void play();
}
interface Rollable extends Playable, Bounceable {
Ball ball = new Ball("PingPang");
}
class Ball implements Rollable {
private String name;
public String getName() {
return name;
}
public Ball(String name) {
this.name = name;
}
public void play() {
ball = new Ball("Football");
System.out.println(ball.getName());
}
}
这个错误不容易发现。
答案: [b]错[/b]。"interface Rollable extends Playable, Bounceable"没有问题。Interface可继承多个interfaces,所以这里没错。问题出在interface Rollable里的"Ball ball = new Ball("PingPang");"。任何在interface里声明的interface variable (接口变量,也可称成员变量),默认为public static final。也就是说"Ball ball = new Ball("PingPang");"实际上是"public static final Ball ball = new Ball("PingPang");"。在Ball类的Play()方法中,"ball = new Ball("Football");"改变了ball的reference,而这里的ball来自Rollable interface,Rollable interface里的ball是public static final的,final的object是不能被改变reference的。因此编译器将在"ball = new Ball("Football");"这里显示有错。