### Java面试题详解 #### 1. Java中的访问修饰符:`public`, `private`, `protected`, 以及未指定的情况 在Java中,类成员(包括变量、方法、构造器等)的可见性是由访问控制符来决定的,主要包括`public`、`private`、`protected`以及默认(即不指定任何访问控制符)。这些修饰符定义了如何从其他类中访问这些成员。 - **`public`**:最开放的访问级别,无论是在同一包内还是在不同包内,无论是子类还是非子类,都可以访问。 - **`protected`**:允许在同一个包内的类访问,以及不同包下的子类访问,但不允许不同包下非子类访问。 - **`friendly`**(或称作`default`):默认情况下,如果没有显式声明访问控制符,则默认为`friendly`。这意味着只能在同一包内的类中访问,无法跨包访问。 - **`private`**:只允许在声明该成员的类中访问,即使是子类也无法访问。 #### 2. 匿名内部类是否可以继承其他类以及实现接口 **匿名内部类**是一种特殊的内部类,没有名称且通常用于即时定义并实例化一个类。这种类型的内部类不能继承自其他类,但可以直接实现一个或多个接口。这是因为匿名内部类实际上是通过扩展特定的类或实现特定的接口来定义的,其具体实现方式是在定义时指定父类或接口,例如: ```java new Thread(new Runnable() { public void run() { // 实现Runnable接口的run方法 } }); ``` #### 3. 静态嵌套类与非静态内部类的区别 - **静态嵌套类(Static Nested Class)**:也称为静态内部类,它的创建并不依赖于外部类实例的存在。这意味着即使没有外部类的实例,也可以创建静态嵌套类的实例。此外,静态嵌套类中不能直接访问外部类的非静态成员。 - **非静态内部类(Non-static Inner Class)**:必须依赖于外部类的实例才能创建。非静态内部类可以直接访问外部类的所有成员,包括私有成员。 #### 4. 逻辑运算符 `&` 与 `&&` 的区别 - **`&`**:位运算符,用于进行按位与操作,同时还可以作为逻辑与运算符,但不会进行短路操作。即如果左侧的操作数为`false`,则右侧的操作数仍然会被计算。 - **`&&`**:逻辑运算符,用于逻辑与操作,并且支持短路操作。这意味着如果左侧的操作数为`false`,则右侧的操作数不会被计算。 #### 5. `Collection` 接口与 `Collections` 类的区别 - **`Collection`**:是一个接口,代表一组对象的集合。它是所有集合类的根接口,如`Set`和`List`都继承自`Collection`。 - **`Collections`**:是一个工具类,提供了大量的静态方法来操作`Collection`的实例,比如排序、查找、填充等。 #### 6. `assert`关键字的使用场景 `assert`关键字用于声明断言,在开发阶段用于检查程序的基本假设是否成立。使用`assert`的关键字格式如下: ```java assert <boolean expression>; ``` 当表达式的值为`false`时,会抛出`AssertionError`异常。默认情况下,编译器会忽略`assert`语句。要在运行时启用断言,可以通过`-ea`或`-enableassertions`命令行参数来开启。`assert`主要用于测试和调试目的,确保代码的正确性。 #### 7. String实例化 ```java String s = new String("xyz"); ``` 这里创建了一个新的`String`对象,而不是直接引用字符串池中的对象。因此,这种方式可能会导致内存浪费。 #### 8. `Math.round()`函数的行为 - `Math.round(11.5)`返回`12` - `Math.round(-11.5)`返回`-11` `Math.round()`函数对小数点后第一位为5的数值采取向“距离最近”的整数四舍五入的方式。如果距离相等,则向远离零的方向舍入。 #### 9. `short`类型变量的自动类型提升 ```java short s1 = 1; s1 = s1 + 1; // 编译错误 s1 += 1; // 正确 ``` 在第一种情况中,`s1 + 1`的结果是一个`int`类型,因为`short`与`int`的加法会导致类型提升到`int`。而第二种情况中,由于使用了复合赋值运算符`+=`,编译器会自动处理类型转换问题。 #### 10. `goto`语句 Java语言中没有提供`goto`语句,因为它被认为是一种不好的编程习惯,容易导致代码难以理解和维护。尽管如此,Java提供了一些替代方案,如循环控制语句`break`和`continue`。 #### 11. 数组与字符串的长度获取 数组的长度可以通过`.length`属性获取,而字符串的长度则通过`.length()`方法获取。 #### 12. 方法重载(Overloading)与方法重写(Overriding) - **重载(Overloading)**:在一个类中定义两个或多个同名的方法,它们具有不同的参数列表。这是为了提供多种方法实现相同的功能,但根据不同的输入参数选择合适的方法。 - **重写(Overriding)**:子类重写父类的方法,通常是为了改变父类行为或者提供更具体的实现。 #### 13. `Set`中的元素比较 在`Set`集合中,元素的唯一性是由`equals()`方法和`hashCode()`方法共同决定的。如果两个对象的`equals()`方法返回`true`并且它们的`hashCode()`方法返回相同的值,则认为这两个对象是相等的,因此`Set`集合中只会存储其中一个。 #### 14. 运行时异常(`RuntimeException`) `RuntimeException`及其子类是一组在运行时抛出的异常,通常是因为程序中的错误引起的,而非外部因素导致的。常见的`RuntimeException`子类包括`ArithmeticException`、`ArrayStoreException`、`BufferOverflowException`等。 #### 15. 错误(`Error`)与异常(`Exception`) - **`Error`**:表示严重的问题,通常是JVM本身的问题或者资源耗尽的问题,这些问题在正常情况下不应该由程序去处理。 - **`Exception`**:表示程序运行过程中发生的异常状况,可以通过捕获异常来处理。 #### 16. `List`、`Set`、`Map`与`Collection`的关系 `List`和`Set`都是`Collection`接口的子接口,而`Map`与`Collection`是完全不同的接口,它用来表示键值对的集合。 #### 17. 抽象类与接口的区别 - **抽象类(Abstract Class)**:是一种不能实例化的类,可以包含抽象方法和具体方法。抽象类可以作为其他类的基础模板,子类必须实现抽象类中的所有抽象方法。 - **接口(Interface)**:一种特殊的抽象类,其中的所有方法都是抽象的。接口可以被多个类实现,用于定义这些类共有的行为。在Java 8及以后版本中,接口可以包含默认方法和静态方法。
- 粉丝: 0
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助