`

Java接口的作用和抽象类的区别

    博客分类:
  • Java
阅读更多
在面试可能经常被问到,接口有什么作用?相对于类而言,为何需要用类实现接口等等诸如此类的问题。如果不仔细想想,有时候还会卡住。这篇文章将简单介绍下接口的作用。
对于接口而言,就是用来标记类的一个产物。每个接口都对应有一个或多个实现它的类,否则这个接口就成为冗余代码。因为管理接口比管理类要简单挺多,接口就由此体现了抽象的观点。换句话说,接口就是没有属性和行为实现的类。类实现多个接口,可以解决类不能继承多个类的机制。那么接口该怎么使用呢?
一 接口的作用
下面有两个方面:
1. Java多态接口动态加载实例
这种实现方式,大家在很多场合下都可以见到。下面介绍一个Sample:
1) 接口类:
public interface PersonService {
	/**
	 * 计算每月的工资
	 *  sal:工资基数
	 *  type:员工等级
	 */
	public double calcuMonthlySalary(double sal, int type);
	
}

2) 实现类:
public class ManagerServiceBean implements PersonService {
	/**
	 * 
	 */
	public ManagerServiceBean() {
	}
	/* (non-Javadoc)
	 * @see com.java.test.Interface.PersonService#calcuMonthlySalary(double, int)
 */
	public double calcuMonthlySalary(double sal, int type) {
				System.out.println("ManagerServiceBean: "+(sal*type*2));
		
return sal*type*2;
	}

}
public class EmployeeServiceBean implements PersonService {

	/**
	 * 
	 */
	public EmployeeServiceBean() {
	}

	/* (non-Javadoc)
	 * @see com.java.test.Interface.PersonService#calcuMonthlySalary(double, int)
	 */
	public double calcuMonthlySalary(double sal, int type) {
		System.out.println("EmployeeServiceBean: "+(sal*type*2));
		return sal*type*1.5;
	}
}
}

3) 测试类:
public class SalaryManageTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		try{
//这里写得不智能,还需要传入传输
			PersonService personService = (PersonService)Class.forName(args[0]).newInstance();
			if (args[1] != null && args[1] != "" &&
					args[2] != null && args[2] != ""){
				int sal = Integer.valueOf(args[1]).intValue();
				int type = Integer.valueOf(args[2]).intValue();
	
//这里可以根据传入参数的不同,调用不同的实现类,
			//如果再增加一类新的成员,我们也只要新增一个类,无需修改方法
				personService.calcuMonthlySalary(sal, type);
			}
			
		}catch(Exception ex){
			ex.printStackTrace();
		}

	}

}

这里,通过接口在获取类对象的时候,个人觉得写得不是很好。。但也许大家用过Ejb的人都应该知道,客户端获取Ejb bean的时候,就是通过这种方式获取:
PersonService personService = (PersonService)context.lookup(“personServiceBean/remote”);
2. Java接口作为参数传递
下面列出一个Sample:
1) 接口,实现类同上。
2) Person实体类:

public class Person {
	private double sal;
	private int type;
	
	/**
	 * 
	 */
	public Person() {
	}
	/**
	 * @param sal
	 * @param type
	 */
	public Person(double sal, int type) {
		this.sal = sal;
		this.type = type;
	}
	/**
	 * @return the sal
	 */
	public double getSal() {
		return sal;
	}
	/**
	 * @param sal the sal to set
	 */
	public void setSal(double sal) {
		this.sal = sal;
	}
	/**
	 * @return the type
	 */
	public int getType() {
		return type;
	}
	/**
	 * @param type the type to set
	 */
	public void setType(int type) {
		this.type = type;
	}

}

3) 接口作为参数传入类:
 public class SalaryManager {

	/**
	 * 
	 */
	public SalaryManager() {
	}
	
	public void getMonthlySalary(PersonService personService, Person person){
		personService.calcuMonthlySalary(person.getSal(), person.getType());
	}

}

4) 测试类:

public class SalaryManageTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		try{
			ManagerServiceBean managerServiceBean = new ManagerServiceBean();
			EmployeeServiceBean employeeServiceBean = new EmployeeServiceBean();
			SalaryManager salaryManager = new SalaryManager();
		//call 接口作为传入参数的实现类方法	
salaryManager.getMonthlySalary(managerServiceBean, new Person(1000, 7));
			salaryManager.getMonthlySalary(employeeServiceBean, new Person(1000, 4));
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}

}

二  接口与抽象类的区别
   我个人认为有以下几点:
   1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。这弥补了类的多继承问题。

  2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。

  3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。 注意:当一个行为与一个类的所属行为方法不相关联时,应该采用接口来实现这个行为,不能使用抽象类,否则违反面向对象的ISP(Interface Segregation Principle)规则和OCP原则.

  4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。

  5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。当然,变量定义也可以是friendly.

  6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

  7.接口中的方法默认都是 public,abstract 类型的。
分享到:
评论
5 楼 优游麦 2011-02-11  
wenbois2000 写道
抽象类着重类本身, 接口着重行为, 一句话就行了.

蛮精辟的
4 楼 i2534 2010-05-29  
palmer 写道
 5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。当然,变量定义也可以是friendly.

  6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

  7.接口中的方法默认都是 public,abstract 类型的。

有默认吗???

不写final   就成了final ??

同学,你先不要质疑,你自己写个接口然后写点变量看下不就知道了。
3 楼 wenbois2000 2010-05-29  
抽象类着重类本身, 接口着重行为, 一句话就行了.
2 楼 palmer 2010-05-29  
 5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。当然,变量定义也可以是friendly.

  6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

  7.接口中的方法默认都是 public,abstract 类型的。

有默认吗???

不写final   就成了final ??
1 楼 loloku 2010-05-29  
讲的不错,只是,对于初学者来说,还不是太简单明了。不过还要感谢你,能分享自己的经验

相关推荐

    11.java接口和抽象类的区别.zip

    11.java接口和抽象类的区别.zip11.java接口和抽象类的区别.zip11.java接口和抽象类的区别.zip11.java接口和抽象类的区别.zip11.java接口和抽象类的区别.zip11.java接口和抽象类的区别.zip11.java接口和抽象类的区别....

    java抽象类与接口实例java抽象类与接口实例

    java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例...

    java利用接口和抽象类改写求圆的面积和梯形的面积.docx

    ### Java利用接口和抽象类改写求圆的面积和梯形的面积 #### 深入理解Java的接口和抽象类 在Java编程语言中,接口(Interface)和抽象类(Abstract Class)都是用于实现多态性和代码复用的重要概念。它们都无法被...

    10.java接口和抽象类的相似性.zip

    10.java接口和抽象类的相似性.zip10.java接口和抽象类的相似性.zip10.java接口和抽象类的相似性.zip10.java接口和抽象类的相似性.zip10.java接口和抽象类的相似性.zip10.java接口和抽象类的相似性.zip10.java接口和...

    详细解析Java中抽象类和接口的区别

    ### 详细解析Java中抽象类和接口的区别 #### 引言 在面向对象编程中,Java作为一种广泛应用的编程语言,提供了多种方式来实现抽象的概念。其中最常用的两种机制是抽象类(abstract class)和接口(interface)。这...

    Java 接口和抽象类

    Java 接口和抽象类 Java 编程语言提供了两种机制来实现面向对象编程的多态性:接口和抽象类。这两种机制使得 Java 应用开发具有灵活性和敏捷性。 抽象类 抽象类是一种特殊的类,它不能被实例化,不能被直接使用,...

    Java中抽象类和接口的区别

    在Java语言中,abstract class和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,...

    Java中的类、抽象类和接口的区别和联系

    Java中的类、抽象类和接口的区别和联系

    Java 接口和抽象类区别

    总结来说,Java接口和抽象类都是软件设计中的重要工具,它们在EJB等企业级应用中发挥着关键作用。理解它们的区别和用法,有助于编写更高效、可维护的代码,并且能更好地利用Java的面向对象特性。通过深入学习EJB的...

    java 抽象类与接口的区别

    在Java编程语言中,抽象类和接口是两种重要的面向对象设计概念,它们都用于实现多态性,但各自具有不同的特点和应用场景。了解并熟练掌握它们的区别对于编写高质量的Java代码至关重要。 首先,抽象类是一种不能被...

    Java接口和Java抽象类

    ### Java接口和Java抽象类详解 #### 一、引言 在面向对象编程语言Java中,接口(Interface)和抽象类(Abstract Class)是实现多态性和代码复用的重要手段。它们都允许开发者定义行为规范而不需要具体实现细节,但...

    java中接口与抽象类的详细分析与比较

    在Java编程语言中,接口(Interface)和抽象类(Abstract Class)都是用于实现多态性的关键概念,它们各自有特定的用途和优缺点。本文将深入探讨这两种概念,帮助你理解它们之间的区别以及如何在实际开发中选择使用...

    Java源代码:抽象类和接口

    在Java编程语言中,抽象类和接口是两种重要的面向对象设计概念,它们允许我们定义规范,为其他类提供模板或行为指南。让我们深入探讨这两个概念及其在Java中的应用。 首先,我们来理解抽象类。在Java中,抽象类是一...

    Java语言的接口与抽象类

    Java语言的接口与抽象类是面向对象编程中的关键概念,它们在设计模式和代码组织中起着重要作用。这里我们将深入探讨这两个概念,并分析它们的异同。 首先,接口(Interface)是Java中的一种特殊类型,它通过使用`...

    java抽象类与接口区别

    ### Java抽象类与接口的区别 #### 一、引言 在Java编程中,抽象类(Abstract Class)与接口(Interface)都是实现抽象的关键工具。它们各自有着独特的优势和适用场景,掌握这两者的区别有助于开发者更好地设计系统...

    Java抽象类与接口实验报告

    Java抽象类与接口实验报告

    JAVA中抽象类和接口的区别

    在Java语言中,abstract class 和interface 是支持抽象类定义的两种机制区别

    浅析Java抽象类和接口的比较

    总的来说,抽象类和接口在Java中各有其独特的作用,正确选择和组合使用它们可以提高代码的灵活性、可扩展性和可维护性。在实际开发中,应根据问题领域的需求、设计意图和面向对象原则来做出决策。

    Java抽象类和接口.ppt

    此书对于你学习Java抽象类和接口有非常大的帮助

Global site tag (gtag.js) - Google Analytics