1.abstract class Test{
private String name;
public abstract boolean isTrueName(String name){}
}
这个题比较有混淆视听的感觉,他一上来给你来一个private修饰的成员变量!很过人会认为他有错,其实不对,他只是限制了子类对这个name属性的访问,但并不错
真正的错误出现在了这个抽象方法的最后那对大括号了,因为抽象方法不能够有带花括号!abstract method必须以分号结尾;
注意:抽象类也是可以有方法实现的,但是必须得有抽象方法的存在
2.public class Something{
void doSomething(){
private String s=" ";
int l=s.length();
}
}
此处的错误有点简单,就是局部变量前面不能有任何的访问修饰符(public ,protected和private)。final可以用来修饰局部变量
(final如同abstract和strictfp,都是非访问修饰符,strictfp只能修饰class和method而非variable)
strictfp, 即 strict float point (精确浮点)。
3.abstract class Something{
private abstract String doSomething();
}
这个很容易判断,因为访问修饰符private只能在本类中访问,但是抽象类是用来继承的,他的抽象方法是要子类实现的的,但是如果用private修饰了之后就不能被子类访问到了,所以此处的就错了
4.public class Something{
public int addOne(final int x){
return ++x;
}
}
这个错也是比较明显的,int x被修饰为了final,也就是说x不能在addOne method中被修改。
5.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的问题,
但是此题是对的,在addOne method中,参数o被修饰成final。如果在addOne method里我们修改了o的reference(比如o=new Other();),那么和上面一样是错的,但是这里面修改的是o的member vairable(成员变量),而o的reference并没有改变,所以正确
6.class Something{
int i;
public void doSomething{
syso(“i=" + i);
}
}
这个是没有错误的,请不要疑神疑鬼的看到面试题让找错就说有错,这个真没错!int i属于instant variable(实例变量,或叫成员变量).instant variable有default value。int的default value是0
7.class Something{
final int i;
public void doSomething(){
syso(”i=“+i);
}
}
这个就在成员变量前面加了一个final就错了,因为final修饰的成员变量没有默认值,必须在constructor(构造器)结束前被赋予明确的值,可以修改为final int i =0;
8.public class Something{
public static void main(String[] args){
Something s=new Something();
syso("s.doSomething() returns”+doSomething());
}
pulic String doSomething(){
return “Do something";
}
}
看上去还是不错的哦!但是还是错了!
乍一看,main方法里面调用了同一个类中的doSomething()方法,毕竟两个methods都在同一个class里,但是仔细看main方法是static的。staticmethod不能直接call non-static methods。
9.这个Something类文件名叫OtherThing.java
class Something{
private static void main(String[] something_to_do){
syso("Do something………………”);
}
}
这个好像很明显
正确,因为没有人说过java的Class名字必须和其文件名相同。但是public class的名字必须和文件名相同
interface A{
int x=0;
}
class B{
int x=1;
}
class C extends B implements A{
public void pX(){
syso(x);
}
public static void main(String[] args){
new C().pX();
}
}
错误,变异的时候就会发生错误,(未明确的X调用),父类还有是实现的接口中有有两个X都匹配(就像在同事import java.util和java.sql两个包时直接声明Date一样)。对于父类的变量,可以用super.x来明确,而接口的属性默认隐含为public static final 所以可以通过A.x来明确
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");
syso(ball.getName());
}
}
这个是容易忽略的错误
接口是可以多继承的,这个没有错误。问题处在了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”)出报错