为什么要使用interface,而不是直接使用实体类来完成任务?Interface和Impl这种方式的好处是什么?

1.背景介绍

接口是什么?

接口,在Java中是一个抽象类型,是抽象方法的集合。接口通常以interface来声名。一个类通过继承接口的方式,从而来继承接口的抽象方法。接口严格意义上来讲属于一个特殊的类,而这个类里面只有抽象方法和全局常量,就连构造方法也没有。

,比如我们约定某些英雄是物理系英雄,那么他们就一定能够进行物理攻击。实现某个接口,就相当于承诺了某种约定。所以实现某个接口,就必须提供那个接口中的方法,实现在语法上使用关键字implements

2.知识剖析

接口的特点:  

1、Java接口中的成员变量默认都是public,static,final类型的(都可省略),必须被显示初始化,即接口中的成员变量为常量(大写,单词之间用"_"分隔)

2、Java接口中的方法默认都是public,abstract类型的(都可省略),没有方法体,不能被实例化

3、Java接口中只能包含public,static,final类型的成员变量和public,abstract类型的成员方法

4、接口中没有构造方法,不能被实例化

5、一个接口不能实现(implements)另一个接口,但它可以继承多个其它的接口

6、Java接口必须通过类来实现它的抽象方法

7、当类实现了某个Java接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象类

8、不允许创建接口的实例(实例化),但允许定义接口类型的引用变量,该引用变量引用实现了这个接口的类的实例

9、一个类只能继承一个直接的父类,但可以实现多个接口,间接的实现了多继承.

Interface和Impl这种方式的好处是什么?

便于封装;降低耦合;对修改封闭,对拓展开放。

3.常见问题

接口使用原则:

   1)接口必须要有子类,但此时一个子类可以使用implements关键字实现多个接口

2)接口的子类(如果不是抽象类),那么必须要覆盖重写接口中的全部抽象方法

3)接口的对象可以利用子类对象的向上转型进行实例化

4.扩展思考讨论

接口和抽象类的区别?

一个抽象类只能继承一个抽象父类,而接口可以继承多个接口

一个子类只能继承一个抽象类,却可以实现多个接口

接口实现的基础——对象转型和多态

对象转型

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()",就是把子类对象赋值给父类类型的变量,这就是向上转型

       draw(p);

   }

}

多态

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.编码实战

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)接口有什么修饰符?

接口就是提供一种统一的”协议”,而接口中的属性也属于“协议”中的成员。它们是公共的,静态的,最终的常量。相当于全局常量。抽象类是不“完全”的类,相当于是接口和具体类的一个中间层。即满足接口的抽象,也满足具体的实现。

接口用于描述系统对外提供的所有服务,因此接口中的成员常量和方法都必须是公开(public)类型的,确保外部使用者能访问它们;

接口仅仅描述系统能做什么,但不指明如何去做,所以接口中的方法都是抽象(abstract)方法;

接口不涉及和任何具体实例相关的细节,因此接口没有构造方法,不能被实例化,没有实例变量,只有静态(static)变量。

接口的中的变量是所有实现类共有的,既然共有,肯定是不变的东西,因为变化的东西也不能够算共有。所以变量是不可变(final)类型,也就是常量了。

2)为什么接口中的方法修饰符是public而不是static?

接口用于描述系统对外提供的所有服务,因此接口中的成员常量和方法都必须是公开(public)类型的,确保外部使用者能访问它们;

抽象类中的抽象方法(前面有abstract修饰)不能用private,static,修饰。原因:抽象方法没有方法体,是被用来继承的,所以不能用private修饰;static修饰的方法可以通过类名来访问该方法(即方法的方法体),抽象方法用static没有意义。接口是一种特殊的抽象类,所以用public而不是static

3)接口中可不可以有方法体?

Java8之前的版本中接口不能写方法体,但是在Java8开始就可以写了,使用default关键字

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 3,785评论 0 11
  • 戳上节 上山打虎 第八节 寻找狍子 杨振堂带人到洁具店搜查的时候,老杨――杨德礼刚到和平饭店门口停车场,老杨记得,...
    白马啸西风阅读 463评论 3 4
  • 记得有一次在班车上,见到一位农村妇女,带着绑着绷带的小男孩。期间,小男孩很是虚弱的和这位妇女说: 妈妈,我想喝水。...
    我叫悠然你叫南山阅读 226评论 0 0
  • 有的时候,人总是在,第一面的认识下,交上了朋友!因为当他(她)留给你的第一印象是好的的时候,你感到她很不错...
    巩美阅读 346评论 0 0