抽象类和接口的区别?

1 抽象类:
定义: 必须用 abstract 修饰的类, 如果一个类包含抽象方法,则这个类是抽象类。
作用:解决代码部分余,把共有的类中的方法公有化,需要用这些方法的类只需要继承这个抽象类即 可,并且是在父类中没有具体实现,必须在子类中具体实现的。
抽象方法:
1.用abstract修饰的方法,和普通方法的区别在于:抽象方法没有方法体,
2.只是声明一个方法,不做具体的实现, 而且抽象方法必须在抽象类中,
3.抽象方法所在的类必须声明为抽象类
4.抽象方法声明的类型不能为private(私有的),这里说的不能设为private,是因为如果设为private ,子类就继承不了这个方法,那这个方法就失去了他的意义了。
5.抽象类中科院声明普通方法

首先new 一个抽象类 A,在类中声明一个方法,声明方法如果没有村遵从以上规则都会报可见错误
1.用abstract 修饰的方法,带方法体

2.声明私有

3.abstract修饰,没有方法体,这样就不会报错了。

4.普通类中声明抽象方法,会直接提示异常

那么问题来了,抽象类的作用是什么呢?还记得java的三大特性嘛,封装,继承,多态,
抽象方法就是用于子类继承用的,但是java只能单继承,可以多实现。我们在写一个子类C来继承抽象类A

C继承A后会报错,错误是什么呢,找到提示的原因,原来是没有重写A中的抽象方法

那我们重写一下A的抽象方法就好了,但是普通方法好像并没有被重写,由此可见,子类继承抽象类时,必须要实现抽象类中所有的抽象方法,普通方法是非必须重写的。

还有一个问题,抽象类能不能继承抽象类呢,继承之后又会怎么样呢?那我们试一下,new一个抽象类B ,继承A,在B中声明一个抽象方法 getB();

继承之后,并没有要强制重写A中的抽象方法,但是也可以重写A的get方法,当然可也重写A的普通方法

我们来测试一下,抽象类中的效果,new一个Test测试类,在Test中new 抽象类A,发现不行,new的时候,必须重写A的抽象方法

C继承了A,那C就可以调用A中的非私有的抽象方法了。抽象方法如果在C中重写了,那么具体的内容是以C中重写的内容为准。

总结:
抽象方法需要用关键字abstract修饰
抽象方法没有方法体,即只有声明,而没有具体的实现
抽象方法所在的类必须声明为抽象类
抽象方法必须声明为public或者protected,不能声明为private
抽象类不能被实例化,即不能通过new来创建对象
抽象类需要用关键字abstract修饰
如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为abstract类。
抽象类除了可以拥有普通类的成员变量和成员方法,还可以拥有抽象方法

接口:
什么是接口?
定义:用 interface修饰的类,并且类中的方法没有方法体.可以被多实现。
为什么要用接口呢?
作用:用于代码的同一规范和协议,减轻了后期代码维护的难度。(如果后期需要增加/修改东西的时候只需要找到对应的接口,在接口的实现方法中修改即可,或者多加一个接口),当多个人开发的时候,统一规范编码,变量命名等等,这样就不会乱也减轻了开发工作量。

注意:接口类中除了没有方法体之外,也没有普通方法。

1.new 一个接口类 ,在类中定义一个接口,

package test;
public interface Dservice {
    public String  a();
}

2.new 接口实现类 ,实现接口时,需要强制重写接口类中的所有接口方法,在实现类中做具体实现

package test;
public class Dimpl implements Dservice {
    @Override
    public String a() {
        String s = "DD is me";
        System.out.println(s);
        return s;
    }
}

3.创建一个测试类,声明一下接口,在方法中直接调用接口中的方法,

package test;
import org.springframework.beans.factory.annotation.Autowired;
public class E {
    @Autowired
    private Dservice dservice;
    public String ss(){
       return dservice.a();
    }
}

输入内容

DD is me 

总结:
1.用interface 修饰的类叫接口
2.接口不能被继承,但是可以被实现,可以实现多个接口
3.实现类必须重写接口类中所有的接口
4.接口类不能被实例化,
5.接口中的方法没有方法体,具体实现在子类中
6.接口方法不能声明私有的,子类访问不到接口类中的私有化方法,那么这个方法就失去作用了

抽象类和接口的区别

1.都不能实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
2.抽象类需要被继承,接口需要被实现
3、接口只能做方法申明(类似一个规范),抽象类中可以做方法申明,也可以做方法实现 (增强代码的扩展性)
4.接口定义的变量只能是公共的静态常量,抽象类中定义的变量是普通变量。
5.抽象类中的所有抽象方法都需要被子类实现,如果不能实现父类的全部方法,那么该子类只能是抽象类,一个类实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
6.抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。
7.抽象类里面可以没有抽象方法,接口里面方法没有方法体
8.如果一个类里面有抽象方法,那么这个类只能是抽象类,
9.抽象类的所有方法不能为静态和私有的,因为所有的抽象方法需要被实现。
10.接口可多继承,抽象类只能继承单个,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抽象类接口区别 【概述】 一个软件设计的好坏,我想很大程度上取决于它的整体架构, 而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时, 你底层的具体实现需要考虑的就仅仅是一些算法和一些具体的业务实现了。 当你需要再开发另一个相近的项目时,你以前的抽象层说不定还可以再次利用 。 面向对象的设计,复用的重点其实应该是抽象层的复用,而不是具体某一个代码块的复用。 在 面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。 并不是 所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象, 这样的类就是抽象类抽象类往往用来表征我们在对问题领域进行分析、 设计中得出的抽象概念, 是对一系列看上去不同,但是本质上相同的具体概念的抽象。 比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、 三角形这样一些具体概念, 它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的, 它就是一个抽象概念。正是因为抽象的概念 在问题领域没有对应的具体概念, 所以用以表征抽象概念的抽象类是不能够实例化的。 在面向对象领域,抽象类主要用来进行类型隐藏。 我们可以构造出一个固定的一组行为的抽象描 述, 但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类, 对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP(Object Oriented Programming,OOP,面向对象程序设计)的抽象:接口抽象类。 这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然。 今天我们就一起来学习一下Java中的接口抽象类。 【抽象类】 在了解抽象类之前,先来了解一下抽象方法。 抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为: abstract void fun(); 抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。 抽象类不一定必须含有抽象方法。比如: 复制代码 public abstract class Dog { //普通方法 void bark() { } //抽象方法 abstract void Play(); } 复制代码 [public] abstract class ClassName { abstract void fun(); } 从这里可以看出,抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它, 那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类, 如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现, 那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。   包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样, 同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:   1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法), 缺省情况下默认为public。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值