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);
}
}
运行结果如下:
