### Java基础类型面试题解析
#### 1. 访问修饰符:`public`, `private`, `protected`, 默认(friendly)
- **public**: 公有访问级别,可以在任何地方被访问。
- **protected**: 受保护访问级别,可以在同一包内或者子类中访问。
- **默认(friendly)**: 包级访问级别,只能在同一包内的类中访问。
- **private**: 私有访问级别,只能在当前类内部访问。
#### 2. 匿名内部类 (Anonymous Inner Class) 是否可以继承父类 (extends),是否可以实现接口 (implements)
- 匿名内部类可以实现接口或继承一个抽象类,但不能继承普通类。
- 匿名内部类没有名字,因此不能用extends来指定一个具体类作为其父类,而只能继承抽象类或实现接口。
#### 3. 静态嵌套类 (Static Nested Class) 与 内部类 (Inner Class) 的区别
- **静态嵌套类 (Static Nested Class)**:
- 不需要外部类实例即可创建。
- 拥有自己的静态成员变量和方法。
- 可以直接访问外部类的静态成员,但不能直接访问非静态成员。
- **内部类 (Inner Class)**:
- 必须有外部类实例才能创建。
- 可以直接访问外部类的所有成员,包括私有成员。
- 外部类访问内部类时需要通过外部类实例。
#### 4. `&&` 与 `&` 的区别
- **&&** 表示逻辑与操作,具有短路效果,即如果第一个条件为假,则第二个条件不会被计算。
- **&** 表示位与操作,在布尔表达式中表示逻辑与操作,但不具有短路效果。
#### 5. Collection 与 Collections 的区别
- **Collection** 是一个接口,位于 java.util 包中,它是所有集合类的父接口,如 Set 和 List。
- **Collections** 是一个工具类,提供了一系列静态方法用于操作或返回各种集合类的实例,例如排序、填充等操作。
#### 6. 断言 (assert) 的用途
- 断言是一种简单的调试工具,主要用于开发过程中检查程序的状态是否符合预期。
- 断言通常用于验证程序假设的正确性,当断言失败时,会抛出 AssertionError 异常。
- 断言可以通过命令行参数开启或关闭,一般在生产环境中禁用断言。
#### 7. String 对象的创建
- `Strings = new String("xyz");` 创建了两个字符串对象:一个是字符串池中的 "xyz",另一个是通过 `new` 关键字创建的对象。
- 直接赋值 `String s = "xyz";` 只会创建一个字符串对象,位于字符串常量池中。
#### 8. Math.round 方法的结果
- `Math.round(11.5)` 返回 12。
- `Math.round(-11.5)` 返回 -11。
- `Math.round` 方法对于小数部分为 .5 的情况采用向远离零的方向四舍五入的规则。
#### 9. short 类型的操作
- `short s1 = 1; s1 = s1 + 1;` 此时会报错,因为 `s1 + 1` 的结果会被提升为 int 类型,再赋值给 short 类型时需要显式转换。
- `short s1 = 1; s1 += 1;` 这种写法是正确的,因为编译器会自动进行类型转换。
#### 10. Java 是否支持 goto 语句
- Java 不支持 goto 语句,但保留了该关键字,可能在未来版本中使用。
#### 11. length() 方法的存在性
- Java 中的 String 类提供了 `length()` 方法,用于获取字符串长度。
- 其他基本类型如 int、short 等没有 `length` 属性或方法。
#### 12. 重载 (Overload) 与 重写 (Override) 的区别
- **重载 (Overload)**: 在同一个类中,多个方法具有相同的名字但参数列表不同(包括参数个数、类型或顺序不同),称为方法重载。
- **重写 (Override)**: 子类中的方法覆盖了父类中的方法,即方法名、参数列表及返回类型完全相同,但方法实现不同。
#### 13. Set 集合元素的比较方式
- Set 集合通过 `equals()` 方法来判断两个元素是否相等。
- 如果 Set 集合中的元素实现了 `equals()` 方法,则按照自定义的 `equals()` 方法进行比较;如果没有实现,则使用默认的 `equals()` 方法。
#### 14. RuntimeException 的常见类型
- `RuntimeException` 是一种运行时异常,常见的类型包括:
- `ArithmeticException`: 数学运算异常。
- `ArrayStoreException`: 数组存储异常。
- `ClassCastException`: 类型转换异常。
- `IndexOutOfBoundsException`: 下标越界异常。
- `NullPointerException`: 空指针异常等。
#### 15. Error 与 Exception 的区别
- **Error**: 表示系统无法处理的错误,通常是应用程序无法处理的情况,如内存耗尽。
- **Exception**: 表示应用程序可以捕获并处理的异常情况。
#### 16. List, Set, Map 是否属于 Collection 接口
- `List` 和 `Set` 都实现了 `Collection` 接口,属于 `Collection` 的子接口。
- `Map` 并不属于 `Collection` 接口,它有自己的接口体系。
#### 17. 抽象类 (abstract class) 与 接口 (interface) 的区别
- **抽象类 (abstract class)**: 可以包含抽象方法(无实现的方法)、具体方法以及变量。
- **接口 (interface)**: 只能包含抽象方法(默认为 public abstract)、默认方法(default 修饰的方法)、静态方法(static 修饰的方法)以及常量字段(默认为 public static final)。
- 抽象类可以实现接口,但接口不能继承抽象类。
- 一个类可以继承一个抽象类同时实现多个接口。