当前位置:文档之家 > 抽象类与接口的区别

抽象类与接口的区别

Java接口和抽象类的区别-实例Java 2010-07-05 11:26:38 阅读64 评论2 字号:大中小订阅 .

注:本文内来来自http://www.doczj.com/doc/c2ff957b1711cc7931b716ee.html/141287020.html

接口:

接口主要用来描述类应该拥有什么样的功能,可以充当什么样的角色,但并不给出每个功能的具体实现。接口是一种与类相似的结构,只包含常量和抽象方法。接口在许多方面与抽象类相近,但是抽象类除了包含常量和抽象方法外,还可以包含变量和具体方法。

接口实际上是一种承诺或契约。用来描述其实现类能够拥有什么样的功能,能够充当什么样的角色。但接口中病没有功能的具体实现,具体实现由接口的实现类来进行。实现类只需要满足这个接口的要求即可。

例如:做一个商务网站,想要实现支付宝的在线支付,就要实现支付宝的接口。(接口中可以声明一个或多个方法与变量,但不可以有实例域和方法的实现)。

接口类似于抽象类,就是一种特殊的抽象类。利用接口,Java巧妙地实现了多继承。接口和类的区别如下:

?接口中的方法都是公开的抽象方法(public abstract),并且不需要提供public和abstract 关键字。

?无论编程时是否加上public static final,接口中的属性都是公开静态变量。

?接口中没有构造方法。

?类与接口之间的代码复用关系叫实现而不叫继承。实现的是implements,而不是extends。并且一个雷可以实现多个接口,实现多个接口的时候用“,”隔开,可以看成一种变相的继承关系。差别是构造子类对象不需要构造接口对象,接口也不能构造对象。java中正是使用接口来达到多继承的目的。

输出工资表单程序:

要求把若干员工的数据按照表格的方式输出。但员工数据存储在不同德结构中:一种是二维字符串数组,每一行代表一个员工的数据;另一种是一位Employee类型的数组,每个元素代表一个员工。要求为表格写一个适配接口。在该接口中定义输出一个二维表格所需要的所有方法。然后给出这个接口的两个不同实现类,分别将这两种不同数据输出在表格中。

员工类实例:Employee.java

package ch6;

public class Employee {

private String name;

private String gender;

private int age;

private int salary;

public Employee(String name, String gender, int age, int salary) {

super();

http://www.doczj.com/doc/c2ff957b1711cc7931b716ee.html = name;

this.gender = gender;

this.age = age;

this.salary = salary;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getGender() {

return gender;

}

public void setGender(String gender) {

this.gender = gender;

}

public void setName(String name) {

http://www.doczj.com/doc/c2ff957b1711cc7931b716ee.html = name;

}

public int getSalary() {

return salary;

}

public void setSalary(int salary) {

this.salary = salary;

}

public String getName() {

// TODO Auto-generated method stub

return name;

}

}

这个员工类主要是定义了员工的姓名、性别、年龄和工资,并封装了get和set方法。该类主要是为一维数组服务。

表单模式接口:TableModel。java

package ch6;

/**

*

* @author Administrator

*表的适配器接口,该接口中定义输出二维表所需要的方法

*/

public interface TableModel {

/**

* 表单的列数

* @return

*/

public int getColNumber();

/**

* 表单的行数

* @return

*/

public int getRowNumber();

/**

* 指定的某行某列的值

* @param row

* @param col

* @return

*/

public String getValue(int row, int col);

/**

* 指定的列名

* @param col

* @return

*/

public String getColName(int col);

}

定义了表单模式的接口,并且定义了输出二维表所需要的方法,如表的列数、行数、某行某列的指定值和列名。通过这个程序可以看到接口定义的方式以及接口中抽象方法的定义方式。注意在接口中每个方法,都要写清楚返回值、元素等的注释,以便于实现类正确地实现这些方法。

接口的实现类TableModelA:实现表单模式接口,实现接口中的方法,该类适用于二维数组。

接口和类的关系以及接口编程的优点:

接口与类有着千丝万缕的联系。类与类、类与接口、接口与接口的关系如下:

?如果一个类,它的父类也是一个类,那么就是继承,而且必须是单继承。

?如果一个类去继承一个接口,要用implements关键字。这时类和接口之间不叫继承关系,而是实现关系,而且一个类可以实现多个接口。一个类要实现接口就必须实现接口中的所有方法。

?如果一个接口继承了一个接口,那么也是继承,而且一个接口可以继承多个接口,其语法和类的继承语法是相同的。接口的继承关系只是把其父接口中的抽象方法继承到子接口中去。?接口只能继承接口,不可以继承类,不存在这种关系。

表单模式实现类:TableModelA。java

package ch6;

public class TableModelA implements TableModel {

String[][]data;//定义传入数组data

public TableModelA(String[][] data)//定义TableModelA构造方法

{

this.data=data;

}

//按接口的要求实现其方法

public String getColName(int col) {

// TODO Auto-generated method stub

return data[0][col];

}

public int getColNumber() {

// TODO Auto-generated method stub

return data[0].length;

}

public int getRowNumber() {

// TODO Auto-generated method stub

return data.length-1;

}

public String getValue(int row, int col) {

// TODO Auto-generated method stub

return data[row+1][col];

}

}

表单模式实现类TableModelB:接口编程的意义

在java编程中要尽量基于接口的编程,不要基于实例的编程。接口编程的意义有以下几点:

? 接口可以实现多继承

?用接口可以实现混合类型(主类型、副类型),java中可以通过接口分出主次类型。主类型使用继承,副类型使用接口实现。

?接口进一步深化了标准的思想,接口本身就是一个标准。

?接口编程起到了降低耦合性的作用,接口可以使方法的定义和实现相分离,也就是将接口的制定者和实现者相分离。这对于大规模、多公司的合作编程有着重要的意义。

?接口也可以用于降低模块间或系统间的耦合性。

?针对接口编程可以屏蔽不同实现间的差异,看到的只是实现好的功能。

内聚就是指系统或类独立完成某项任务的能力。不需要外界过多的干预就能完成任务。称为高内聚。类于类之间,模块与模块之间关联关系的复杂度,称为耦合度。耦合度应该降低。

表单模式实现类:TableModelB:

package ch6;

public class TableModelB implements TableModel {

private Employee[] data;//定义员工数组data

public TableModelB(Employee[] data)//该类的构造方法

{

this.data=data;

}

//实现接口内的方法

public String getColName(int col) {

// TODO Auto-generated method stub

switch(col){

case 0: return "姓名";

case 1: return "性别";

case 2: return "年龄";

case 3: return "工资";

default:return null;

}

}

public int getColNumber() {

// TODO Auto-generated method stub

return 4;

}

public int getRowNumber() {

// TODO Auto-generated method stub

return data.length;

}

public String getValue(int row, int col) {

// TODO Auto-generated method stub

switch(col){

case 0: return data[row].getName();

case 1: return data[row].getGender();

case 2: return data[row].getAge()+"";

case 3: return data[row].getSalary()+"";

default:return null;

}

}

}

TableModelB类实现了TableModel接口,并且实现了接口中的所有方法。这个类是针对本次测试的存储Employee对象的一维数组所写的表单模式类。getValue中的取值方法与Employee 类中的get方法相对应,而且getColName方法返回的是也是已知的固定列名。

下面是表单类,该类可以根据传入的表单模式生成表单,并输出表单的格式和数据。根据不同的表单模式获取表单,可以对表单数据进行打印输出。

package ch6;

public class Table {

private TableModel model;//定义表格模式

public Table(TableModel model) {

this.model = model;//构造方法

}

public void print(){//打印方法print,这里注意打印格式和取值

for(int i=0;i

System.out.print(model.getColName(i)+"\t|");

}

System.out.println("\n------------------------------");

for(int i=0;i

for(int j=0;j

System.out.print(model.getValue(i, j)+"\t|");

}

System.out.println();

}

}

}

Table类主要是根据表格模式类给定的模式取值,自己定义打印输出的方法print,按照一定的格式来输出表单。

输出表单测试类:该类对不同类型的数组进行输出,获得相同格式的输出。

? 先建一个测试类TableTest,主要用来测试一维数组和二维数组的输出。

?测试一维数组data1.先创建6个Employee对象,用数组data1存储。定义接口的引用时使用了多态。接口的引用必须是实现了接口的类的对象。所以使用类TableModelB创建model1对象。然后根据model1对象,新建一个Table类的对象table1,调用print方法打印输出所有数据。

?再测试二维数组data2.首先创建二维数组并将数据信息填入数组,定义接口的引用使用了多态。接口的引用必须是实现了接口的类的对象,所以使用类TableModelA创建model2对象,再根据model2来创建Table表单类的对象table2,调用print方法打印输出数据。

?从上面的几个类和接口可以看到如何定义接口,如何定义接口的实现类,如何实现接口的方法,以及如何定义接口的引用,如何实现接口的多态。

package ch6;

public class TableTest {

/**

* @param args

* @author tiger wu

* 建立测试类,测试一维数组和二维数组的输出

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

//创建Employee对象并用一维数组data1存储

Employee e1 = new Employee("张龙","男",24,2500);

Employee e2 = new Employee("赵虎","男",26,2600);

Employee e3 = new Employee("王朝","男",23,2800);

Employee e4 = new Employee("马汉","男",24,2500);

Employee e5 = new Employee("展昭","男",24,2500);

Employee e6 = new Employee("包拯","男",24,2500);

Employee[] data1={e1,e2,e3,e4,e5,e6};

TableModel model1=new TableModelB(data1);

//接口的引用必须是实现了接口的类的对象

Table table1=new Table(model1);

table1.print();

System.out.println("******************************");

//用TableModelB对象和Table对象,输出表单

String[][]data2=

{//二维数组存储数据

{"姓名","性别","年龄","工资"},

{"张龙","男","24","2500"},

{"赵虎","男","26","2600"},

{"王朝","男","23","2800"},

{"马汉","男","24","2500"},

{"展昭","男","24","2500"},

{"包拯","男","24","2500"}

};

//这里使用了多态,接口变量必须引用实现了接口的类的对象 TableModel model2=new TableModelA(data2);

Table table2=new Table(model2);

table2.print();

}

}

TOP相关主题