抽象类中的面试题

本文探讨了抽象类及其抽象方法的使用原则,包括抽象类不包含抽象方法的意义、抽象关键字与static、final及private等关键字的共存问题,并通过具体示例进行了说明。

抽象类中的面试题

class Demo04_Abstract {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

/*
* A:面试题1
    * 一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
    * 可以
    * 这么做目的只有一个,就是不让其他类创建本类对象,交给子类完成
* B:面试题2
    * abstract不能和哪些关键字共存
    abstract和static
    被abstract修饰的方法没有方法体
    被static修饰的可以用类名.调用,但是类名.调用抽象方法是没有意义的

    abstract和final
    被abstract修饰的方法强制子类重写

    abstract和private
    被abstract修饰的是为了让子类看到并强制重写
    被private修饰不让子类访问,所以他俩是矛盾的
*/

abstract class Demo {
    //public static abstract void print();      //错误: 非法的修饰符组合: abstract和static
    //public final abstract void print();       //错误: 非法的修饰符组合: abstract和final
    private abstract void print();              //错误: 非法的修饰符组合: abstract和private
}
### 接口与抽象类的区别 在Java中,接口和抽象类是两种用于实现抽象的重要机制。它们虽然有相似之处,但也有许多关键区别[^2]。 #### 1. 定义方式 - **抽象类**:使用`abstract`关键字定义,可以包含抽象方法(没有实现的方法)和具体方法(有实现的方法)。抽象类还可以包含成员变量、构造方法等。 - **接口**:使用`interface`关键字定义,接口中的方法默认是`public`、`abstract`的,从Java 8开始,接口也可以包含默认方法(`default`)和静态方法。 #### 2. 继承方式 - **抽象类**:一个类只能继承一个抽象类,使用`extends`关键字。 - **接口**:一个类可以实现多个接口,使用`implements`关键字。这弥补了Java不支持多继承的限制[^3]。 #### 3. 成员变量 - **抽象类**:可以包含实例变量、静态变量以及常量。 - **接口**:只能包含`public`、`static`、`final`的常量,不能有实例变量。 #### 4. 方法实现 - **抽象类**:可以包含具体方法的实现,也可以包含抽象方法。 - **接口**:在Java 8之前,接口中的方法必须是抽象的;从Java 8开始,接口可以包含默认方法和静态方法,允许部分实现。 #### 5. 构造方法 - **抽象类**:可以有构造方法,用于初始化成员变量或供子类调用。 - **接口**:不能有构造方法,因为接口本身不能被实例化。 #### 6. 使用场景 - **抽象类**:适用于具有共同属性和行为的类,适合表示“是什么”的关系。例如,`Animal`可以作为一个抽象类,`Dog`和`Cat`继承自它[^5]。 - **接口**:适用于表示能力或特性,适合表示“有没有”的关系。例如,`Flyable`接口可以由`Bird`和`Airplane`实现,表示它们具备飞行的能力[^5]。 #### 7. 设计理念 - **抽象类**:更倾向于代码复用,提供了一种模板化的结构。 - **接口**:更倾向于定义规范,强调的是功能契约[^4]。 ### 示例代码 以下是一个简单的示例,展示抽象类和接口的使用: ```java // 抽象类 abstract class Animal { String name; public Animal(String name) { this.name = name; } abstract void makeSound(); // 抽象方法 void eat() { // 具体方法 System.out.println(name + " is eating."); } } // 接口 interface Flyable { default void fly() { // 默认方法 System.out.println("Flying..."); } } // 子类 class Bird extends Animal implements Flyable { public Bird(String name) { super(name); } @Override void makeSound() { System.out.println(name + " says tweet tweet."); } } public class Main { public static void main(String[] args) { Bird bird = new Bird("Sparrow"); bird.makeSound(); bird.eat(); bird.fly(); } } ``` ### 结论 在面试中,了解接口和抽象类的区别是非常重要的。抽象类适合用于具有共同特性的类,而接口更适合用于定义功能契约。根据实际需求选择合适的设计方式,能够更好地体现面向对象编程的思想[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左绍骏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值