抽象类 和 接口 的异同

本文详细介绍了Java中的抽象类和接口的区别与应用场景。抽象类不能被实例化,可包含抽象方法和非抽象方法;接口则仅包含抽象方法和静态常量,一个类可以实现多个接口以达到多继承效果。接口间可以继承,提供复用性。抽象类与接口在设计上各有优势,前者允许有具体实现,后者强调规范与契约。
摘要由CSDN通过智能技术生成

1、抽象类:

(1) 含有abstract修饰符的class即为抽象类,在方法前加上 abstract 关键字, 表示这是一个抽象方法. 同时抽象方法没有方法体(没有 { }, 不能执行具体代码)

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

(2)abstract 类不能创建实例对象

Shape shape = new Shape(); 
// 编译出错
Error:(30, 23) java: Shape是抽象的; 无法实例化

(3)抽象方法不能是 private 的

abstract class Shape { 
    abstract private void draw(); 
} 
// 编译出错
Error:(4, 27) java: 非法的修饰符组合: abstractprivate

(4)抽象类中可以包含其他的非抽象方法, 也可以包含字段. 这个非抽象方法和普通方法的规则都是一样的, 可以被重写,也可以被子类直接调用

abstract class Shape { 
    abstract public void draw(); 
    void func() { 
        System.out.println("func"); 
    } 
} 
class Rect extends Shape { 
 ... 
} 
public class Test { 
    public static void main(String[] args) { 
        Shape shape = new Rect(); 
        shape.func(); 
    } 
} 
// 执行结果
func

2、接口:

(1)接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
接口不能被单独实例化

interface IShape { 
    void draw(); 
    public static final int num = 10;
} 
class Cycle implements IShape { 
    @Override 
    public void draw() { 
        System.out.println("○"); 
    } 
}  
public class Test { 
    public static void main(String[] args) { 
        IShape shape = new Rect(); 
        shape.draw(); 
    } 
}

(2)有的时候我们需要让一个类同时继承自多个父类. 这件事情在有些编程语言通过 多继承 的方式来实现的.
然而 Java 中 只支持单继承, 一个类只能 extends 一个父类. 但是可以 同时实现多个接口 , 也能达到多继承类似的效果。
现在我们通过类来表示一组动物:

// 定义一个父类 动物
class Animal { 
    protected String name; 
    public Animal(String name) { 
        this.name = name; 
    } 
}

// 定义三个接口
interface IFlying { 
    void fly(); 
} 
interface IRunning { 
    void run(); 
} 
interface ISwimming { 
    void swim(); 
}

// 创建一个子类 猫
class Cat extends Animal implements IRunning { 
    public Cat(String name) { 
        super(name); 
    } 
    @Override 
    public void run() { 
        System.out.println(this.name + "正在用四条腿跑"); 
    } 
}

// 创建一个子类 鸭子
class Duck extends Animal implements IRunning, ISwimming, IFlying { 
    public Duck(String name) { 
        super(name); 
    } 
    @Override 
    public void fly() { 
        System.out.println(this.name + "正在用翅膀飞"); 
    } 
    @Override 
    public void run() { 
        System.out.println(this.name + "正在用两条腿跑"); 
    } 
    @Override 
    public void swim() { 
        System.out.println(this.name + "正在漂在水上"); 
    } 
}

多态的好处, 让程序猿忘记类型.。。有了接口之后, 类的使用者就不必关注具体类型, 而
只关注某个类是否具备某种能力.

(3)接口间的继承:
接口可以继承一个接口, 达到复用的效果. 使用 extends 关键字

interface IRunning { 
    void run(); 
} 
interface ISwimming { 
    void swim(); 
} 
// 两栖的动物, 既能跑, 也能游
interface IAmphibious extends IRunning, ISwimming { 
} 
class Frog implements IAmphibious { 
 ... 
}

3、抽象类和接口的异同:

(1)相同:

  • 不能实例化
  • 可以将抽象类和接口类型作为引用类型
  • 一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类

(2)核心区别:
抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法.
(抽象类存在的意义是为了让编译器更好的校验)

抽象类接口
普通类+抽象(非抽象)方法+构造方法抽象方法+全局变量
各种权限public
使用 extends 继承抽象类使用 implements 实现接口
一个抽象类可以实现若干接口接口不能继承抽象类,但是接口可以使用 extends 继承多个父接口
一个子类只能继承一个抽象类一个子类可以实现多个接口

在这里插入图片描述

看到这里的小伙伴,觉得对你有用的话,点个赞,给个关注再走呗!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值