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的名字必須和文件名相同
10.
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來明確
11.
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”)出報錯