大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

Java面向?qū)ο?/div>
Java異常
Java數(shù)組
Java常用類
Java集合
Java IO流
Java線程
Java反射
Socket編程
Java注解開發(fā)
Java GoF設(shè)計(jì)模式
HashMap
Java內(nèi)存模型
Java線性表

Java接口

Java接口概述

計(jì)算機(jī)中的接口有哪些? USB接口 , VGA接口,  耳機(jī)接口,  電源接口, HDMI高清接口,  Type-C接口, Thunder接口。

計(jì)算機(jī)通過這些接口可以連接不同的外設(shè), 擴(kuò)展了計(jì)算機(jī)的功能 , 計(jì)算機(jī)實(shí)現(xiàn)了某個(gè)接口,就具備了連接這個(gè)接口設(shè)備的功能, 沒有實(shí)現(xiàn)該接口就不具備該功能。

計(jì)算機(jī)中有USB插槽, 不管是鍵盤/鼠標(biāo)/硬盤/打印機(jī),只要有USB插頭就可以連接到電腦上, 這些設(shè)備是不同廠商生產(chǎn)的, 它們都遵循USB協(xié)議。

Java程序中的接口是用來(lái)擴(kuò)展類的功能的,可以把接口理解為功能的封裝, Java中的接口也可以理解為一個(gè)操作規(guī)范(協(xié)議)。

Java接口定義與實(shí)現(xiàn)

1.Java接口定義的語(yǔ)法:

[修飾符]   interface  接口名 {

接口中的方法默認(rèn)使用public abstract修飾

接口中的字段默認(rèn)使用 public static final修飾

接口中可以定義public static 靜態(tài)方法

定義public  default方法

}

2.Java接口的使用

[修飾符]  class  類名  implements  接口{

需要重寫接口的抽象方法

package com.wkcto.chapter01.interfaces.demo01;
/**
 * 定義飛行接口
 * 		封裝飛行功能
 * @author 蛙課網(wǎng)
 *
 */
public interface Flyable {
	//接口中的方法默認(rèn)使用public abstract修飾
	void fly();
	
}
package com.wkcto.chapter01.interfaces.demo01;
/**
 * 定義鳥類
 * 	一個(gè)類實(shí)現(xiàn)了接口,需要重寫接口中抽象方法
 * 
 * @author 蛙課網(wǎng)
 *
 */
public class Bird implements Flyable {

	@Override
	public void fly() {
		System.out.println("小鳥在天空中自由飛翔");
	}

}

練習(xí):定義接口封裝游泳功能, 魚會(huì)游泳, 小狗會(huì)游泳, 人會(huì)游泳。

Java接口多態(tài)

package com.wkcto.chapter01.interfaces.demo01;
/**
 * 1) 接口是一種引用數(shù)據(jù)類型,可以定義變量,但是接口不能實(shí)例化對(duì)象, 接口引用可以賦值實(shí)現(xiàn)類對(duì)象
 * 2) 接口多態(tài) , 通過接口引用調(diào)用接口中抽象方法,實(shí)際上執(zhí)行的是實(shí)現(xiàn)類對(duì)象的方法
 * 		接口存在的意義就是為了實(shí)現(xiàn)多態(tài).
 * 
 * @author 蛙課網(wǎng)
 *
 */
public class Test {

	public static void main(String[] args) {
		//1)接口定義變量
		Flyable flyable ;
		//2)接口不能實(shí)例化對(duì)象
//		flyable = new Flyable(); 		//Cannot instantiate the type Flyable
		//3)接口引用可以賦值實(shí)現(xiàn)類對(duì)象
		flyable = new Bird();
		flyable.fly();
		
		flyable = new Plane();
		flyable.fly();
		
	}

}
package com.wkcto.chapter01.interfaces.demo01;
/**
 * 測(cè)試彈弓可以把能飛的物體給射出去
 * @author 蛙課網(wǎng)
 *
 */
public class Test02 {

	public static void main(String[] args) {
		//創(chuàng)建彈弓對(duì)象
		Slingshot slingshot = new Slingshot();
		//創(chuàng)建鳥對(duì)象
		Bird bird = new Bird();
		slingshot.shoot(bird);
		
		//創(chuàng)建飛機(jī)對(duì)象
		Plane plane = new Plane();
		slingshot.shoot(plane);
		
	}

}
package com.wkcto.chapter01.interfaces.demo01;
/**
 * 彈弓類
 * 		可以把任何能飛物體給彈射出去
 * 
 * 經(jīng)常, 把接口的引用作為方法的形參, 在調(diào)用方法時(shí),傳遞接口實(shí)現(xiàn)類的對(duì)象
 * @author 蛙課網(wǎng)
 *
 */
public class Slingshot {
	//可以把任何能飛物體給彈射出去, 如果這個(gè)物體實(shí)現(xiàn)了Flyable飛行接口就能飛
	public void shoot( Flyable flyable ) {
		//實(shí)際上是物體 在飛
		flyable.fly();
	}
}

練習(xí):游泳館只接收會(huì)游泳的動(dòng)物來(lái)游泳。

Java接口說明

1.類實(shí)現(xiàn)了某個(gè)接口,需要重寫接口中的抽象方法,就具備了接口中定義的功能; 如果一個(gè)類實(shí)現(xiàn)了接口,沒有重寫接口中所有的抽象方法,這個(gè)類需要定義為抽象類。

2.一個(gè)類可以實(shí)現(xiàn)多個(gè)接口, 接口名之間使用逗號(hào)分隔, 這個(gè)類需要重寫所有接口中所有的抽象方法。

3.接口也能繼承,并且支持多繼承, 在子接口中可以擴(kuò)展接口的功能。

4.接口的內(nèi)容在JDK8中, 只包含四部分: public abstract默認(rèn)的方法, public static final默認(rèn)的字段, public static靜態(tài)方法, public default方法。

Java抽象類與接口的異同點(diǎn)

相同點(diǎn)

1.都可以定義抽象方法

2.都不能實(shí)例化對(duì)象

3.接口/抽象類的抽象方法都需要被重寫

4.接口/抽象類中都可以定義 public static final字段, public static靜態(tài)方法

不同點(diǎn)

1.意義不同

抽象類對(duì)類進(jìn)行更高層級(jí)的抽象

接口是對(duì)功能的封裝

2.定義方式不同

抽象類使用 abstract  class定義

接口使用interface定義

3.內(nèi)容不同

抽象類中除了可以定義抽象方法外, 還可以定義實(shí)例變量/實(shí)例方法/靜態(tài)變量/靜態(tài)方法,構(gòu)造方法等普通類所有的成員。

接口中除了抽象方法外, 還可以定義public static final字段, public static方法,public default方法 。

抽象類有構(gòu)造方法, 接口沒有構(gòu)造方法; 接口中可以使用default修飾方法,抽象類不能使用default修飾方法。

4.使用方式不同

抽象類一般作為父類存在, 需要子類通過extends繼承。

接口需要通過類implements實(shí)現(xiàn)。

5.繼承

類只支持單繼承, 接口支持多繼承

6.應(yīng)用場(chǎng)景不同

如果僅僅是為了擴(kuò)展類的功能,優(yōu)先選擇接口;

如果除了功能外,還需要保存不同的數(shù)據(jù),選擇抽象類,  抽象類中的抽象方法,需要在子類中重寫, 抽象類可以約束所有的子類都具有某個(gè)功能。

Java接口的應(yīng)用

1.接口就是功能的封裝

如在Flyable接口中封裝了fly()飛行功能, 如果類實(shí)現(xiàn)了Flyable接口,需要重寫fly()方法,就擴(kuò)展了類的功能。

如系統(tǒng)定義的Comparable接口, 封裝了比較兩個(gè)對(duì)象的功能, 如果一個(gè)類想要比較兩個(gè)對(duì)象的大小, 可以實(shí)現(xiàn)Comparable接口。

package com.wkcto.chapter01.interfaces.demo03;
/**
 * 定義Person類,
 * 	想要讓Person類的對(duì)象具有比較大小的功能, 可以通過實(shí)現(xiàn)Comparable接口完成這個(gè)需求
 * 	Comparable接口后面的<T>是一個(gè)泛型 ,泛型就是把數(shù)據(jù)類型作為參數(shù)
 * 		通過Comparable后面的泛型指定比較對(duì)象的數(shù)據(jù)類型
 * @author 蛙課網(wǎng)
 *
 */
public class Person implements Comparable<Person> {
	String name;
	int age;
	int height;
	
	/**
	 * 重寫接口的抽象方法, 指定比較規(guī)則
	 * 如果當(dāng)前對(duì)象比參數(shù)o對(duì)象大就返回正數(shù),  如果當(dāng)前對(duì)象小于參數(shù)對(duì)象返回負(fù)數(shù), 如果兩個(gè)對(duì)象相等返回0
	 */
	@Override
	public int compareTo(Person o) {
		//在該方法中,指定比較規(guī)則,根據(jù)年齡比較
		return this.age - o.age;
	}

	public Person(String name, int age, int height) {
		super();
		this.name = name;
		this.age = age;
		this.height = height;
	}

	
}

2.接口可以理解為一組操作規(guī)范(一個(gè)協(xié)議)

百度新聞包含首頁(yè)/體育/游戲/女人/汽車等模塊, 不管哪個(gè)模塊都有添加新聞,刪除新聞,修改新聞,查詢新聞. 可以把這些功能定義在一個(gè)接口中, 不同的模塊通過實(shí)現(xiàn)這個(gè)接口來(lái)統(tǒng)一他們的操作。

提倡面向接口的編程

1.接口的使用比較靈活, 一個(gè)類在繼承父類的同時(shí),可以實(shí)現(xiàn)多個(gè)接口

描述打工的學(xué)生, 打工的學(xué)生既有學(xué)生的特點(diǎn),又有工人的特征,如果允許類的多繼承的話,可以直接讓打工的學(xué)生同時(shí)繼承學(xué)生類與工人類。

Java不允許多繼承, 可以讓打工的學(xué)生繼承學(xué)生類, 把打工這個(gè)操作定義為接口, 打工的學(xué)生實(shí)現(xiàn)打工接口。

描述了打工的學(xué)生,從某種程度上,還能解決類的多繼承問題

package com.wkcto.chapter01.interfaces.demo04;
/**
 * 定義學(xué)生類,作為父類
 * @author 蛙課網(wǎng)
 *
 */
public class Student {
	String name;
	
	public void study() {
		System.out.println("學(xué)生的本職工作是學(xué)習(xí)");
	}
}
package com.wkcto.chapter01.interfaces.demo04;
/**
 * 定義工作接口
 * @author 蛙課網(wǎng)
 *
 */
public interface Workable {
	void  work();
}
package com.wkcto.chapter01.interfaces.demo04;
/**
 * 打工的學(xué)生類
 * 		在繼承Student類的同時(shí),實(shí)現(xiàn)Workable接口
 * @author 蛙課網(wǎng)
 *
 */
public class PartTimeStudent extends Student implements Workable, Singable {

	//重寫接口中的抽象方法
	@Override
	public void work() {
		System.out.println("兼職服務(wù)員,日結(jié),工資800~1500");
	}

	@Override
	public void sing() {
		System.out.println("學(xué)生參加了中國(guó)好聲音");
	}

}

練習(xí)1

1.描述帶橡皮的鉛筆,鉛筆是一種筆,有擦除的功能。

2.接口比較容易擴(kuò)展, 可以實(shí)現(xiàn)代碼的可插拔

經(jīng)常把接口的引用作為方法的形參, 在調(diào)用方法時(shí),可以傳遞各種實(shí)現(xiàn)類對(duì)象

彈弓可以彈射能飛的物體, 游泳館只接收會(huì)游泳的動(dòng)物

3.接口可以使項(xiàng)目分層

一臺(tái)計(jì)算機(jī)可以實(shí)現(xiàn)很多不同的接口, 接口比較靈活

計(jì)算機(jī)的USB插槽, 只要有USB插頭的設(shè)備就可以連接到電腦上, 接口易擴(kuò)展

生產(chǎn)電腦的廠商有聯(lián)想/Dell/華碩等, 生產(chǎn)USB設(shè)備的也有很多不同的廠商, 使項(xiàng)目分層

在上圖的模型中, 通過接口把項(xiàng)目簡(jiǎn)單的分為兩層, 一個(gè)團(tuán)隊(duì)負(fù)責(zé)開發(fā)業(yè)務(wù)邏輯,一個(gè)小組負(fù)責(zé)開發(fā)數(shù)據(jù)庫(kù)的操作及優(yōu)化, 對(duì)開發(fā)人員的要求降低了;當(dāng)數(shù)據(jù)庫(kù)發(fā)生變化后,只需要由數(shù)據(jù)庫(kù)的開發(fā)人員定義一個(gè)專門的操作數(shù)據(jù)庫(kù)的類即可, 業(yè)務(wù)邏輯代碼不需要更改。

package com.wkcto.chapter01.interfaces.demo05;
/**
 * 定義操作數(shù)據(jù)庫(kù)的接口
 * 	在接口中定義一組操作數(shù)據(jù)庫(kù)的規(guī)范
 * @author 蛙課網(wǎng)
 *
 */
public interface DaoService {
	void add();			//向數(shù)據(jù)庫(kù)中添加數(shù)據(jù)
	void delete();		//刪除數(shù)據(jù)
	void update();		//修改數(shù)據(jù)
	void list();		//顯示所有數(shù)據(jù)
}
package com.wkcto.chapter01.interfaces.demo05;
/**
 * 業(yè)務(wù)邏輯模塊1
 * 		操作數(shù)據(jù)庫(kù), 通過DaoService接口實(shí)現(xiàn)
 * @author 蛙課網(wǎng)
 *
 */
public class LogicModel1 {
	DaoService dao; 			//定義一個(gè)接口的引用
	
	//添加數(shù)據(jù)
	public void addData() {
		System.out.println("業(yè)務(wù)邏輯模塊1, 需要向數(shù)據(jù)庫(kù)中添加數(shù)據(jù)");
		dao.add();
	}
	
	//刪除數(shù)據(jù)
	public void deleteData() {
		System.out.println("業(yè)務(wù)邏輯模塊1, 需要從數(shù)據(jù)庫(kù)中刪除數(shù)據(jù)");
		dao.delete();
	}
	
	//修改數(shù)據(jù)
	public void updateData() {
		System.out.println("業(yè)務(wù)邏輯模塊1, 需要在數(shù)據(jù)庫(kù)中修改數(shù)據(jù)");
		dao.update();
	}
	
	//顯示所有數(shù)據(jù)
	public void listAllData() {
		System.out.println("業(yè)務(wù)邏輯模塊1, 需要從數(shù)據(jù)庫(kù)中顯示所有數(shù)據(jù)");
		dao.list();
	}
}
package com.wkcto.chapter01.interfaces.demo05;
/**
 * 定義一個(gè)操作MySQL數(shù)據(jù)庫(kù)的類, 需要實(shí)現(xiàn)DaoServic接口
 * @author 蛙課網(wǎng)
 *
 */
public class MySqlDaoImpl implements DaoService {

	@Override
	public void add() {
		System.out.println("向MySQL數(shù)據(jù)庫(kù)中添加數(shù)據(jù)");
	}

	@Override
	public void delete() {
		System.out.println("從MySQL數(shù)據(jù)庫(kù)中刪除數(shù)據(jù)");
	}

	@Override
	public void update() {
		System.out.println("在MySQL數(shù)據(jù)庫(kù)中修改數(shù)據(jù)");
	}

	@Override
	public void list() {
		System.out.println("從MySQL數(shù)據(jù)庫(kù)中查詢所有數(shù)據(jù)");
	}

}
package com.wkcto.chapter01.interfaces.demo05;
/**
 * 測(cè)試業(yè)務(wù)邏輯模塊操作數(shù)據(jù)庫(kù)
 * @author 蛙課網(wǎng)
 *
 */
public class Test {

	public static void main(String[] args) {
		LogicModel1 model1 = new LogicModel1();
		
		//需要配置業(yè)務(wù)邏輯模塊中dao接口引用 
//		model1.dao = new MySqlDaoImpl();
		//如果數(shù)據(jù)庫(kù)由MySQL換為Oracle, 需要定義一個(gè)操作ORacle數(shù)據(jù)庫(kù)的類,修改業(yè)務(wù)邏輯模塊 dao接口的配置
		model1.dao = new OracleDaoImpl();		
		
		model1.addData();
		model1.updateData();
		model1.deleteData();
		model1.listAllData();
		
	}

}

練習(xí)2

模擬所有動(dòng)物都可以使用自己的交流方式進(jìn)行交流, 人說人話,狗說狗語(yǔ)。

package com.wkcto.chapter01.interfaces.demo06;
/**
 * 定義說話方式接口
 * @author 蛙課網(wǎng)
 *
 */
public interface Speakable {
	void speak(); 			//說話
}
package com.wkcto.chapter01.interfaces.demo06;
/**
 * 汪語(yǔ)
 * 	是一種說話方式
 * @author 蛙課網(wǎng)
 *
 */
public class WangWang implements Speakable {

	@Override
	public void speak() {
		System.out.println("汪汪汪~~~~");
	}

}
package com.wkcto.chapter01.interfaces.demo06;
/**
 * 定義動(dòng)物類
 * 	每個(gè) 動(dòng)物都有自己的說話方式
 * 	動(dòng)物可以使用自己的說話方式進(jìn)行交流
 * @author 蛙課網(wǎng)
 *
 */
public abstract class Animal {
	Speakable  speakable; 		//每個(gè) 動(dòng)物都有自己的說話方式
	
	public Animal(Speakable speakable) {
		super();
		this.speakable = speakable;
	}

	//可以使用自己的說話方式進(jìn)行交流
	public void talk() {
		speakable.speak();
	}
}
package com.wkcto.chapter01.interfaces.demo06;
/**
 * 小狗是一種動(dòng)物
 * @author 蛙課網(wǎng)
 *
 */
public class Dog extends Animal {
	
	public Dog(Speakable speakable) {
		super(speakable);
	}

}
package com.wkcto.chapter01.interfaces.demo06;
/**
 * 測(cè)試每種動(dòng)物可以使用自己的說話方式進(jìn)行交流
 * @author 蛙課網(wǎng)
 *
 */
public class Test {

	public static void main(String[] args) {
		
		WangWang wangWang = new WangWang(); 		//小狗的說話方式 		
		Dog dahuang = new Dog(wangWang);			//在創(chuàng)建小狗對(duì)象時(shí),需要指定它的說話方式
		dahuang.talk();
		
		MiaoMiao miaoMiao = new MiaoMiao();
		Cat mimi = new Cat(miaoMiao);
		mimi.talk();
		
		
	}

}
主站蜘蛛池模板: 亚洲图片国产日韩欧美 | 99国产国人青青视频在线观看 | 性欧美久久 | 精品久久香蕉国产线看观看亚洲 | 国产成人一区二区三中文 | 色在线观看视频 | 久久综合九色欧美综合狠狠 | 欧美性猛交xx乱大交 | 久久影院精品 | 色综合久久久 | 中文字幕在线免费观看视频 | 国产美女精品在线 | 久久se精品一区二区影院 | 奇米第四色888 | 特级毛片aaaa级毛片免费 | 热99re久久国超精品首页 | 在线日韩亚洲 | 99久久久久国产精品免费 | 国产免费不卡视频 | 天天搞夜夜爽 | 免费欧洲毛片a级视频老妇女 | 99久久一区| 免费国产成人高清在线观看麻豆 | 精品久久久久久中文字幕欧美 | 中文字幕一区二区三区四区 | 青草小视频 | 国产一区二区在线播放 | 久久综合视频网 | 国产一区亚洲欧美成人 | 亚洲合集综合久久性色 | 一极毛片| 九九视频在线观看视频 | 四虎影视最新网址 | 四虎黄色影院 | 91久久国产成人免费观看资源 | 国产第一色 | 99re热久久精品这里都是精品 | 伊人精品在线 | 亚洲欧美日韩国产综合高清 | 欧美在线香蕉在线现视频 | 激情五月婷婷基地 |