為什么要使用interface,而不是直接使用實體類來完成任務饭望?Interface和Impl這種方式的好處是什么仗哨?

1.背景介紹

接口是什么?

接口杰妓,在Java中是一個抽象類型藻治,是抽象方法的集合碘勉。接口通常以interface來聲名巷挥。一個類通過繼承接口的方式,從而來繼承接口的抽象方法验靡。接口嚴格意義上來講屬于一個特殊的類倍宾,而這個類里面只有抽象方法和全局常量,就連構(gòu)造方法也沒有胜嗓。

高职,比如我們約定某些英雄是物理系英雄,那么他們就一定能夠進行物理攻擊辞州。實現(xiàn)某個接口怔锌,就相當于承諾了某種約定。所以實現(xiàn)某個接口变过,就必須提供那個接口中的方法埃元,實現(xiàn)在語法上使用關(guān)鍵字implements

2.知識剖析

接口的特點:??

1、Java接口中的成員變量默認都是public,static,final類型的(都可省略),必須被顯示初始化,即接口中的成員變量為常量(大寫,單詞之間用"_"分隔)

2媚狰、Java接口中的方法默認都是public,abstract類型的(都可省略),沒有方法體,不能被實例化

3岛杀、Java接口中只能包含public,static,final類型的成員變量和public,abstract類型的成員方法

4、接口中沒有構(gòu)造方法,不能被實例化

5崭孤、一個接口不能實現(xiàn)(implements)另一個接口,但它可以繼承多個其它的接口

6类嗤、Java接口必須通過類來實現(xiàn)它的抽象方法

7糊肠、當類實現(xiàn)了某個Java接口時,它必須實現(xiàn)接口中的所有抽象方法,否則這個類必須聲明為抽象類

8、不允許創(chuàng)建接口的實例(實例化),但允許定義接口類型的引用變量,該引用變量引用實現(xiàn)了這個接口的類的實例

9遗锣、一個類只能繼承一個直接的父類,但可以實現(xiàn)多個接口,間接的實現(xiàn)了多繼承.

Interface和Impl這種方式的好處是什么货裹?

便于封裝;降低耦合精偿;對修改封閉泪酱,對拓展開放。

3.常見問題

接口使用原則:

? ?1)接口必須要有子類还最,但此時一個子類可以使用implements關(guān)鍵字實現(xiàn)多個接口

2)接口的子類(如果不是抽象類)墓阀,那么必須要覆蓋重寫接口中的全部抽象方法

3)接口的對象可以利用子類對象的向上轉(zhuǎn)型進行實例化

4.擴展思考討論

接口和抽象類的區(qū)別?

一個抽象類只能繼承一個抽象父類拓轻,而接口可以繼承多個接口

一個子類只能繼承一個抽象類斯撮,卻可以實現(xiàn)多個接口

接口實現(xiàn)的基礎——對象轉(zhuǎn)型和多態(tài)

對象轉(zhuǎn)型

package?fourth.com;

public class?Quadrangle?{

public static void?draw(Quadrangle?q){

System.out.println("hello world");

? ?}

}

package?fourth.com;

public class?Parallelogram?extends?Quadrangle{

public static void?main(String?args[]){

Parallelogram?p?=?new?Parallelogram();//這就相當于"Quadrangle obj=new Parallelogram()",就是把子類對象賦值給父類類型的變量扶叉,這就是向上轉(zhuǎn)型

? ? ? ?draw(p);

? ?}

}

多態(tài)

package?fourth.com;

public class?Second?{

private?Second[]?qtest?=?new?Second[6];

private int?nextIndex?=?0;

public void?draw(Second?q){

if(nextIndex

qtest[nextIndex] = q;

? ? ? ? ? ?System.out.println(nextIndex);

? ? ? ? ? ?nextIndex++;

? ? ? ?}

}

public static void?main(String[] args) {

Second?q?=?new?Second();

? ? ? ?q.draw(new?Third());

? ? ? ?q.draw(new?Fourth());

? ?}

}

package?fourth.com;

public class?Third?extends?Second{

public?Third(){

System.out.println("正方形");

? ?}

}

package?fourth.com;

public class?Fourth?extends?Second{

public?Fourth(){

System.out.println("平行四邊形");

? ?}

}

5.編碼實戰(zhàn)

package?fourth.Dao;

import?fourth.com.student;

public interface?studentDao?{

public int?addStudent(student?student);

public int?updateStudent(String?name);

public int?deleteStudent(String?name);

public?student?findStudent(student?student);

}

package?fourth.imple;

import?fourth.com.*;

import?fourth.Dao.studentDao;

import?com.mysql.jdbc.Connection;

import?com.mysql.jdbc.PreparedStatement;

import?java.sql.ResultSet;

public class?createStudent?implements?studentDao{

@Override

? ?public int?addStudent(student?student) {

Connection?conn?=?null;

? ? ? ?PreparedStatement?ps?=?null;

int?i=?0;

try?{

conn?= (Connection)?mysqlConnect.getconnection();

? ? ? ? ? ?String?sql?=?"insert into student values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

? ? ? ? ? ?ps?= (PreparedStatement)?conn.prepareStatement(sql);

? ? ? ? ? ?ps.setInt(1,student.getId());

? ? ? ? ? ?ps.setString(2,student.getCreate_at());

? ? ? ? ? ?ps.setString(3,student.getUpdate_at());

? ? ? ? ? ?ps.setString(4,student.getName());

? ? ? ? ? ?ps.setString(5,student.getDailyLink());

? ? ? ? ? ?ps.setInt(6,student.getQQ());

? ? ? ? ? ?ps.setString(7,student.getOnlineNumber());

? ? ? ? ? ?ps.setString(8,student.getMail());

? ? ? ? ? ?ps.setInt(9,student.getPhone());

? ? ? ? ? ?ps.setString(10,student.getEnrollmentTime());

? ? ? ? ? ?ps.setString(11,student.getProfessionType());

? ? ? ? ? ?ps.setString(12,student.getBrotherName());

? ? ? ? ? ?ps.setString(13,student.getPromise());

? ? ? ? ? ?i?=?ps.executeUpdate();

? ? ? ?}catch?(Exception?e){

e.printStackTrace();

? ? ? ?}finally?{

mysqlConnect.free(null,ps,?conn);

? ? ? ? ? ?System.out.println("close mysqlConnection");

? ? ? ?}

return?i;

? ?}

@Override

? ?public int?updateStudent(String?name) {

Connection?conn?=?null;

? ? ? ?PreparedStatement?ps?=?null;

int?i?=?0;

try?{

conn?= (Connection)?mysqlConnect.getconnection();

? ? ? ? ? ?String?sql?=?"update student set promise = '一姐最胖' where name=?";

? ? ? ? ? ?ps?= (PreparedStatement)?conn.prepareStatement(sql);

? ? ? ? ? ?ps.setString(1,name);

? ? ? ? ? ?i?=?ps.executeUpdate();

? ? ? ?}catch?(Exception?e){

e.printStackTrace();

? ? ? ?}finally?{

mysqlConnect.free(null,ps,?conn);

? ? ? ? ? ?System.out.println("close mysqlConnection");

? ? ? ?}

return?i;

? ?}

@Override

? ?public int?deleteStudent(String?name) {

Connection?conn?=?null;

? ? ? ?PreparedStatement?ps?=?null;

int?i?=?0;

try?{

conn?= (Connection)?mysqlConnect.getconnection();

? ? ? ? ? ?String?sql?=?"delete from student where name=?";

? ? ? ? ? ?ps?= (PreparedStatement)?conn.prepareStatement(sql);

? ? ? ? ? ?ps.setString(1,name);

? ? ? ? ? ?i?=?ps.executeUpdate();

? ? ? ?}catch?(Exception?e){

e.printStackTrace();

? ? ? ?}finally?{

mysqlConnect.free(null,ps,conn);

? ? ? ? ? ?System.out.println("close mysqlConnection");

? ? ? ?}

return?i;

? ?}

@Override

? ?public?student?findStudent(student?student) {

Connection?conn?=?null;

? ? ? ?PreparedStatement?ps?=?null;

? ? ? ?student?stu?=?null;

? ? ? ?ResultSet?rs?=?null;

try?{

conn?= (Connection)?mysqlConnect.getconnection();

? ? ? ? ? ?String?sql?=?"select?*?from student where ID=? ";

? ? ? ? ? ?ps?= (PreparedStatement)?conn.prepareStatement(sql);

? ? ? ? ? ?ps.setInt(1,student.getId());

? ? ? ? ? ?rs?=?ps.executeQuery()?;

? ? ? ? ? ?stu?=?new?student();

while?(rs.next()){

stu.setId(rs.getInt(1));

? ? ? ? ? ? ? ?stu.setCreate_at(rs.getString(2));

? ? ? ? ? ? ? ?stu.setUpdate_at(rs.getString(3));

? ? ? ? ? ? ? ?stu.setName(rs.getString(4));

? ? ? ? ? ? ? ?stu.setDailyLink(rs.getString(5));

? ? ? ? ? ? ? ?stu.setQQ(rs.getInt(6));

? ? ? ? ? ? ? ?stu.setOnlineNumber(rs.getString(7));

? ? ? ? ? ? ? ?stu.setMail(rs.getString(8));

? ? ? ? ? ? ? ?stu.setPhone(rs.getInt(9));

? ? ? ? ? ? ? ?stu.setEnrollmentTime(rs.getString(10));

? ? ? ? ? ? ? ?stu.setProfessionType(rs.getString(11));

? ? ? ? ? ? ? ?stu.setBrotherName(rs.getString(12));

? ? ? ? ? ? ? ?stu.setPromise(rs.getString(13));

? ? ? ? ? ?}

}catch?(Exception?e){

e.printStackTrace();

? ? ? ?}finally?{

mysqlConnect.free(null,ps,conn);

? ? ? ?}

return?student;

? ?}

}

6更多討論

1)接口有什么修飾符勿锅?

接口就是提供一種統(tǒng)一的”協(xié)議”,而接口中的屬性也屬于“協(xié)議”中的成員枣氧。它們是公共的溢十,靜態(tài)的,最終的常量达吞。相當于全局常量张弛。抽象類是不“完全”的類,相當于是接口和具體類的一個中間層酪劫。即滿足接口的抽象吞鸭,也滿足具體的實現(xiàn)。

接口用于描述系統(tǒng)對外提供的所有服務,因此接口中的成員常量和方法都必須是公開(public)類型的,確保外部使用者能訪問它們覆糟;

接口僅僅描述系統(tǒng)能做什么,但不指明如何去做,所以接口中的方法都是抽象(abstract)方法刻剥;

接口不涉及和任何具體實例相關(guān)的細節(jié),因此接口沒有構(gòu)造方法,不能被實例化,沒有實例變量,只有靜態(tài)(static)變量滩字。

接口的中的變量是所有實現(xiàn)類共有的造虏,既然共有,肯定是不變的東西麦箍,因為變化的東西也不能夠算共有漓藕。所以變量是不可變(final)類型,也就是常量了内列。

2)為什么接口中的方法修飾符是public而不是static撵术?

接口用于描述系統(tǒng)對外提供的所有服務,因此接口中的成員常量和方法都必須是公開(public)類型的,確保外部使用者能訪問它們;

抽象類中的抽象方法(前面有abstract修飾)不能用private,static,修飾话瞧。原因:抽象方法沒有方法體嫩与,是被用來繼承的寝姿,所以不能用private修飾;static修飾的方法可以通過類名來訪問該方法(即方法的方法體)划滋,抽象方法用static沒有意義饵筑。接口是一種特殊的抽象類,所以用public而不是static

3)接口中可不可以有方法體处坪?

Java8之前的版本中接口不能寫方法體根资,但是在Java8開始就可以寫了,使用default關(guān)鍵字

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末同窘,一起剝皮案震驚了整個濱河市玄帕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌想邦,老刑警劉巖裤纹,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異丧没,居然都是意外死亡鹰椒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門呕童,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漆际,“玉大人,你說我怎么就攤上這事夺饲〖榛悖” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵钞支,是天一觀的道長茫蛹。 經(jīng)常有香客問我操刀,道長烁挟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任骨坑,我火速辦了婚禮撼嗓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘欢唾。我一直安慰自己且警,他們只是感情好,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布礁遣。 她就那樣靜靜地躺著斑芜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪祟霍。 梳的紋絲不亂的頭發(fā)上杏头,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天盈包,我揣著相機與錄音,去河邊找鬼醇王。 笑死呢燥,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的寓娩。 我是一名探鬼主播叛氨,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棘伴!你這毒婦竟也來了寞埠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤焊夸,失蹤者是張志新(化名)和其女友劉穎畸裳,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淳地,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡怖糊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了颇象。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伍伤。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖遣钳,靈堂內(nèi)的尸體忽然破棺而出扰魂,到底是詐尸還是另有隱情,我是刑警寧澤蕴茴,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布劝评,位于F島的核電站,受9級特大地震影響倦淀,放射性物質(zhì)發(fā)生泄漏蒋畜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一撞叽、第九天 我趴在偏房一處隱蔽的房頂上張望姻成。 院中可真熱鬧,春花似錦愿棋、人聲如沸科展。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽才睹。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間琅攘,已是汗流浹背真椿。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乎澄,地道東北人突硝。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像置济,于是被迫代替她去往敵國和親解恰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎部分 基礎部分的順序:基本語法浙于,類相關(guān)的語法护盈,內(nèi)部類的語法,繼承相關(guān)的語法羞酗,異常的語法腐宋,線程的語...
    子非魚_t_閱讀 31,644評論 18 399
  • 一. Java基礎部分.................................................
    wy_sure閱讀 3,811評論 0 11
  • 戳上節(jié) 上山打虎 第八節(jié) 尋找狍子 楊振堂帶人到潔具店搜查的時候,老楊――楊德禮剛到和平飯店門口停車場檀轨,老楊記得胸竞,...
    白馬嘯西風閱讀 476評論 3 4
  • 記得有一次在班車上,見到一位農(nóng)村婦女参萄,帶著綁著繃帶的小男孩卫枝。期間,小男孩很是虛弱的和這位婦女說: 媽媽讹挎,我想喝水校赤。...
    我叫悠然你叫南山閱讀 244評論 0 0
  • 有的時候,人總是在筒溃,第一面的認識下马篮,交上了朋友!因為當他(她)留給你的第一印象是好的的時候怜奖,你感到她很不錯...
    鞏美閱讀 364評論 0 0