JavaSE——抽象类和接口详解

ced485cbb11e458d81a746890b32cf3f.gif

作者:敲代码の流川枫

博客主页:流川枫的博客

专栏:和我一起学java

语录:Stay hungry stay foolish

工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网

点击免费注册和我一起刷题吧  

目录

1. 抽象类

1.1 认识抽象类

1.2 抽象类的特性总结

1.3 抽象类的一个重要作用

2. 接口

2.1 如何理解接口?

2.2 接口的使用

2.3 接口特性

2.4 实现多个接口

2.5 接口间的继承

3. 抽象类与接口


1. 抽象类

1.1 认识抽象类

概念:一个类没有足够的信息去描述一个具体的对象时,这个类就是一个抽象类

语法:一个被abstract修饰的类称为抽象类,抽象类中被abstract修饰的方法称为抽象方法,抽象方法不用给出具体的实现体

格式:

示例: 

abstract class Shape{
    abstract public void draw();
    abstract void calcArea();
    
    public double getArea(){
        return area;
    }
    protected double area;
}

抽象方法没有方法体

抽象类也可以增加普通方法与属性、构造方法

1.2 抽象类的特性总结

1.抽象类不能实例化

2.抽象方法不能是 private 修饰

3.抽象方法需要被子类继承,因此不能被final和static修饰

报错: 

Illegal combination of modifiers: 'abstract' and 'final' 

Illegal combination of modifiers: 'final' and 'abstract'

4.抽象类必须被继承,且子类必须重写父类的抽象方法,否则子类也是抽象类

abstract class Shape{
    abstract public void draw();
    abstract void calcArea();

    public double getArea(){
        return area;
    }
    protected double area;
}
class Circle extends Shape{
    private double r;
    final private static double PI = 3.14;

    public Circle(double r) {
        this.r = r;
    }

    @Override
    public void draw() {
        System.out.println("圆形:r"+r);
    }

    @Override
    void calcArea() {
        area = PI*r*r;
    }
    @Override
    public double getArea() {
        return super.getArea();
    }
}

5.抽象类中不一定包含抽象方法,有抽象方法的类一定是抽象类

6.抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量

1.3 抽象类的一个重要作用

在继承一个类后,如果是继承普通类,没有重写方法不会报错,如果继承抽象类,没有重写父类方法是会报错的,利用编译器的校验, 在实际开发中是非常有意义

2. 接口

2.1 如何理解接口?

接口就是公共的行为规范标准,实现时,只要符合规范标准,就可以通用

电子产品的USB、电源插座等

Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型

 语法:

接口的定义与类基本相同,关键字:interface

1. 创建接口时, 接口的命名一般以大写字母I开头

2. 接口的命名一般使用 "形容词" 词性的单词

public interface Inter {
       //抽像方法
        void method();
}

2.2 接口的使用

接口是不能直接使用的,要定义具体类来实现接口中的所有抽象方法

关键字:implements

注意:子类和父类之间是extends 继承关系,类与接口之间是 implements 实现关系

格式:

public class 类名称 implements 接口名称 {
        //...
}

2.3 接口特性

1.接口类型不能直接实例化,就是new对象

2. 接口中的方法会被隐式的指定为public abstract,其他修饰符会报错

 3.接口中的方法由实现接口的类来实现

 4.重写接口中方法时,不能使用default访问权限修饰

报错: 'A'中的'openDevice()'与'USB'中的'openDevice()'冲突;试图分配较弱的访问权限('package-private');“公共”

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

6. 接口不能有静态代码块和构造方法

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

8. 类必须实现接口中的所有的抽象方法,否则类必须设置为抽象类

 报错:类“A”必须被声明为抽象,或者在“USB”中实现抽象方法“USB()”

2.4 实现多个接口

继承是单继承的,但是一个类可以实现多个接口

看一个例子:

public class Test {
    public static void main(String[] args) {
        dragon drag = new dragon("dragon");
        drag.fly();
        drag.swim();
    }

}

//定义一个动物类
class Animal{
    protected String name;

    public Animal(String name){
        this.name = name;
    }
}
//定义接口

interface IFlying{
    void fly();
}

interface ISwimming{
    void swim();
}
//定义鸟类

class Bird extends Animal implements IFlying{
    public Bird(String name) {
        super(name);
    }

    @Override
    public void fly() {
        System.out.println(name+"正在用翅膀飞");
    }
}
//定义鱼类

class Fish extends Animal implements ISwimming {
    public Fish(String name) {
        super(name);
    }

    @Override
    public void swim() {
        System.out.println(name+"正在用尾巴游");
    }
}
//定义龙类

class dragon extends Animal implements ISwimming,IFlying{
    public dragon(String name) {
        super(name);
    }

    @Override
    public void fly() {
        System.out.println(name+"正在腾云驾雾");
    }

    @Override
    public void swim() {
        System.out.println(name+"正在海里游");
    }
}

 注意:一个类实现多个接口,必须要实现所有的抽象方法,否则要设置为抽象类

2.5 接口间的继承

类和类是单继承的,接口之间可以多继承

关键字:extends

interface IAmphibious extends IFlying,ISwimming{
    @Override
    void fly();
    @Override
    void swim();
}
class dragon1 extends Animal implements IAmphibious{

    public dragon1(String name) {
        super(name);
    }
    @Override
    public void fly() {
        //...
    }
    @Override
    public void swim() {
        //...
    }
}

注意:接口间的继承相当于多个接口合并

3.抽象类与接口

核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法

抽象类的存在是为了让编译器更好的校验❌

语法上的区别:

1.抽象类的成员变量是无限制的,接口中的成员变量只能是public static final类型的

2.抽象类可以提供成员方法的实现细节,接口中只能存在public abstract 方法

3.抽象类可以有静态代码块和静态方法,接口中不能含有静态代码块以及静态方法

4.一个类只能继承一个抽象类,一个类却可以实现多个接口

“ 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!

ced485cbb11e458d81a746890b32cf3f.gif

猜你喜欢

转载自blog.csdn.net/chenchenchencl/article/details/126244071