Java面试题:普通类和抽象类有哪些区别?

本文将介绍“普通类和抽象类有哪些区别?”面试题

抽象类(abstract class)

(1)使用 abstract 关键字修饰的类称为抽象类。例如:

public abstract class Demo {
    // 一个抽象类
}

(2)使用 abstract 关键字修饰的方法称为抽象方法,注意:抽象方法可以没有具体的实现。例如:

public abstract class Demo {
    // 抽象方法
    public abstract void show();
}

(3)在抽象类的子类中必须对抽象方法进行重写,当其子类为抽象类时,可以不重写抽象方法,但在其子类中一旦有普通类,则必须重写父类继承的所有抽象方法。例如:

public abstract class Demo {
    public abstract void show();
}

public abstract class Demo2 extends Demo {
    public abstract void show2();
}

public class Demo3 extends Demo2 {
    // 实现 Demo 的接口
    public void show() {
        System.out.println("show()");
    }

    // 实现 Demo2 的接口
    public void show2() {
        System.out.println("show2()");
    }
}

(4)抽象类不可以实例化,抽象类的构造方法作用为初始化子类对象。例如:

public abstract class MyAbstract {
    private String message;

    public MyAbstract(String message) {
        this.message = message;
    }

    public void show() {
        System.out.println(message);
    }

}

public class Demo extends MyAbstract {

    public Demo(String message) {
        super(message);
    }

    public static void main(String[] args) {
        Demo demo = new Demo("Hello World");
        demo.show();
    }

}

(5)抽象类中的普通属性和普通方法都需要用子类的对象去调用。例如:

public abstract class MyAbstract {
    // 抽象类中的一个普通方法
    public void show(String message) {
        System.out.println(message);
    }
}

public class Demo extends MyAbstract {

    public static void main(String[] args) {
        Demo demo = new Demo();
        // 调用抽象类的方法
        demo.show("Hello World");
    }

}

普通类(class)

(1)普通类可以实例化,实例化后可以调用自己类中的属性和方法,以及父类中的方法和属性。

(2)普通类的构造方法中必须要调用父类的构造方法。如果父类没有定义带参数构造方法,子类则不需要显示调用父类构造方法。例如:

public abstract class MyAbstract {
    private String message;

    // 自定义无参构造方法,初始化 message 变量
    public MyAbstract() {
        this.message = "Hello world";
    }

    public void show() {
        System.out.println(message);
    }

}

public class Demo extends MyAbstract {
    // 默认调用了父类的无参构造方法
    public Demo() {}

    public static void main(String[] args) {
        Demo demo = new Demo();
        demo.show();
    }

}

运行示例,输出如下:

Hello world

(3)如果普通类继承了抽象类,那么必须要重写所有父类的抽象方法。

总结

抽象类的存在时为了被继承,不能实例化,而普通类存在是为了实例化一个对象。

抽象类的子类必须重写抽象类中的抽象方法,而普通类可以选择重写父类的方法,也可以直接调用父类的方法。

抽象类必须用 abstract 来修饰,普通类则不用。

普通类和抽象类都可以含有普通成员属性和普通方法。

普通类和抽象类都可以继承别的类或者被别的类继承。

普通类和抽象类的属性和方法都可以通过子类对象来调用。

游手好闲地学习,并不比学习游手好闲好。 —— 约翰·贝勒斯
1 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号