美文网首页
为什么要使用interface,而不是直接使用实体类来完成任务?

为什么要使用interface,而不是直接使用实体类来完成任务?

作者: 维克拉玛蒂亚 | 来源:发表于2018-04-03 14:36 被阅读0次

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关键字

相关文章

网友评论

      本文标题:为什么要使用interface,而不是直接使用实体类来完成任务?

      本文链接:https://www.haomeiwen.com/subject/lkaqhftx.html