● 接口和抽象类的区别是什么?

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();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值