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);
    }
}

运行结果如下:

相关推荐
AI视觉网奇2 小时前
ue5 自定义 actor ac++ actor 用法实战
java·c++·ue5
光明顶上的5G2 小时前
本地缓存面试重点
java·缓存·面试
haluhalu.2 小时前
深入理解Linux线程机制:线程概念,内存管理
java·linux·运维
jiaguangqingpanda2 小时前
Day22-20260118
java·开发语言
雪碧聊技术2 小时前
1、LangChain4j 名字的寓意
java·大模型·langchain4j
Ulyanov2 小时前
战场地形生成与多源数据集成
开发语言·python·算法·tkinter·pyside·pyvista·gui开发
风生u2 小时前
bpmn 的理解和元素
java·开发语言·工作流·bpmn
C+-C资深大佬3 小时前
C++数据类型
开发语言·c++·算法
ID_180079054733 小时前
日本乐天商品详情API接口的请求构造与参数说明
开发语言·python·pandas