首页 > 其他分享 >抽象类和接口的应用(附面试题)

抽象类和接口的应用(附面试题)

时间:2023-06-04 12:03:47浏览次数:36  
标签:面试题 AbstractAnimal void 接口 static 抽象类 方法

抽象类

定义

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。简单来说,使用关键字 abstract 修饰的类就叫做抽象类。

抽象类使用

示例代码,如下:

abstract class AbstractAnimal {
    public AbstractAnimal() {
        System.out.println("Init AbstractAnimal.");
    }
    static String name = "AbstractAnimal";
    public abstract void eat();
    public void run() {
        System.out.println("AbstractAnimal Run.");
    }
}
class Animal extends AbstractAnimal {
    public static void main(String[] args) {
        AbstractAnimal animal = new Animal();
        animal.run();
        System.out.println(animal.name);
        animal.eat();
    }
  // 必须重写抽象父类方法
    @Override
    public void eat() {
        System.out.println("Animal Eat.");
    }
}

以上代码执行的结果:

Init AbstractAnimal.
AbstractAnimal Run.
AbstractAnimal
Animal Eat.
抽象方法

使用 abstract 关键字修饰的方法叫做抽象方法,抽象方法仅有声明没有方法体。如下代码:

public abstract void m();
抽象类的特性
  • 抽象类不能被初始化
  • 抽象类可以有构造方法
  • 抽象类的子类如果为普通类,则必须重写抽象类中的所有抽象方法
  • 抽象类中的方法可以是抽象方法或普通方法
  • 一个类中如果包含了一个抽象方法,这个类必须是抽象类
  • 子类中的抽象方法不能与父类中的抽象方法同名
  • 抽象方法不能为 private、static、final 等关键字修饰
  • 抽象类中可以包含普通成员变量,访问类型可以任意指定,也可以使用静态变量(static)

接口

定义

接口(interface)是抽象类的延伸,它允许一个类可以实现多个接口,弥补了抽象类不能多继承的缺陷,接口是对类的描述,使用 interface 关键字来声明。

接口使用

示例代码,如下:

interface IAnimal {
    void run();
}
class AnimalImpl implements IAnimal {
    public static void main(String[] args) {
        IAnimal animal = new AnimalImpl();
        animal.run();
    }
    @Override
    public void run() {
        System.out.println("AnimalImpl Run.");
    }
}
Java 8 中接口的改动

1)接口中增加了 default 方法和 static 方法,可以有方法体 示例代码,如下:

interface IAnimal {
    static void printSex() {
        System.out.println("Male Dog");
    }
    default void printAge() {
        System.out.println("18");
    }
}
class AnimalImpl implements IAnimal {
    public static void main(String[] args) {
        IAnimal.printSex();
        IAnimal animal = new AnimalImpl();
        animal.printAge();
  }
}

注意:static 方法属于接口方法,可以直接使用;default 属于实例方法,必须先创建实例。

2)接口中的静态变量会被继承 示例代码,如下:

interface IAnimal {
    static String animalName = "Animal Name";
    static void printSex() {
        System.out.println("Male Dog");
    }
}
class AnimalImpl implements IAnimal {
    public static void main(String[] args) {
        System.out.println(animalName);
        IAnimal.printSex();
    }
}

注意:静态变量会被继承,静态方法不会被继承。

3)新增函数式接口

函数式接口(Function Interface)是一个特殊的接口,使用 @FunctionInterface 注解声明,定义这种接口可以使用 Lambda 表达式直接调用。 示例代码,如下:

@FunctionalInterface
interface IAnimal {
    static String animalName = "Animal Name";
    static void printSex() {
        System.out.println("Male Dog");
    }
    default void printAge() {
        System.out.println("18");
    }
    void sayHi(String name);
}
class FunctionInterfaceTest {
    public static void main(String[] args) {
        IAnimal animal = name -> System.out.println(name);
        animal.sayHi("WangWang");
    }
}

注意:使用 @FunctionInterface 声明的函数式接口,抽象方法必须有且仅有一个,但可以包含其他非抽象方法。

相关面试题

1.抽象类中能不能包含方法体?

答:抽象类中可以包含方法体。抽象类的构成也可以完全是包含方法体的普通方法,只不过这样并不是抽象类最优的使用方式。

题目解析:包含了方法体的抽象类示例代码如下:

abstract class AbstractAnimal {
    public void run() {
        System.out.println("AbstractAnimal Run.");
    }
}
class Animal extends AbstractAnimal {
    public static void main(String[] args) {
        AbstractAnimal animal = new Animal();
        animal.run();
    }
}

以上代码执行的结果是: AbstractAnimal Run.

2.抽象类能不能被实例化?为什么?

答:抽象类不能被实例化,因为抽象类和接口的设计就是用来规定子类行为特征的,就是让其他类来继承,是多态思想的一种设计体现,所以强制规定抽象类不能被实例化。

3.抽象方法可以被 private 修饰吗?为什么?

答:抽象方法不能使用 private 修饰,因为抽象方法就是要子类继承重写的,如果设置 private 则子类不能重写此抽象方法,这与抽象方法的设计理念相违背,所以不能被 private 修饰。

4.添加以下哪个选项不会引起编译器报错?
abstract class AbstractAnimal {
    static String animalName = "AbstractAnimal";
      // 添加代码处
}

A:protected abstract void eat(); B: void eat(); C:abstract void eat(){}; D:animalName += "Cat";

答:A

题目解析:选项 B 普通方法必须有方法体;选项 C 抽象方法不能有方法体;选项 D 变量赋值操作必须在方法内。

5.以下关于抽象类和抽象方法说法正确的是?

A:抽象类中的方法必须全部为抽象方法 B: 抽象类中必须包含一个抽象方法 C:抽象类中不能包含普通方法 D:抽象类中的方法可以全部为普通方法(包含方法体)

答:D

题目解析:抽象类中可以没有方法或者全部为普通方法,都是允许的,如下代码所示:

abstract class AbstractAnimal {
    public void run() {
        System.out.println("AbstractAnimal Run.");
    }
}
class Animal extends AbstractAnimal {
    public static void main(String[] args) {
        AbstractAnimal animal = new Animal();
        animal.run();
    }
}

程序执行的结果为:AbstractAnimal Run.

6.接口和普通类有什么关系?

答:在 Java 语言设计中,接口不是类,而是对类的一组需求描述,这些类必须要遵循接口描述的统一格式进行定义。

7.接口能不能有方法体?

答:JDK 8 之前接口不能有方法体,JDK 8 之后新增了 static 方法和 default 方法,可以包含方法体。

8.执行以下代码会输出什么结果?
interface IAnimal {
    static String animalName = "Animal Name";
}
class AnimalImpl implements IAnimal {
    static String animalName = new String("Animal Name");
    public static void main(String[] args) {
        System.out.println(IAnimal.animalName == animalName);
    }
}

答:执行的结果为 false。

题目解析:子类使用 new String… 重新创建了变量 animalName,又因为使用 == 进行内存地址比较,所以结果就是 false。

9.抽象类和接口有什么区别?

答:抽象类和接口的区别,主要分为以下几个部分。

  • 默认方法
  • 抽象类可以有默认方法的实现
  • JDK 8 之前接口不能有默认方法的实现,JDK 8 之后接口可以有默认方法的实现
  • 继承方式
  • 子类使用 extends 关键字来继承抽象类
  • 子类使用 implements 关键字类实现接口
  • 构造器
  • 抽象类可以有构造器
  • 接口不能有构造器
  • 方法访问修饰符
  • 抽象方法可以用 public / protected / default 等修饰符
  • 接口默认是 public 访问修饰符,并且不能使用其他修饰符
  • 多继承
  • 一个子类只能继承一个抽象类
  • 一个子类可以实现多个接口
10.以下抽象方法描述正确的是?

A:抽象方法可以是静态(static)的 B:抽象方法可同时是本地方法(native) C:抽象方法可以被 synchronized 修饰 D:以上都不是

答:D

题目解析:抽象方法需要被子类重写,而静态方法是无法被重写的,因此抽象方法不能被静态(static)修饰;本地方法是由本地代码实现的方法,而抽象方法没有实现,所以抽象方法不能同时是本地方法;synchronized 和方法的实现细节有关,而抽象方法不涉及实现细节,因此抽象方法不能被 synchronized 修饰。

总结

抽象类和接口都是面向对象编程中多态的具体实现,在 Java 编程思想中占据着重要的地位,同时也是初级面试岗位必问的问题之一,但由于接口在 JDK 8 中的改动比较大,因而面试者在网上搜到的绝大数关于接口和抽象类区别的答案也是不准确的,这点需要面试者特别注意一下。

标签:面试题,AbstractAnimal,void,接口,static,抽象类,方法
From: https://blog.51cto.com/u_16013021/6410317

相关文章

  • java软件开发工程师实习求职常见面试题
    1、请说出作用域public,private,protected,以及不写时的区别这四个作用域的可见范围如下表所示。说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly。 作用域   当前类同一package子孙类其他packagepublic   √    √         √      ......
  • 图片接口JWT鉴权实现
    图片接口JWT鉴权实现前言之前做了个返回图片链接的接口,然后没做授权,然后今天键盘到了,也是用JWT来做接口的权限控制。然后JTW网上已经有很多文章来说怎么用了,这里就不做多的解释了,如果不懂的可以参考下列链接的文章。图片接口文章:还在愁个人博客没有图片放?JTW参考:画星星博客......
  • Request类源码分析、序列化组件介绍、序列化类的基本使用、常用字段类和参数、反序列
    目录一、Request类源码分析二、序列化组件介绍三、序列化类的基本使用查询所有和查询单条四、常用字段类和参数(了解)常用字段类字段参数(校验数据来用的)五、反序列化之校验六、反序列化之保存七、APIVIew+序列化类+Response写的五个接口代码八、序列化高级用法之source(了解)九、......
  • gnmi 基于grpc 的网络管理接口
    网络自动化是这几年对于网络管理比较重要的话题,openconfig就是一个开放组织,gnmi是基于grpc提供的网络管理接口,对于需要开发网络自动化的应用是值得参考使用的参考资料https://github.com/openconfig/gnmihttp://www.openconfig.net/......
  • 什么是OSPF被动接口?如何配置?华为、思科、瞻博网络三厂商命令来了
    OSPF被动接口是一种用于监测邻居关系和接收来自邻居的Hello消息的特殊接口。通过配置被动接口,可以节省网络资源,降低网络开销,提高网络安全性,并简化配置管理。被动接口的使用可以改善网络稳定性,确保路由器之间的正常通信。本文还给大家安利了华为、思科和瞻博网络三个厂商的OSPF被动......
  • 面试题:如何理解 JS的异步?
    JS是一门单线程的语言,这是因为它运行在浏览器的渲染主线程中,而渲染主线程只有一个而渲染主线程承担着诸多的工作,渲染页面、执行JS都在其中运行。如果使用同步的方式,就极有可能导致主线程产生阻塞,从而导致消息队列中的很多其他任务无法得到执行。这样一来,一方面会导致繁忙的主线......
  • 如何使用关键词搜索API接口获取到快手的商品
    如果您想使用关键词搜索API接口获取到快手的商品,可以通过以下步骤实现:1.首先注册账号。根据文档申请相应的接口权限。2.确定需要使用的API接口。对于商品搜索,您可以查看相关的API文档以获取参数和请求方法。3.根据API文档中提供的接口地址、参数等信息,发送HTTP请求。您可以......
  • 面向接口的方式进行CRUD
    1. 代码   65-66 main中com.powernode.mybatis.mapper接口CarMapperpackagecom.powernode.mybatis.mapper;importcom.powernode.mybatis.pojo.Car;importjava.util.List;//接口//面向接口的方式进行CRUD65//一般使用mybatis的话,一般不叫做XXXDao了。一般都是XX......
  • 一个多功能(聚合)查询接口,实现模糊、分页、主键、排序以及多条件查询
    一个多功能(聚合)查询接口,实现模糊、分页、主键、排序以及多条件查询前言写的啰嗦了点,看效果请直接忽略中间,直接看后半部分。引个流,公众号:小简聊开发概念瞎编的名字,哈哈哈,我就勉强称之为聚合查询吧,不知道概念符不符合。大家好,我是小简,很久没写文章了,确实是太忙了,今天我......
  • 接口并发解决方案
    设定一个场景,假如一个商品接口在某段时间突然上升,会怎么办?生活中的例子来说,假设冰墩墩在当天晚上上热搜之后,迅速有十几万人去淘宝下单购买,此时并没有做好对该商品的缓存预热以及准备,如何操作?对于这个问题,在电商高并发系统中,对接口的保护一般采用:缓存、限流、降级来操作。假设该接......