Java面试基础:面向对象(2)

1. 接口里可以定义哪些方法

抽象方法:抽象方法是接口的核心部分,所有实现接口的类都必须实现这些方法。抽象方法默认是 publicabstract 修饰,这些修饰符可以省略。

public interface Animal {void Sound();
}

默认方法:默认方法是在Java8中引入的,允许接口提供具体的实现。实现类可以重写默认方法。

public interface Animal {void Sound();default void eat() {System.out.println("Eating...")}
}

静态方法:静态方法也是中Java8中引入的,属于接口本身,可以通过接口名来直接调用,不需要实现类的对象。

public interface Animal {void Sound();static void staticMethod() {System.out.println("Static method...")}
}

私有方法:私有方法是在Java9中引入的,用于在接口中为默认方法或其他私有方法提供辅助功能。这些方法不能被实现类访问,而是只能在接口内部使用。

public interface Animal {void Sound();default void eat() {System.out.println("Eating...")}private void sleep() {System.out.println("Sleeping...")}
}

2. 接口可以包含构造函数吗

在接口中,不可以有构造方法,在接口里写入构造方法时,编译器会提示:Interface cannot have constructors,因为接口不会有自己的实例,所以不需要有构造函数。

主要原因是构造函数就是初始化 class 的属性或者方法,在 new 的瞬间自动调用,接口都不能 new 实例化,所以就无法调用,因此没有构造函数。

3. 解释Java中的静态变量和静态方法

在Java中静态变量和静态方法是与类本身关联的,而不是与类的实例 (对象) 关联。

它们在内存中只存在一份,可以被类的所有实例共享。

静态变量

静态变量 (也称为类变量) 是在类中使用 static 关键字声明的变量。它们属于类而不是任何具体的对象。主要的特点有 :

  • 共享性: 所有该类的实例共享同一个静态变量。如果一个实例修改了静态变量的值,其他实例也会看到这个更改。
  • 初始化: 静态变量在类被加载时初始化,只会对其进行一次分配内存。
  • 访问方式: 静态变量可以直接通过类名访问,也可以通过实例访问,但推荐使用类名。
public class Myclass {// 静态变量static int staval = 0;public Myclass() {// 每创建一个对象,静态变量自增staval++;}public static void printStaVal() {System.out.println("Static Val:" + staval);}
}// 示例:
MyClass a1 = new MyClass();
MyClass a2 = new MyClass();
MyClass.printStaVal(); // 输出 Static Val: 2

静态方法

静态方法是在类中使用 static 关键字声明的方法。类似于静态变量,静态方法也属于类,而不是任何具体的对象。主要的特点:

  • 无实例依赖: 静态方法可以在没有创建类实例的情况下调用。对于静态方法来说,不能直接访问非静态的成员变量或方法,因为静态方法没有上下文的实例。
  • 访问静态成员: 静态方法可以直接调用其他静态变量和静态方法,但不能直接访问非静态成员。
  • 多态性: 静态方法不支持重写 (Override),但可以被隐藏 (Hide)。
public class Myclass {// 静态变量static int staval = 0;// 静态方法public static void stavalIncrement() {staval++;}// 静态方法public static void printStaVal() {System.out.println("Static Val:" + staval);}
}// 示例:
MyClass.stavalIncrement();
MyClass.printStaVal(); // 输出 Static Val: 1

使用场景

  • 静态变量: 常用于需要在所有对象间共享的数据,如计数器、常量等。
  • 静态方法: 常用于助手方法 (utility methods)、获取类级别的信息或者是没有依赖于实例的数据处理。

4. 非静态内部类和静态内部类的区别

  • 非静态内部类依赖于外部类的实例,而静态内部类不依赖于外部类的实例。
  • 非静态内部类可以访问外部类的实例变量和方法,而静态内部类只能访问外部类的静态成员。
  • 非静态内部类不能定义静态成员,而静态内部类可以定义静态成员。
  • 非静态内部类在外部类实例化后才能实例化,而静态内部类可以独立实例化。
  • 非静态内部类可以访问外部类的私有成员,而静态内部类不能直接访问外部类的私有成员,需要通过实例化外部类来访问。

5. 非静态内部类可以直接访问外部方法,编译器是怎么做到的

非静态内部类可以直接访问外部方法是因为编译器在生成字节码时会为非静态内部类维护一个指向外部类实例的引用
这个引用使得非静态内部类能够访问外部类的实例变量和方法。编译器会在生成非静态内部类的构造方法时,将外部类实例作为参数传入,并在内部类的实例化过程中建立外部类实例与内部类实例之间的联系从而实现直接访问外部方法的功能。

6. Java中 final 的作用是什么

final 关键字在Java中主要有三个方面的作用:修饰类、修饰方法、修饰变量。

修饰类:当 final 修饰一个类是,表示这个类不能被继承,是类继承体系中的最终形态。

例如:Java中的 String 类就是用 final 修饰的,这保证了 String 类的不可变性和安全性,可以防止其他类通过继承来改变 String 类的行为和特性。

修饰方法:用 final 修饰的方法不能在子类中被重写。

例如: java.lang.object 类中的 getClass方法就是 final 的,因为这个方法的行为是由 Java 虚拟机底层实现来保证的,不应该被子类修改。

修饰变量:当用 final 修饰基本数据类型的变量时,一旦该变量被赋值就不能再改变。对于引用数据类型,final 修饰意味着这个引用变量不能再指向其他对象。

例如:这里的 num 是一个常量,就不能再对其进行赋值操作,否则会编译报错。

final int num = 10;

例如:这里 str 不能再指向其他 StringBuilder 对象,但可以通过 str.append() 来修改字符串内容。

final StringBuilder str = new StringBuilder("Hello");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88857.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有哪些更加简洁的for循环?循环语句?

目录 简洁的for循环 循环过程修改循环变量 循环语句 不同编程语言支持的循环语句 foreach 无限循环 for循环历史 break和continue 循环判断结束值 循环标签 循环语句优化 循环表达式返回值 简洁的for循环 如果需要快速枚举一个集合的元素,尽管C语言可以…

RK3568/3588 Android 12 源码默认使用蓝牙mic录音

遇到客户一个需求,如果连接了带mic的蓝牙耳机,默认所有的录音要走蓝牙mic通道。这个功能搞了好久,终于搞定了。1. 向RK寻求帮助,先打通 bt sco能力。此时,还无法默认就切换到蓝牙 mic通道,接下来我们需求默…

解锁HTTP:从理论到实战的奇妙之旅

目录一、HTTP 协议基础入门1.1 HTTP 协议是什么1.2 HTTP 协议的特点1.3 HTTP 请求与响应的结构二、HTTP 应用场景大揭秘2.1 网页浏览2.2 API 调用2.3 文件传输2.4 内容分发网络(CDN)2.5 流媒体服务三、HTTP 应用实例深度剖析3.1 使用 JavaScript 的 fetc…

uvm_config_db examples

通过uvm_config_db类访问的UVM配置数据库,是在多个测试平台组件之间传递不同对象的绝佳方式。 methods 有两个主要函数用于从数据库中放入和检索项目,分别是 set() 和 get()。 static function void set ( uvm_component cntxt,string inst_name,string …

(C++)任务管理系统(文件存储)(正式版)(迭代器)(list列表基础教程)(STL基础知识)

目录 前言: 源代码: 代码解析: 一.头文件和命名空间 1. #include - 输入输出功能2. #include - 链表容器3. #include - 字符串处理4. using namespace std; - 命名空间 可视化比喻:建造房子 🏠 二.menu()函数 …

Java 中的异步编程详解

前言 在现代软件开发中,异步编程(Asynchronous Programming) 已经成为构建高性能、高并发应用程序的关键技术之一。Java 作为一门广泛应用于后端服务开发的语言,在其发展过程中不断引入和优化异步编程的支持。从最初的 Thread 和…

MySQL逻辑删除与唯一索引冲突解决

问题背景 在MySQL数据库设计中,逻辑删除(软删除)是一种常见的实践,它通过设置标志位(如is_delete)来标记记录被"删除",而不是实际删除数据。然而,当表中存在唯一约束时&am…

php命名空间用正斜杠还是反斜杠?

在PHP中,命名空间使用反斜杠(\)作为分隔符,这是PHP语言规范明确规定的。反斜杠在命名空间中扮演路径分隔的角色,用于区分不同层级的命名空间。 具体说明:语法规则 PHP命名空间使用反斜杠(\&…

《从依赖纠缠到接口协作:ASP.NET Core注入式开发指南》

在C#的ASP.NET Core开发中,依赖注入绝非简单的技术技巧,而是重构代码关系的底层逻辑。它像一套隐形的神经网络,让程序模块摆脱硬编码的束缚,在运行时实现动态连接,从而为系统注入可测试、可进化的核心生命力。理解其深…

星云ERP本地环境搭建笔记

看到星云ERP两个比较实用的功能,编号规则和打印模板,如下图所示,于是本地跑起来学习学习。开发环境必备:1. JDK 1.82. MySQL 5.73. Redis 44. RabbitMQ 3.12.45. nodejs 206. pnpm 9.7.1 (npm install -g pnpm9.7.1)其他开发工具&…

RedisJSON 的 `JSON.ARRAPPEND`一行命令让数组动态生长

1 、 为什么选择 JSON.ARRAPPEND 在传统的键值模型里,若要往数组尾部追加元素,通常需要 取→改→写 三步: GET 整个 JSON;在应用层把元素 push 进数组;SET 回 Redis。 一条 JSON.ARRAPPEND 则可一次完成,具…

14:00开始面试,14:08就出来了,问的问题有点变态。。。

从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到4月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…

Unity物理系统由浅入深第四节:物理约束求解与稳定性

Unity物理系统由浅入深第一节:Unity 物理系统基础与应用 Unity物理系统由浅入深第二节:物理系统高级特性与优化 Unity物理系统由浅入深第三节:物理引擎底层原理剖析 Unity物理系统由浅入深第四节:物理约束求解与稳定性 物理引擎的…

深入浅出Kafka Consumer源码解析:设计哲学与实现艺术

一、Kafka Consumer全景架构 1.1 核心组件交互图 #mermaid-svg-JDEEOd2M5PzLkYa6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JDEEOd2M5PzLkYa6 .error-icon{fill:#552222;}#mermaid-svg-JDEEOd2M5PzLkYa6 .erro…

Matplotlib(一)- 数据可视化与Matplotlib

文章目录一、数据可视化1. 数据可视化的概念2. 数据可视化流程3. 数据可视化目的4. 常见的可视化图表4.1 折线图4.2 柱形图4.3 条形图4.4 堆积图4.4.1 堆积面积图4.4.2 堆积柱形图和堆积条形图4.5 直方图4.6 箱形图4.7 饼图4.8 散点图4.9 气泡图4.10 误差棒图4.11 雷达图二、Py…

传输层协议UDP原理

端口号回顾端口号的作用类似pid,用来标识进程的唯一性。只是为了与系统解耦,所以有了端口号。通过ip来确定唯一主机,再通过端口号找到指定的进程。就可以让全网内唯一的两个进程通信了。所以一个完整的报文至少要携带ip和端口号,i…

【牛客刷题】小红的数字删除

文章目录 一、题目介绍1.1 题目描述1.2 输入描述:1.3 输出描述:1.4 示例11.5 示例2二、解题思路2.1 核心观察2.2 关键问题处理三、算法实现四、算法分析4.1 算法流程图4.2 为什么这么设计算法?4.3 算法复杂度五、模拟演练数据示例1: "103252"示例2: "333&quo…

《大数据技术原理与应用》实验报告三 熟悉HBase常用操作

目 录 一、实验目的 二、实验环境 三、实验内容与完成情况 3.1 用Hadoop提供的HBase Shell命令完成以下任务 3.2 现有以下关系型数据库中的表和数据,要求将其转换为适合于HBase存储的表并插入数据: 四、问题和解决方法 五、心得体会 一、实验目的…

微服务初步入门

服务拆分原则 单一职责原则 单一职责原则原本是面向对象设计的一个基本原则,是指一个类应该专注于单一的功能,不要存在多于一个导致类变更的原因 在微服务架构中,是指一个微服务只负责一个功能或者业务领域,每个服务应该由清晰的定…

Liunx操作系统笔记5

用户管理命令: useradd命令: useradd命令的功能是创建并设置用户信息。使用useradd命令可以自动完成用户信息、基本组、家目录等的创建工作,并在创建过程中对用户初始信息进行定制。语法格式:useradd 参数 用户名常用参数: -M 不建立用…