根据给定的文件信息,以下是对“java程序员面试题”中的关键知识点进行详细的解析与扩展: ### 1. 访问修饰符 public/private/protected/friendly 的使用 访问修饰符在 Java 中主要用于控制类、方法、变量等成员的可见性。具体来说: - `public`:公共的,对所有类都开放。 - `protected`:受保护的,对于同一包内以及子类是可见的。 - `friendly` 或 `default`(没有明确写任何修饰符):默认的,只对同一包内的类可见。 - `private`:私有的,仅对当前类内部可见。 #### 示例 ```java // 同一包内的访问 package com.example; public class MyClass { private int myPrivateField; protected int myProtectedField; int myDefaultField; // 默认访问级别 public int myPublicField; } public class AnotherClass { void accessFields(MyClass obj) { // 可以访问 obj.myPublicField = 1; obj.myProtectedField = 2; obj.myDefaultField = 3; // 不能访问 // obj.myPrivateField = 4; } } ``` ### 2. 匿名内部类是否可以继承其他类或实现接口 匿名内部类(Anonymous Inner Class)可以继承其他类或实现一个或多个接口。匿名内部类是一种特殊的内部类,没有名称但可以在声明时直接实例化。 #### 示例 ```java interface MyInterface { void myMethod(); } class MyAnonymousInnerClass extends Object implements MyInterface { public void myMethod() { System.out.println("匿名内部类实现了接口"); } } public class Test { public static void main(String[] args) { MyInterface instance = new MyAnonymousInnerClass(); instance.myMethod(); // 输出 "匿名内部类实现了接口" } } ``` ### 3. 静态嵌套类与非静态内部类的区别 - **静态嵌套类**(Static Nested Class):可以通过外部类名直接访问,不依赖于外部类的实例。 - **非静态内部类**(Non-static Inner Class):需要通过外部类的实例来访问,可以直接访问外部类的所有成员。 #### 示例 ```java public class OuterClass { private int outerField = 10; static class StaticNestedClass { void display() { System.out.println("静态嵌套类"); } } class NonStaticInnerClass { void display() { System.out.println("非静态内部类, 外部类字段: " + outerField); } } } public class Test { public static void main(String[] args) { OuterClass.StaticNestedClass staticNested = new OuterClass.StaticNestedClass(); staticNested.display(); OuterClass outer = new OuterClass(); OuterClass.NonStaticInnerClass inner = outer.new NonStaticInnerClass(); inner.display(); } } ``` ### 4. && 和 & 的区别 `&&` 是逻辑与运算符,当左侧表达式为 false 时,右侧表达式将不会被计算;而 `&` 除了作为逻辑与运算符外,在位操作中表示按位与。 ### 5. Collection 和 Collections 的区别 - `Collection`:这是一个接口,定义了集合的基本操作。 - `Collections`:这是一个工具类,提供了对集合进行操作的各种静态方法。 ### 6. assert 断言的使用 `assert` 是 Java 提供的一种断言机制,用于在开发过程中检查假设条件是否成立。如果断言失败,会抛出 AssertionError 异常。 #### 示例 ```java public class Test { public static void main(String[] args) { boolean condition = false; assert condition : "断言失败"; // 如果 condition 为 false,则抛出 AssertionError,并显示错误信息 } } ``` ### 7. String 对象的创建 字符串常量池(String constant pool)是 String 类的一个特性,用于存储字符串字面量。创建 String 对象有两种方式:使用字符串字面量和使用 new 关键字。 #### 示例 ```java String s1 = "xyz"; // 字符串字面量,存放在常量池 String s2 = new String("xyz"); // 使用 new 关键字,存放在堆中 ``` ### 8. Math.round 方法的结果 `Math.round()` 方法用于四舍五入,规则是如果小数部分大于等于 0.5,则向上取整;小于 0.5,则向下取整。 #### 示例 ```java System.out.println(Math.round(11.5)); // 输出 12 System.out.println(Math.round(-11.5)); // 输出 -11 ``` ### 9. short 类型自增运算 对于 `short` 类型的自增运算,如果使用 `s1 = s1 + 1`,则需要类型转换;而使用 `s1 += 1` 则不需要显式类型转换。 #### 示例 ```java short s1 = 1; s1 = (short)(s1 + 1); // 需要类型转换 s1 += 1; // 不需要类型转换 ``` ### 10. Java 是否支持 goto Java 语言不支持 `goto` 关键字,但在某些情况下,可以通过使用标签化的 break 或 continue 来模拟类似的功能。 ### 11. length() 方法 Java 中,数组具有 `length` 属性,而字符串类 `String` 没有 `length()` 方法,而是提供了一个 `length` 属性来获取字符串长度。 #### 示例 ```java int[] arr = {1, 2, 3}; String str = "hello"; System.out.println(arr.length); // 输出 3 System.out.println(str.length()); // 输出 5 ``` ### 12. Overload 和 Override 的区别 - **重载(Overloading)**:同一个类中方法名相同但参数列表不同的多个方法。 - **覆盖(Overriding)**:子类中重新定义父类的方法,要求方法名、参数列表和返回类型完全一致。 ### 13. Set 集合元素的比较 在 `Set` 集合中添加元素时,默认情况下使用 `equals()` 方法来判断两个对象是否相等。如果需要自定义比较规则,可以通过覆写 `equals()` 方法实现。 ### 14. 运行时异常(RuntimeException) 运行时异常是 Java 应用程序在运行时发生的异常,通常由编程错误导致,例如数组越界、空指针异常等。这些异常在编译时不被检测,只有在运行时才会抛出。 #### 常见的运行时异常包括: - `ArithmeticException`:算术运算异常。 - `ArrayStoreException`:向数组中存储不兼容类型的数据。 - `ClassCastException`:试图将对象强制转换为不兼容类型。 - `NullPointerException`:尝试访问空对象的属性或方法。 - `IndexOutOfBoundsException`:索引超出数组边界。 以上知识点涵盖了 Java 程序员面试中常见的核心概念和技术要点,希望对准备面试的开发者有所帮助。
- 粉丝: 1
- 资源: 15
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助