“数据类型与OOP核心”的一些问题
问:Java 中有哪些基本数据类型?
答:Java 提供了 8 种基本数据类型,分为四类:
- 整数类型:
byte
(1 字节,范围:-128 到 127)、short
(2 字节,范围:-32,768 到 32,767)、int
(4 字节,范围:-2^31 到 2^31-1)、long
(8 字节,范围:-2^63 到 2^63-1)。 - 浮点类型:
float
(4 字节,单精度,约 6~7 位有效数字)、double
(8 字节,双精度,约 15 位有效数字)。 - 字符类型:
char
(2 字节,采用 Unicode 编码,范围:‘\u0000’ 到 ‘\uffff’)。 - 布尔类型:
boolean
(理论上占用 1 位,实际存储可能为 1 字节,取值为true
或false
)。
这些基本数据类型在内存中的大小和默认值是面试中常考的基础知识。
问:基本类型与包装类型的区别是什么?
答:基本类型是 Java 的内置类型,存储在栈内存中,效率较高。包装类型是基本类型的对象表示,存储在堆内存中,提供了更多的方法和功能。
例如,int
对应的包装类型是 Integer
,char
对应的是 Character
。包装类型允许在集合中使用基本类型的值,并提供了如 null
值的支持。
问:自动装箱与拆箱的原理是什么?
答:自动装箱是指 Java 编译器自动将基本类型转换为对应的包装类型,自动拆箱则是将包装类型转换为基本类型。
例如:
Integer a = 5; // 自动装箱
int b = a; // 自动拆箱
需要注意的是,频繁的装箱和拆箱可能会影响性能,尤其是在循环或大量数据处理时。
问:为什么浮点数运算可能会有精度丢失?
答:浮点数在计算机中采用二进制表示,某些十进制小数无法精确表示,导致精度丢失。
例如,0.1 在二进制中是一个无限循环小数,无法精确表示。
因此,在涉及精确计算(如财务计算)时,建议使用 BigDecimal
类。
问:String
是基本数据类型吗?为什么?
答:String
不是基本数据类型,而是一个引用类型的类。
它是 Java 中非常常用的类,具有不可变性(immutable),即一旦创建,其值不能更改。这种设计有助于提高性能和安全性,特别是在多线程环境下。
问:面向对象的三大特征是什么?
答:面向对象编程的三大特征是封装、继承和多态。
- 封装(Encapsulation):将数据和操作数据的方法封装在一起,隐藏内部实现细节,只暴露必要的接口。
- 继承(Inheritance):子类可以继承父类的属性和方法,实现代码重用。
- 多态(Polymorphism):同一个方法在不同对象上表现出不同的行为,主要通过方法重载和方法重写实现。
这些特性是面向对象编程的核心,有助于提高代码的可维护性和扩展性。
问:抽象类和接口的区别是什么?
答:抽象类和接口都是用于定义类的规范,但有以下区别:
- 抽象类:
- 可以包含成员变量、构造方法和非抽象方法。
- 使用
abstract
关键字定义。 - 适用于具有共性的类。
- 接口:
- 只能包含常量和抽象方法(Java 8 以后可以包含默认方法和静态方法)。
- 使用
interface
关键字定义。 - 适用于定义行为规范。
选择使用抽象类还是接口,取决于具体需求。
问:方法重载(Overload)与方法重写(Override)的区别是什么?
答:方法重载和方法重写都是实现多态的方式,但有以下区别:
- 方法重载:
- 发生在同一个类中。
- 方法名相同,参数列表不同。
- 与返回类型无关。
- 方法重写:
- 发生在子类与父类之间。
- 方法名、参数列表和返回类型必须相同。
- 访问修饰符不能比父类更严格。
理解这两个概念有助于掌握多态性。
问:Java 中的访问修饰符有哪些?各自的访问范围是什么?
答:Java 中的访问修饰符有四种:
- private:仅在同一个类中可见。
- default(无修饰符):在同一个包中可见。
- protected:在同一个包中以及子类中可见。
- public:在所有地方可见。
合理使用访问修饰符有助于实现封装性。
问:Java 中的多态是如何实现的?
答:Java 的多态主要通过方法重写和接口实现来实现。
当父类引用指向子类对象时,调用的方法是子类中重写的方法,而不是父类的方法。这使得程序具有更好的扩展性和可维护性。