一 从语义的角度选择不一样之处;html
接口与抽象类在语义上区别主要在定义和使用格式上,下面分别介绍抽象类和接口的定义与使用:java
1, 抽象类的定义和使用格式:ide
在java语言中定义抽象类时,要在关键字class前面加上abstract,格式以下:学习
abstract class class_name{this
类体
spa
}.net
在java中定义完抽象类以后,咱们使用抽象类,同时子类只能继承一个抽象类的父类(单继承),继承以后子类必须所有覆盖父 类中的抽象方法;设计
class sub_class_name extend parent_class_name{htm
父类中的抽象方法;
对象
}
在使用抽象类是请注意一下几点:
在使用抽象类时须要注意几点:
一、抽象类不能被实例化,实例化的工做应该交由它的子类来完成,它只须要有一个引用便可。
二、抽象方法必须由子类来进行重写。
三、只要包含一个抽象方法的抽象类,该方法必需要定义成抽象类,不论是否还包含有其余方法。
四、抽象类中能够包含具体的方法,固然也能够不包含抽象方法。
五、子类中的抽象方法不能与父类的抽象方法同名。
六、abstract不能与final并列修饰同一个类。
七、abstract 不能与private、static、final或native并列修饰同一个方法。
抽象类的举例以下:
需求:
假如咱们在开发一个系统时须要对员工进行建模,员工包含3个属性;
姓名,工号以及工资,经理也是员工,除了含有员工的属性外,另外还有一个;
奖金属性,请使用继承的思想设计除员工类和经理类,要求类中提供必要的方法进行属性访问;
实现代码:
abstract class Employmen{
private String name;
private int numid;
private double slary;
//初始化
public Employmen(String name,int numid,double slary) {
// TODO Auto-generated constructor stub
this.name = name;
this.numid = numid;
this.slary = slary;
}
abstract void work();
}
/**
* 注意:
* 在声明完属性以后,子类继承了父类中的方法和属性;
* 同时要对子类进行初始化;用构造方法
* */
//普通员工要初始化
class WorkMan extends Employmen{
//初始化属性
public WorkMan(String name, int numid, double slary) {
super(name, numid, slary);
// TODO Auto-generated constructor stub
}
@Override
void work() {
// TODO Auto-generated method stub
System.out.println("--- --- 员工干活");
}
}//结束
//经理类
class ProjectManager extends Employmen{
//初始化属性
public ProjectManager(String name, int numid, double slary,double reward) {
super(name, numid, slary);
this.reward = reward;
// TODO Auto-generated constructor stub
}
private double reward;
@Override
void work() {
// TODO Auto-generated method stub
System.out.println("经理干活 ---- ---- ");
}
}//结束
2, 接口的定义和使用方法:
在java中使用关键字interface来定义接口,一个接口由变量的定义和方法的定义两部分组成。定义格式以下:
interface interface_name{
[public] [static] [final] 变量;
[public] [abstract] 方法;
}
在java语言中接口经过实现的方式来使用接口,一个类能够实现多个接口,使用格式以下:
class class_name implement interface_name{
实现接口的方法;
}
在使用接口时请注意一下几点:
一、个Interface的方全部法访问权限自动被声明为public。确切的说只能为public,固然你能够显示的声明为protected、private,可是编译会出错!
二、接口中能够定义“成员变量”,或者说是不可变的常量,由于接口中的“成员变量”会自动变为为public static final。能够经过类命名直接访问:ImplementClass.name。
三、接口中不存在实现的方法。
四、实现接口的非抽象类必需要实现该接口的全部方法。抽象类能够不用实现。
五、不能使用new操做符实例化一个接口,但能够声明一个接口变量,该变量必须引用(refer to)一个实现该接口的类的对象。可使用 instanceof 检查一个对象是否实现了某个特定的接口。例如:if(anObject instanceof Comparable){}。
六、在实现多接口的时候必定要避免方法名的重复。
接口的举例以下:
例如:
//抽象类
abstract class Student{
abstract void study();
void sleep(){
System.out.println("睡觉");
}
}//end
//接口
interface Beat{
public abstract void beatman();
public abstract void goodMouth();
}//end
//P类
class P extends Student implements Beat {
@Override
void study() {
// TODO Auto-generated method stub
System.out.println("好好学习 ");
}
@Override
public void goodMouth() {
// TODO Auto-generated method stub
System.out.println("给之间留点口德,");
}
@Override
public void beatman() {
// TODO Auto-generated method stub
//什么也没有作
}
}//end
二 抽象类和接口的区别:
在了解接口和抽象类的定义以后,咱们来看如何更好的选择接口和抽象类之间的区别:
(1)抽象类能够提供成员的实现细节,而接口不能。设计抽象时,若是要求提供 的成员的实现细节,可选择抽象类。
(2)若是设计抽象时选择抽象类,在之后的版本中能够随意为抽象类添加新成员。而接口在这方面就没有那么灵活,只有修改代码才能添加成员。
(3)一个类能够实现多个接口,但只能继承一个抽象类,若是要实现相似于多重继承的效果,可选择接口。
三 接口和抽象类的总结
一、 抽象类在java语言中所表示的是一种继承关系,一个子类只能存在一个父类,可是能够存在多个接口。
二、 在抽象类中能够拥有本身的成员变量和非抽象类方法,可是接口中只能存在静态的不可变的成员数据(不过通常都不在接口中定义成员数据),并且它的全部方法都是抽象的。
三、抽象类和接口所反映的设计理念是不一样的,抽象类所表明的是“is-a”的关系,而接口所表明的是“like-a”的关系。
四、 抽象类和接口是java语言中两种不一样的抽象概念,他们的存在对多态提供了很是好的支持,虽然他们之间存在很大的类似性。可是对于他们的选择每每反应了您对问题域的理解。只有对问题域的本质有良好的理解,才能作出正确、合理的设计。
初学java请高手指教:
参照了一下几个比较好的博客:同时也很是感谢这些博主学到了不少!
http://www.cnblogs.com/dolphin0520/p/3811437.html
http://dev.yesky.com/436/7581936.shtml