抽象类和接口作用与区别

目录

(一)抽象类

(1)什么是抽象类

(2)抽象类语法

(3)抽象类的特性

3.1抽象类不能直接实例化对象

 3.2抽象方法不能是 private 的

3.3抽象方法不能被final和static修饰

3.4抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类

(4)抽象类目的

(5)抽象类小结

(二)接口

(1)接口的定义

(2)接口语法

(3)接口的使用

(4)接口特性

4.1不能直接new出接口的实例对象

4.2接口中的方法只能是public abstract修饰的方法

4.3接口中的方法是不能在接口中实现的,只能由实现接口的类来实现

4.4重写接口中方法时,不能使用默认的访问权限

4.5 接口中的变量会被隐式的指定为 public static final 变量

4.6接口中不能有静态代码块和构造方法

4.7 接口编译完成后字节码文件的后缀格式也是.class

4.8 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类

4.9接口之间可以实现多继承即一个接口继承多个接口

(5)接口小结

(三)抽象类与接口的区别


(一)抽象类

(1)什么是抽象类

 在面向对象编程中,抽象类是一个不能被实例化的类,它通常作为其他类的父类。抽象类可以包含抽象方法和非抽象方法,它定义了子类的一般形式,并强制要求子类实现其定义的抽象方法。‌——>百度百科

(2)抽象类语法

被abstract修饰的类叫抽象类,在抽象类中被abstract修饰的方法叫做抽象方法,抽象方法不用给出具体的实现。

如下代码中有一个被abstract修饰的抽象类Animal,抽象类中可以包含普通方法和属性,和构造方法。

public abstract class Animal {//父类animal
    String name;
    int age;

    public Animal(String name, int age) {//抽象类可以包含构造方法
        this.name = name;
        this.age = age;
    }
    public abstract void bark();//抽象类里的抽象方法不能有具体的实现

     public void breath(){//抽象类中可以包含普通方法
         System.out.println("正在呼吸");
     }
}

(3)抽象类的特性

3.1抽象类不能直接实例化对象

如下图,抽象类Animal直接实例化对象,编译器报错

 3.2抽象方法不能是 private

如下图抽象方法bark()加入private修饰符编译报错

原因:抽象方法设计的初衷是希望定义一个必须由子类实现的方法规范,但是private修饰符限制了访问范围仅在定义它的类内部,子类就无法对抽象方法进行访问和实现,这与抽象方法的初衷相违背的,所以private 与abstract之间是存在根本的语义冲突和设计原则上的不符。

3.3抽象方法不能被finalstatic修饰

如下图final和static修饰编译器都会报错

原因:被static修饰的方法是静态方法,静态方法是属于类的,而不是类的实例,因此静态方法不能被重写(重写需要依赖类的实例),final表示“最终的”,“不可变的”,因此被final修饰的方法也不能被重写。但是抽象方法设计初衷就是要被子类重写的,这与抽象方法的初衷相违背,所以abstract与final,abstract与static是不能同时出现的。

3.4抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类

如下图中Dog子类未实现抽象类的抽象方法,则Dog类也必须为抽象类,Cat子类实现了抽象类的抽象方法,因此不需要再加abstract

(4)抽象类目的

有个问题,既然普通的类和普通的方法也可以被继承和重写, 那么为啥非得用抽象类和抽象方法呢

当我们遇到了这样的场景,当实际工作不应该由父类完成 , 而应由子类完成 . 那么此时如果不小心误用成父类了, 使用普通类编译器是不会报错的 . 但是父类是抽象类就会在实例化的时候提示错误 ,这就相当于给我们的代码多提供一次编译器校验,防止我们的代码出错。

(5)抽象类小结

1. 被abstract修饰的类叫抽象类, 在抽象类中被abstract修饰的方法叫做抽象方法,抽象方法不能有 具体的实现。
2.抽象类不能直接实例化对象
3.abstract不能和private,final,static修饰符组合
4.抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类
5. 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
6. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量

(二)接口

(1)接口的定义

Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)——>百度百科

(2)接口语法

接口的定义和类相似,只需将class换成interface就定义了一个接口

如下就定义了一个接口Mouse


public interface Mouse {//Mouse接口
    void click();
}

(3)接口的使用

要使用接口,需要有一个类使用implements来实现该接口,并实现接口中的所有抽象方法

如下代码中,Computer类实现了Mouse接口,并实现接口中抽象方法click()


public interface Mouse {
    void click();
}
class Computer implements Mouse{

    public void click() {//实现抽象方法
        System.out.println("鼠标点击");
    }
}

(4)接口特性

4.1不能直接new出接口的实例对象

4.2接口中的方法默认是public abstract修饰的方法

如下图中,接口中的方法除了 public abstract 能够修饰,其他任何修饰符组合都不能修饰,第一句中没有任何修饰符也未报错,说明接口中的方法会被隐式的指定为 public abstract

但在jdk8中引入了个新特性,接口中也能定义一个default修饰的有具体实现的方法

如下图的click2方法

4.3接口中的方法是不能在接口中实现的,只能由实现接口的类来实现

因为接口中方法被隐式地指定为public abstract修饰,所以为抽象方法,与抽象类中的抽象方法类似,只能由实现接口的类来实现方法。

4.4重写接口中方法时,不能使用默认的访问权限

原因:Java的访问控制规则要求子类(或实现类)不能降低父类(或接口)中方法的访问级别(接口方法为public,默认级别为default),因为如果允许子类降低方法的访问级别,那么依赖于父类方法的客户端代码可能会突然失去对这些子类方法的访问权限,导致运行时错误或编译时错误。这破坏了程序的稳定性和可预测性。

4.5 接口中的变量会被隐式的指定为 public static final 变量

如下图中,length变量可以直接通过接口名访问,说明此变量被static修饰,若修改length的值编译器会报错,说明length被final修饰。

4.6接口中不能有静态代码块和构造方法

没有静态代码块原因: 接口中的变量默认就是public static final的,即它们已经是被初始化的常量,不需要也不应该通过静态代码块进行额外的初始化。
接口中不能有构造方法的原因:由于接口没有实例,因此也就不需要构造方法来初始化实例,接口的设计原则是尽可能地简单和清晰。允许接口有构造方法会违反这一原则,因为它会引入不必要的复杂性和潜在的混淆。
为什么抽象类可以有构造方法,而接口不能有构造方法?
原因:虽然抽象类不能被直接实例化,但它们 可以被用作其他类的父类,在继承关系中,子类的构造方法会隐式或显式地调用父类的构造方法。

4.7 接口编译完成后字节码文件的后缀格式也是.class

4.8 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类

与子类继承抽象类,必须重写抽象方法类似

4.9接口之间可以实现多继承即一个接口继承多个接口

如图Mouse接口同时继承了Running,walking接口

(5)接口小结

1.使用interface定义一个接口
2.接口中的方法只能是public abstract修饰的方法
3. 接口中的变量会被隐式的指定为 public static final 变量
4.接口中不能有静态代码块和构造方法
5.接口之间可以实现多继承即一个接口继承多个接口

(三)抽象类与接口的区别

1.抽象类中可以包含普通方法和普通字段 ,   而接口中不能包含普通方法,且只能包含常量(被public static final修饰)  子类必须重写所有的抽象方法
2.抽象类中可以包含构造方法,接口中不能有构造方法
3.接口之间能够实现多继承,抽象类之间不能
4.一个子类只能继承一个抽象类,但一个子类能够实现多个接口
  • 28
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值