promotion image of download ymail app
Promoted
Hsieh 發問時間: 電腦與網際網路程式設計 · 1 0 年前

java interface 的小疑問

interface action {

String name = "somn action";

void canfly();

void canrun();

}

abstract class animal implements action{};

class bird extends animal{

String name ="bird";

*public void canfly(){

System.out.println("bird flying");

}

*public void canrun(){}

}

class airplane extends animal{

String name ="airplane";

int price =100;

*public void canfly(){

System.out.println("airplane flying");

}

*public void canrun(){}

}

class interfacetry{

public static void main(String args[]){

bird b = new bird();

b.canfly();

System.out.println(b.name);

airplane a = new airplane();

a.canfly();

System.out.println(a.name);

}

}

(1)請問一下?我打星號的地方,為啥一定要加public,才可以implements,因為我之前都不習慣打public,因為我聽說我如果沒有特別強調,所有類別李的東西都自然設為public,而且我之前打過其他繼承的類別,都沒打public,都可以run出來!

(2)那我以後不管寫什們, 是不是一定要打public?

(3)puiblic到底定義是啥阿?

已更新項目:

不好意思耶!我還是不太懂耶!

我打星號的地方,我沒打public他就run不出來,打了public就可以,我不太了解為甚們一定要public

範圍存取修飾 是甚們?

可以寫成英文嗎?中文看不太懂耶!!

還有先謝謝兩位了!

2 個已更新項目:

所以就是說

不寫就是package

但interface的method必是public

要implements 我的interface 就必須強調為public 是嗎?

(簡單來說就是兩個格式要一樣的)??

3 個解答

評分
  • 1 0 年前
    最佳解答

    因為你 implements interface

    interface 的 method 一定是 public 範圍存取修飾,即使你沒寫。

    而 class 的 method 不寫 是 package 範圍存取修飾(範圍比 public 小)

    根據覆寫的規則,範圍存取修飾不能比父類別小,最少要等於。

    因此,你的 meyhod 在繼承時,即使父類別的 method 沒寫範圍存取修飾(那它就是 package 修飾),子類別的 method 覆寫沒寫範圍存取修飾也沒問題(也是 package 修飾,等於父類別)

    但是當你實作 interface 時,你就只能 public 了。

    2009-06-03 18:31:53 補充:

    範圍存取修飾 就是 public、protected、不寫(就是 package)、private

    要例子喔,那就以版主的例子好了

    interface action {

    String name = "somn action";

    void canfly();

    void canrun();

    }

    action 是 inyerface,canfly()可以是 public 或 不寫,protected、private,對不起,error。不寫,compiler 完 JVM 還是自動補上 public abstract,你要自己打上去當然也可。

    2009-06-03 18:36:47 補充:

    abstract class animal implements action{

    void move(){ //animal 自己的 method

    //more code

    }

    }

    animal 是 class,move()沒有"範圍存取修飾",那就是 package,或者自己更改為 protected、private 或 public 也可。

    2009-06-03 18:42:18 補充:

    class airplane extends animal{

    String name ="airplane";

    int price =100;

    *public void canfly(){

    System.out.println("airplane flying");

    }

    *public void canrun(){}

    }

    這是第一個非 abstract 的 class,所以必須實作所有的 abstract method。這必須遵守覆寫的規則,canrun()、canfly()都是在 interface 定義的,都是 public ,所以你也只能是 public(因為覆寫的規則)

    2009-06-03 18:48:03 補充:

    如果是覆寫 animal 的 move(),範圍存取修飾可以 public、protected 或 不寫,不寫,跟父類別同等級,可以,private,對不起,error

    2009-06-04 09:03:15 補充:

    不寫就是package

    >對 class 來說,是的

    >對 interface 來說,不是

    但interface的method必是public

    >是的

    2009-06-04 09:10:35 補充:

    要implements 我的interface 就必須強調為public 是嗎?

    (簡單來說就是兩個格式要一樣的)??

    =====

    所有的 method 都一定有一個 signature,一個完整的 signature 會有

    範圍存取修飾 回傳值 method名稱 參數

    例如:protected int getA() //這個例子指的是沒有參數

    所以不是強調,是"本來就要有"

    2009-06-04 09:18:30 補充:

    上面補充最後漏了 範圍存取修飾 幾個字

    只不過,根據覆寫規則,子類別的 method 的範圍存取修飾必須大於或等於父類別的 method 的範圍存取修飾,而 interface 的 method 的 範圍存取修飾 已經是 public 最大了,所以實作的 method 只能 public 了

    2009-06-04 09:24:25 補充:

    所以你打星號的地方,它都是屬於 class 所有,不寫,在 class,範圍存取修飾是 package,就違反覆寫原則了,當然錯

    • Commenter avatar登入以對解答發表意見
  • 就是只要是interface內的函式,即使不寫存取修識字(public、protected...等)及abstract,JVM會自動加上public abstratc,因此所有實作該interface的函式時,覆寫後的函式存取權限不得小於public,這是覆寫規則,如果不懂,請自行翻書或上網找資料,因為很基本!

    • Commenter avatar登入以對解答發表意見
  • 1 0 年前

    Ans:

    (1)介面只能擁有public 抽象方法

    (也可說介面中之方法,隱含宣告成public和abstract)

    (2)是

    (此題是因為又多了一個類別animal,混亂了你的思考;

    亦或以前至今你都不知道(1)的關系所至)

    (3)public就是公開(你打成puiblic了)

    ===

    2009-06-03 16:24:16 補充:

    TO:街王

    看不太懂你回答的說明,寫的有點深度了

    我資質比較不好~~可以說簡單一點或是打個比方??

    感謝

    2009-06-03 16:26:22 補充:

    補充

    (2)是(限介面)

    如果是abstract class時,裡面的method要實作時候

    是可有可無public 詞滴

    2009-06-03 16:31:12 補充:

    再補充

    (3)因為介面action中之所有method皆知必為public

    所以~~

    在類別implements介面時候

    簡單說類別中的方法就是要把介面的方法照抄~~

    (切記介面是隱含public了)

    2009-06-03 16:49:52 補充:

    ---

    這樣說好了~

    你先不要理會animal這個類別

    如果bird要implements介面action時候

    bird類別理所當然要實作action中的method~~

    到這還ok嗎???

    再來你把action介面看成下面這樣子

    interface action{

    String name = "somn action";

    public void canfly();

    public void canrun();

    }

    所以~

    在bird類別中你要實作action中的方法要怎麼做呢??

    沒錯~~把action介面中的方法照抄

    先這樣想之後再把animal類別加入來思考吧~我是這樣想滴

    有問題在說另當補上

    參考資料: me, me, me
    • Commenter avatar登入以對解答發表意見
還有問題?馬上發問,尋求解答。