概論:
java接口可以是public 的,也可以是friendly的,但一定是abstracted的。
java接口里的方法只能是public的、abstract的。
java接口里的成員變量只能是public 的,static 的,final的;並且必須賦初值,否則通不過編譯。
C++支持多重繼承,如果兩個父類有相同的成員變量,處理起來比較困難。java 接口的成員變量之所以這樣設計,就是為了解決C++ 中的這個問題。成員變量必須是static 的,所以接口里的成員變量就不再屬於某個對象,而是屬於這個接口的。子類的對象里就沒有父類的這個成員變量。
那怎樣使用父類里的成員變量呢?
public interface Father { int i = 0; }
public interface Father2 { int i = 2; }
public class Son implements Father, Father2 { static int i = 3; public static void main(String[] args) { System.out.println(Father.i); System.out.println(Father2.i); System.out.println(i); } }
接口問題:
實現兩個接口,這兩個接口里有兩個簽名相同,返回值不同的方法。一個類同時實現,報錯。
package test;
public interface InterfaceTest {
void todo();
}
/**
* 以下是反編譯的內容,接口默認是abstract的,
* 接口里的方法默認都是public的、abstract的。
*
package test;
public abstract interface InterfaceTest {
public abstract void todo();
}
*/
上面用得是第三方的一個反編譯工具,
用 Eclipse 反編譯插件編譯后的結果卻不同,如下:
package test;
public interface InterfaceTest {
void todo();
}
接下來一探究竟:
1.創建一個java 接口:
public interface TestInterface {
void say();
}
2.為這個接口添加一個abstract 修飾符
public abstract interface TestInterface {
void say();
}
結果一切正常,它的實現類運行毫不影響。由此可知java接口默認就是abstract的。
3、去掉這個接口的public 修飾符
interface TestInterface {
void say();
}
不報錯;同包下的實現類運行正常;異包下的實現類通不過編譯。由此可知java接口本身可以是friendly的(但不可以是private 和protected 的,這和類的聲明是一致的)。
4、為這個接口里的一個方法添加private 修飾符
public interface TestInterface {
private void say();
}
通不過編譯。由此可知java接口里的方法不可以是private 的。
5、為這個接口里的一個方法添加protected 修飾符
public interface TestInterface {
protected void say();
}
通不過編譯。由此可知java接口里的方法不可以是protected 的。
6、為這個接口里的一個方法添加abstract 修飾符
public interface TestInterface {
abstract void say();
}
一切正常,它的實現類運行毫不影響。由此可知java接口里的方法默認就是abstract 的。
總結:
java接口本身默認是abstract的;可以是public的,也可以是friendly的,但不可以是private 的,不可以是protected的(否則通不過編譯)。
java接口里的方法默認是abstract的,public 的;不可以private 的,不可以是protected 的。
還得出一個結果,這個第三方的反編譯工具更准確。下載地址:https://i.cnblogs.com/Files.aspx 文件名:javaDecompiler.rar