abstract class 和interface
1.成员的区别
抽象类:
构造方法:有构造方法,用于子类实例化时使用
成员变量:可以是变量也可以是常量
成员方法:可以是抽象的 也可以是非抽象的
接口
构造方法:无构造方法
成员变量:只能是常量 public static final
成员方法:JDK1.7中只能是抽象的,默认修饰符 public abstract(),在JDK1.8之后可以写
default和static的方法
2.类和结构关系的区别
类与类
继承关系,只能单继承,可以多层继承
类与接口
实现关系,可以单实现也可以多实现
类还可以在实现接口的同时继承类
接口与接口
继承关系,可以单继承,也可以多继承
3.体现的理念不同
抽象类里面定义的都是一个继承体系中的共性内容。(抽象是对事物的抽象)
接口是功能的集合,是一个体系额外的功能,是暴露出来的规则。(接口是对方法的抽象)
补充:
一、什么是抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
二、为什么要用抽象类
老是在想为什么要引用抽象类,一般类不就够用了吗。一般类里定义的方法,子类也可以覆盖,没必要定义成抽象的啊。
其实不是说抽象类有什么用,一般类确实也能满足应用,但是现实中确实有些父类中的方法确实没有必要写,因为各个子类中的这个方法肯定会有不同,所以没有必要再父类里写。当然你也可以把抽象类都写成非抽象类,但是这样没有必要。
而写成抽象类,这样别人看到你的代码,或你看到别人的代码,你就会注意抽象方法,而知道这个方法是在子类中实现的,所以,有个提示作用。
抽象类举例:
雇员实例
需求:公司中程序员有姓名,工号,薪水,工作内容
项目经理,比程序员,多一个奖金。对给出的需求进行数据建模
分析
对这个问题领域中,先找出涉及的对象,通过名词提炼法
程序员:
属性:姓名、工号、薪水
方法:工作
经理:
属性:姓名、工号、薪水、奖金
方法:工作
程序员和经理之间不存在继承关系,但是两个之间都有共性,我们可以将他抽取出来,因为他们都是公司的雇员。
可以将程序员和经理进行抽取,建立体系。
abstract class Employee{
private String name;
private String id;
private double pay;
Employee (String name,String id,double pay){
this.name = name;
this.id = id;
this.pay = pay;
}
public abstract void work();
}
class Programmer extends Employee{
Programmer(String name,String id,double pay){
super(name,id,pay);
}
public void work(){
System.out.println("codeing....");
}
}
class Manage extends Employee{
private int bouns;
Manage(String name,String id,double pay,int bouns){
super(name,id,pay);
this.bouns = bouns;
}
public void work(){
System.out.println("manage");
}
}
class AbstractTest{
public static void main (String[] arg){
Programmer pro = new Programmer("mahuateng","10000",10000);
Manage man = new Manage("mayun","10086",88888,10000);
pro.work();
man.work();
}
}