【java】oop 结课模拟题版
持续更新~
文章目录
- 模拟题
- 名词解释
- 封装
- 多态
- 继承
- 接口
- JVM、JRE、JDK
- 字节码 Bytecode
- 方法重载和方法覆盖(重写)
- 方法签名
- Unicode
- this
- super
- 构造方法
- 异常与异常处理
- 简答题
- 简述Java的执行模型与传统编译模型
- 简述Java中`final`关键字的作用
- 说明`String`、`StringBuilder`和`StringBuffer`的区别
- 什么是跨层多态?请举例说明
- Java 虚拟机(JVM)是什么,它有什么作用?
- 程序和组件之间的区别是什么?
- 接口和类的区别
- 接口和抽象类的相似点与不同点
- 请从定义 初始化 使用方面区分类成员与实例成员
- 易错点整理
模拟题
名词解释
封装
封装是将对象的属性和方法绑定在一起,并对外隐藏内部实现细节,仅暴露必要的访问接口(getter
/setter
),保护数据安全。
例如:
class Person {private String name; // 私有属性public void setName(String name) { this.name = name; } // 公共接口
}
多态
多态指同一方法在不同对象中有不同实现,分为编译时多态(方法重载)和运行时多态(方法重写)。
例如:
class Animal { public void sound() { System.out.println("Animal sound"); } }
class Dog extends Animal { void sound() { System.out.println("Bark"); } }
Animal a = new Dog(); // 运行时绑定
a.sound(); // 输出"Bark"
继承
一个类继承另一个类的属性和方法,并可以扩展或修改其行为。
class Animal { public void eat() { System.out.println("eat"); }}
class Dog extends Animal {public void eat() { super.eat(); // 调用父类方法System.out.println("gnaw a bone");}
}
接口
接口用于定义一组方法规范而不提供具体实现,实现该接口的类需实现所有方法(默认方法除外)。
例如:
interface Animal { void makeSound(); }
class Dog implements Animal { public void makeSound() { System.out.println("Woof"); } }
JVM、JRE、JDK
- JVM(Java Virtual Machine,java虚拟机):是Java平台的核心运行引擎,负责执行Java字节码。
- JRE(Java Runtime Environment,Java运行环境):包含运行Java程序所需的所有组件。由JVM、核心类库(Java SE API)和其他支持文件组成。
- JDK (Java Development Kit,Java开发工具包):包含开发Java程序所需的所有工具,由JRE和各种开发工具(javac(Java编译器)、java(启动工具)、javadoc(文档生成工具)、jdb(调试器))组成
字节码 Bytecode
字节码是 Java 编译器将 Java 源代码编译后生成的一种中间代码。它是一种与平台无关的二进制代码,可以在任何安装了 JVM 的设备上运行。字节码是 Java 跨平台特性的关键,它使得 Java 程序可以在不同的操作系统和硬件平台上执行。
方法重载和方法覆盖(重写)
- 方法重载(Overload):在同一个类中,定义多个同名方法,但它们的参数列表不同。
- 方法覆盖(Override):子类重新定义父类中同名、同参数、同返回值的方法。
方法签名
由方法名和参数列表组成。是 Java 中用于唯一标识一个方法的组成部分。
- 注意区别于方法声明:方法签名 + 返回值 + 访问修饰符 + 异常
Unicode
是一种国际字符编码标准,Java中的char类型采用的是unicode编码。
this
this 是 Java 中的一个引用变量,指向当前对象的实例。
super
super 用于访问父类的成员(属性、方法、构造方法)。
构造方法
构造方法(Constructor)是一种特殊的方法,用于在创建对象时初始化对象的属性,在 new 对象时自动调用。
异常与异常处理
- 异常(Exception):程序在运行过程中发生的非正常情况,它会中断程序的正常执行流程。
- 受检异常(Checked Exception):必须显式处理(try-catch 或 throws),如 IOException、SQLException
- 非受检异常(Unchecked Exception):不强制处理,通常是程序逻辑错误,如 NullPointerException、ArrayIndexOutOfBoundsException
Throwable(可抛出的)
├── Error(错误,严重问题,通常不可恢复)
│ ├── OutOfMemoryError
│ ├── StackOverflowError
│ └── ...
└── Exception(异常,可捕获处理)├── RuntimeException(运行时异常,非受检异常)│ ├── NullPointerException│ ├── IndexOutOfBoundsException│ └── ...└── 受检异常(Checked Exception)├── IOException├── SQLException└── ...
- 异常处理:通过特定语法结构捕获并处理异常,使程序在出错后仍能继续执行或优雅退出。
try-catch-finally
try
:监控可能抛出异常的代码catch
:捕获并处理异常finally
:无论是否发生异常都会执行(常用于释放资源)
throws
用于在方法声明中指定可能会抛出的异常。当一个方法可能会抛出非运行时异常时,它必须在方法头部使用throws
关键字声明这些异常。这告诉调用者该方法可能引发指定类型的异常。调用该方法的代码必须要么处理这些异常,要么将它们继续抛给上层调用者。throw
用于在程序中显式引发异常。当程序检测到某种问题时,可以使用throw关键字来创建并抛出一个异常对象。这个异常对象必须是Throwable
的子类(通常是Exception
的子类),并且它会被传递给调用栈,直到找到相应的异常处理代码。
例如:
try {int result = 10 / 0; // 抛出ArithmeticException } catch (ArithmeticException e) {System.out.println("除零错误"); } finally {System.out.println("清理资源"); }
简答题
简述Java的执行模型与传统编译模型
编译型语言的执行模型是将源代码编译成主机机器可理解的指令,主机机器执行这个二进制文件。而 Java 的执行模型是将源代码编译成 JVM 可理解的指令即字节码,然后由 JVM 解释执行。
- 传统编译模型
源代码 → 编译器 → 机器码 → 操作系统执行 - Java执行模型
源代码 → Java编译器 → 字节码 → JVM解释执行
简述Java中final
关键字的作用
- 修饰类:类不可继承(如
final class A {}
)。 - 修饰方法:方法不可被重写(如
public final void show() {}
)。 - 修饰变量:变量值不可变(常量,如
final int MAX = 100;
)。
说明String
、StringBuilder
和StringBuffer
的区别
String
:不可变,线程安全,适合少量拼接。StringBuilder
:可变,非线程安全,效率高,适合单线程频繁拼接。StringBuffer
:可变,线程安全,适合多线程环境。
什么是跨层多态?请举例说明
跨层多态指通过接口实现不同层级类的统一调用。例如:
interface Shape { void draw(); }
class Circle implements Shape { public void draw() { System.out.println("Circle"); } }
class Square implements Shape { public void draw() { System.out.println("Square"); } }
Shape s = new Circle(); // 跨层调用
s.draw(); // 输出"Circle"
Java 虚拟机(JVM)是什么,它有什么作用?
JVM 是 Java 虚拟机,它是一种抽象的计算设备。其主要作用是将 Java 编译后的字节码转换为特定计算机硬件和操作系统可以执行的机器码。JVM 为 Java 程序提供了一个独立于平台的运行环境,使得 Java 程序可以在不同的操作系统和硬件平台上运行,而无需重新编译。
程序和组件之间的区别是什么?
程序是一个完整的、可以独立运行的软件单元,如 Java 应用程序和小程序。而组件是程序的一部分,是用于构建程序的可重用单元,如 Servlet、JSP、JavaBeans 和 EJB。程序通常是为最终用户直接使用的软件,而组件则是开发者用来构建软件的构建块。
接口和类的区别
- 定义和功能:
- 类 :类是对象的模板,用于创建具有相同结构和行为的对象。它可以包含字段(属性)、方法(行为)以及构造函数等。类可以实例化对象,这些对象拥有类定义的属性和行为。
- 接口 :接口是一种特殊的抽象类型,它只包含方法声明(在 Java 8 之前是抽象方法,在 Java 8 及以后可以包含默认方法和静态方法)、常量和类类型声明等。接口定义了一组操作规范,实现了接口的类必须按照接口声明的方法名、参数列表和返回值类型来实现这些方法。
- 实现方式:
- 类 :类通过继承关键字
extends
来继承另一个类,并且可以实现多个接口,使用implements
关键字。子类可以继承父类的属性和方法,并且可以重写或扩展它们。 - 接口 :接口通过
extends
关键字继承其他接口。一个类实现接口时,需要实现接口中声明的所有抽象方法,否则该类必须声明为抽象类。
- 类 :类通过继承关键字
- 实例化:
- 类 :普通类(非抽象类)可以被实例化,创建出具体的对象。
- 接口 :接口不能被实例化,只能通过实现接口的类来创建对象。
接口和抽象类的相似点与不同点
- 相似点:
- 都可以包含抽象方法,用于定义规范,实现类必须按照这些规范实现方法。
- 都可以包含常量,并且这些常量默认是
public static final
的。 - 都支持继承,接口可以继承接口,类可以继承类并实现接口。
- 不同点:
- 方法实现 :接口在 Java 8 之前只能包含抽象方法,不能包含具体实现(构造函数、普通方法等),而抽象类可以包含抽象方法和具体方法(包括构造函数)。从 Java 8 开始,接口可以包含默认方法和静态方法,但它们有具体的实现。
- 成员变量 :接口中的成员变量默认是
public static final
的常量,不能被修改。而抽象类中的成员变量可以是普通的变量,也可以是常量,它们可以有各种访问修饰符。 - 构造函数 :抽象类可以有构造函数,用于初始化操作。接口不能有构造函数。
- 继承 :类只能继承一个抽象类,但可以实现多个接口。接口可以继承多个接口。
请从定义 初始化 使用方面区分类成员与实例成员
对比维度 | 类成员(静态成员) | 实例成员(非静态成员) |
---|---|---|
定义 | 使用 static 修饰,属于类本身 | 无 static 修饰,属于类的实例(对象) |
初始化 | 类加载时自动初始化(仅一次) | 创建对象时初始化(每个对象独立) |
使用 | 通过 类名.成员名 直接访问(推荐)所有对象共享同一份数据 | 必须通过 对象名.成员名 访问每个对象拥有独立副本 |
核心区别:
- 类成员:与类绑定,全局共享,生命周期=类生命周期
- 实例成员:与对象绑定,对象私有,生命周期=对象生命周期
易错点整理
-
java为单继承,不支持多继承
-
标识符
- 可以有
_
$
- 除了数字不能做首字母其他都可以
- 可以有
-
String
- 不可修改
- String 不是java中的关键字(reserved keywords)。它是 Java 中的一个类,属于 java .lang。从本质上讲,它是一个类的名称,而不是用于控制程序流程或者定义程序结构的关键字。
-
static
- static成员属于类本身,生命周期与类一致,而非任何实例,所有实例共享同一份静态成员。
- static成员推荐直接通过类名访问;也可以通过实例对象访问(语法允许但不推荐,易混淆)。
- static方法只能直接访问其他静态成员,不可以直接访问实例变量。无法使用 this 或 super。
- static方法不能被重写(Override),但子类可以定义同名静态方法(隐藏父类方法)。调用哪个方法取决于引用类型而非实际类型。
- static代码块在类加载时仅执行一次。在类首次被加载时初始化(如首次创建对象、首次调用静态方法、首次访问静态变量等)。
-
final
- final 类不可继承。
- final 类中的成员不受 final 限制
- final 类可以正常实例化
- final 方法不可被重写
- final 实例不可变
-
继承
- 子类继承父类的所有成员(包括private成员),但无法直接访问private成员。
- 若需让子类使用父类的私有成员,应在父类中提供非private的访问方法(如公有或受保护方法)
-
接口
- java8之前, 接口只能包含抽象方法;java8之后还可以定义默认方法和静态方法,但都要有具体实现
- 实现接口的类不一定要实现接口的所有方法,但是必须实现接口的所有抽象方法。可以选择重写默认方法。
- 接口的静态方法仅属于接口,实现类无法通过继承获取该方法,因此无法覆盖或隐藏。
-
抛异常
- Error和Exception同为Throwable的子类,无继承关系。
- try 后 不一定要紧跟 catch,try 后必须有 catch 或 finally 其一
- finally 可有可无
-
内存
- String 常量池位于堆中