1. 程式人生 > >Java程式設計思想——介面(default關鍵字)

Java程式設計思想——介面(default關鍵字)

今天讀到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");
//	}
	
	
}


古人學問無遺力,少壯工夫老始成。 紙上得來終覺淺,絕知此事要躬行。——陸游