抽象类 和 接口你所需要的知道的(面试)

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、抽象类和接口的区别:

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

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

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

猜你喜欢

转载自blog.csdn.net/qq_45658339/article/details/109259398