Java抽象类与接口深度解析

Java学习之抽象类和接口

一、抽象类是什么

1、抽象类的定义

抽象类就像一个不完整的设计图纸:

①、它规定了子类必须实现的功能(就像图纸规定了产品必须有的部件),但自己不做具体实现。

②、它不能直接 "造东西"(不能实例化),只能被其他类继承,由子类来完善这个图纸。
eg:

"动物" 可以作为抽象类,它定义了 "叫" 这个行为,但不同动物的叫声不同(猫叫、狗叫),所以 "叫" 的具体实现要交给猫、狗这些子类来完成。

2、抽象类的特点

①、关键字:用 abstract 修饰类和方法(抽象方法)。

②、抽象方法:只有方法声明,没有方法体({}),必须由子类重写。

③、不能实例化:不能用 new 抽象类名() 创建对象。

④、可以包普通方法:抽象类里既可以有抽象方法,也可以有带具体实现的普通方法。

下面我们通过一段代码向大家解释抽象类:

Animal类

java 复制代码
public abstract class Animal {
    public  String name;
    public int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public  void eat(){
        System.out.println(this.name+"需要吃东西");
    };
    // 抽象方法(只有声明,没有实现)
    // 规定子类必须实现"叫"的行为,但不指定怎么叫
    public abstract void makeSound();
}

Cat类

java 复制代码
public class Cat extends Animal{

    public Cat(String name, int age) {
        super(name, age);
    }

    @Override
    public void makeSound() {
        System.out.println(this.name+"喵喵喵~");
    }
}

Dog类

java 复制代码
public class Dog extends Animal{

    public Dog(String name, int age) {
        super(name, age);
    }
    @Override
    public void makeSound() {
        System.out.println(this.name+"汪汪汪~");
    }
}

TestDemo类

java 复制代码
public class TestDemo {
    public static void main(String[] args) {
        Dog dog =new Dog("dahuang",12);
        dog.eat();//调用抽象类的普通方法
        dog.makeSound(); // 调用子类重写的抽象方法
        System.out.println("========");
        Cat cat=new Cat("mimi",11);
        cat.eat();//调用抽象类的普通方法
        cat.makeSound();// 调用子类重写的抽象方法
    }
}

运行结果如下:

3、抽象类的使用场景

①、统一规范:当多个子类有共同的行为,但具体实现不同时,用抽象类定义统一的方法名,强制子类实现。

②、代码复用:抽象类中的普通方法可以被所有子类继承,避免重复代码。

③、设计约束:防止用户直接创建基类对象(比如 "动物" 本身没有具体形态,只能创建猫、狗等具体动物)。

二、什么是接口

1、接口的定义

接口是面向对象编程中更纯粹的规范契约,它只定义 "必须做什么",完全不关心 "怎么做",可以看作是抽象类的极端形式。

①、它只规定了实现者必须提供的方法(功能),但不包含任何具体实现。

②、任何类只要 "签了这份合同"(实现该接口),就必须实现接口中所有的方法

③、一个类可以同时 "签多份合同"(实现多个接口),解决了 Java 中类单继承的限制。

2、接口的特点

①、关键字:用 interface 定义,实现接口用 implements。

②、方法默认修饰符:public abstract(可省略),所有方法都是抽象方法。

③、成员变量默认修饰符:public static final(可省略),即常量。

④、多实现:一个类可以实现多个接口,用逗号分隔(class A implements B,C)。

⑤、不能实例化:和抽象类一样,不能用 new 创建对象。

⑥、可以继承接口:一个接口可以继承另一个接口,用 extends。

下面我们举一个使用接口的例子:

Animal类:

java 复制代码
public abstract class Animal {
    public String name;
    public  int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public abstract void eat();
}

IRunable接口:

java 复制代码
public interface IRunable {
    void Run();
}

IFlyable接口:

java 复制代码
public interface IFlyable {
    void fly();
}

Bird类:

java 复制代码
public class Bird extends Animal implements IFlyable,IRunable{

    public Bird(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(this.name+"在吃东西");
    }

    @Override
    public void fly() {
        System.out.println(this.name+"在天上飞");
    }

    @Override
    public void Run() {
        System.out.println(this.name+"在地上跑");
    }
}

TestDemo类:

java 复制代码
public class TestDemo {
    public static void main(String[] args) {
        Bird bird=new Bird("小飞",12);
        bird.eat();
        bird.fly();
        bird.Run();
    }   
}

运行结果如下:

三、接口的继承

1、接口继承的定义

接口的继承是面向对象编程中,让一个接口继承另一个(或多个)接口的特性,从而复用并扩展原有接口的规范。

2、接口继承的核心特点

①、关键字:使用 extends(与类继承相同,但接口支持多继承)

②、多继承支持:一个接口可以同时继承多个父接口,用逗号分隔

③、规范的合并与扩展:子接口会继承父接口的所有抽象方法,还可以新增自己的抽象方法

④、传递性:实现子接口的类,必须实现子接口及其所有父接口的全部抽象方法

下面我们通过代码示例来讲解接口继承

IShape接口:

java 复制代码
public interface IShape {
    void draw(); // 绘制图形
}

IMovable接口:

java 复制代码
public interface IMovable {
    void move(int x, int y); // 移动图形
}

IResizableShape接口:

java 复制代码
public interface IResizableShape extends IShape, IMovable {
    void resize(double factor); // 新增:缩放图形
}

Circle类:

java 复制代码
public class Circle implements IResizableShape {

    @Override
    public void resize(double factor) {
        System.out.println("圆形缩放" + factor + "倍");
    }

    @Override
    public void move(int x, int y) {
        System.out.println("圆形移动到(" + x + ", " + y + ")");
    }

    @Override
    public void draw() {
        System.out.println("绘制圆形");
    }
}

TestDemo类

java 复制代码
public class TestDemo {
    public static void main(String[] args) {
        IResizableShape circle = new Circle();
        circle.draw();
        circle.move(10, 20);
        circle.resize(1.5);
    }
}

运行结果如下:

相关推荐
Sylvia-girl1 小时前
IO流~~
java·开发语言
冰暮流星1 小时前
javascript之数组
java·前端·javascript
Re.不晚1 小时前
JAVA进阶之路——无奖问答挑战3
java·开发语言
代码游侠2 小时前
C语言核心概念复习——C语言基础阶段
linux·开发语言·c++·学习
㓗冽2 小时前
60题之内难题分析
开发语言·c++·算法
dingdingfish2 小时前
Bash学习 - 第3章:Basic Shell Features,第5节:Shell Expansions
开发语言·学习·bash
rainbow68892 小时前
C++开源库dxflib解析DXF文件实战
开发语言·c++·开源
不倒翁玩偶2 小时前
IDEA导入新的SpringBoot项目没有启动按钮
java·spring boot·intellij-idea
deepxuan2 小时前
Day7--python
开发语言·python
小小小米粒2 小时前
Maven Tools
java