今天讀到Java編程思想的接口這一章,我用的是jdk1.8,發現Java接口中有default這個關鍵字,馬上上網一查,原來是Java8中的新特性,然後就開始研究一下,寫下一點感悟。
package Dome01;
import org.junit.Test;
public class Domestically {
@Test
public void test(){
//1.不能生成一個抽象類的對象
// Gcenr g = new Gcenr();
Dmeno d = new Dmeno();
//11.實現該接口的類,會自動繼承接口中的默認方法(default),如同繼承其他類一樣
// d.dd();
d.qq();
d.ww();
}
}
//2.如果一個類繼承了一個抽象類,必須把抽象類中的抽象方法重寫
//3.如果子類繼承了抽象類,並沒有把抽象方法重寫成普通方法,那麼子類也是一個抽象類,需要加abstract修飾符
/*6.接口也一樣,需要把所有的抽象方法實現一遍;那麼問題來了:如果抽象類中的抽象方法也存在於接口中,分三種情況;
* 一是兩個抽象方法參數值,返回值一樣,那麼就會按照接口來,因爲子類實現接口的抽象方法,要大於接口的權限修飾符,只能是public;
* 二是兩個抽象方法返回值不同,參數相同,那麼編譯器就會報錯,因爲不知道調用哪一個方法來實現;(因爲還達不到重載的條件)
* 三是兩個抽象方法參數不同,這樣的情況該調用誰的方法,就調用誰的方法,相當於重載
* */
//12.接口中的static方法的調用:接口名.方法名
//14.default,static方法不強制實現,因爲已經是一個完整的方法了;
//
/**
* 15.Java8默認方法引出來的問題:
* 1.一個類實現了多個接口,而多個接口中都有相同的default方法,又回到6中提到的問題了,
* (1).兩個抽象方法參數值,返回值一樣,那麼必須要重寫這個方法,在方法裏面再調用各自的方法,調用方式爲:Ftecr.super.ww();
* (2).兩個抽象方法返回值不同,參數相同,那麼編譯器就會報錯,因爲不知道調用哪一個方法來實現;(與6 同樣的道理)
* (3).兩個抽象方法參數不同,這樣的情況該調用誰的方法,就調用誰的方法,兩個方法相當於重載
* 2.一個類實現了一個接口,同時繼承了一個抽象類,接口中的default方法同時存在於抽象類中,
* 這裏分兩大情況:1.抽象類中的方法沒有實現,是抽象方法,那麼跟上面的一樣;
* 2.抽象類中實現了這個方法,這種情況下多出一種
* (1).兩個抽象方法參數值,返回值一樣,不必重寫方法,因爲繼承抽象類自帶;相當於重寫
* (2).兩個抽象方法返回值不同,參數相同,那麼編譯器就會報錯,因爲不知道調用哪一個方法來實現;
* (3).兩個抽象方法參數不同,這樣的情況該用誰的方法,就用誰的方法,兩個方法不相同
* (4).兩個抽象方法參數值,返回值一樣,但是抽象類中的實現方法不是public修飾,會報錯,因爲對於接口來說修飾權限不夠
*
* 對於static方法,因爲調用它要用接口名.方法名,所以不存在這種問題
* */
class Dmeno extends Gcenr implements Ftecr,Fteted{
@Override
public void f() {
// TODO Auto-generated method stub
System.out.println("ffffff");
}
@Override
public void ss() {
// TODO Auto-generated method stub
}
@Override
void z() {
// TODO Auto-generated method stub
};
//7.實現的抽象方法要比接口的抽象方法權限大,所以要用public;
@Override
public void jj() {
// TODO Auto-generated method stub
}
@Override
public void f(String d) {
// TODO Auto-generated method stub
}
@Override
public void ww() {
// TODO Auto-generated method stub
Ftecr.super.ww();
Fteted.super.ww();
}
}
//4.抽象類中不一定有抽象方法,但有抽象方法的一定是抽象類;
//5.抽象類中可以有普通方法;
abstract class Gcenr{
abstract void f();
abstract void z();
void qq(){
System.out.println("qq");
}
//這裏用public
public void ww1(){
System.out.println("Gcenr-ww");
};
}
//接口
interface Ftecr{
abstract void f(String d);
abstract void ss();
//8.java8中的新特性,接口可以創建普通方法,但是要用default或者static修飾,而且只能用於接口中;
//9.可以有多個default,static修飾的方法;
//10.在接口中由default,static修飾的方法必須有完整的實現
//13.default,static修飾的方法相當於一個抽象類了,間接實現多繼承
public default void ww() {
System.out.println("Ftecr-ww");
}
public default void ww1() {
System.out.println("Ftecr-ww1");
}
public static void dd(){
}
public static void dd1(){
}
}
interface Fteted{
abstract void jj();
abstract void ss();
public default void ww(){
System.out.println("Fteted-ww");
}
public static void dd1(){
}
}
//接口不能實現接口,但是可以繼承另一個接口,接口的超類只能是接口,類的超類只能是類
interface Fteted01 extends Fteted{
// abstract void jj();
abstract void qss();
// public default void ww(){
// System.out.println("Fteted-ww");
// }
}
古人學問無遺力,少壯工夫老始成。
紙上得來終覺淺,絕知此事要躬行。——陸游