### Java面试宝典知识点解析 #### 一、Java基础部分 **1. 一个 ".java" 源文件中是否可以包括多个类(不是内部类)?有什么限制?** 在一个 `.java` 文件中,确实可以定义多个类,但是其中只能有一个公共类(public class),并且该公共类的名称必须与文件名相同。其他类(非公共类)可以在同一个文件中定义,这些类通常用于支持主类的功能或用于组织相关的辅助类。 **2. Java有没有goto?** Java 语言最初设计时包含了 `goto` 语句,但在最终版本中移除了它。因此,标准的 Java 语言不支持 `goto` 关键字。尽管如此,Java 中可以通过标记化的 `break` 和 `continue` 来模拟 `goto` 的功能。 **3. 说说 & 和 && 的区别。** `&` 和 `&&` 都可以用于布尔表达式的逻辑与运算,但它们的行为略有不同: - **&**:逻辑与运算符,如果两边的操作数都是非零,则结果为 1;否则为 0。 - **&&**:条件与运算符,用于短路逻辑运算。只有当左边的表达式为真时,右边的表达式才会被计算。 **4. 在 JAVA 中如何跳出当前的多重嵌套循环?** 跳出多重嵌套循环的一种方法是使用 `break` 语句配合标签来实现。例如,可以在最外层循环前加上一个标签,然后在内层循环中使用 `break` 语句加上该标签,从而直接跳出到最外层循环之外。 **5. switch 语句能否作用在 byte 上,能否作用在 long 上,能否作用在 String 上?** - **byte**:可以,因为 `byte` 类型可以自动提升为 `int` 类型。 - **long**:不可以,因为 `switch` 只接受 `byte`, `short`, `char`, `int` 或者它们的包装类以及 `String` 类型。 - **String**:可以,从 Java 7 开始,`switch` 支持 `String` 类型。 **6. shorts1=1; s1=s1+1; 有什么错? short s1=1; s1+=1; 有什么错?** - **short s1=1; s1=s1+1;**:编译错误,因为在进行 `s1 + 1` 运算时,`short` 类型会自动提升为 `int` 类型,而 `short` 类型不能直接赋值 `int` 类型的结果。 - **short s1=1; s1+=1;**:没有错误,`+=` 运算符会自动将结果转换回 `short` 类型。 **7. char 型变量中能不能存贮一个中文汉字?为什么?** 可以。Java 中的 `char` 类型采用的是 Unicode 编码,每个 `char` 占用 16 位(2 字节),足以存储一个中文字符。 **8. 用最有效率的方法算出 2 乘以 8 等于几?** 使用位运算:`2 << 3`。左移一位相当于乘以 2,所以左移三位就是乘以 8。 **9. 请设计一个一百亿的计算器** 由于 `int` 类型的最大值远小于一百亿,因此应使用 `long` 类型。例如,可以使用 `BigInteger` 类来进行大整数运算。 **10. 使用 final 关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?** - **引用不能变**:对于引用类型,`final` 修饰的变量其引用地址不能变,即不能重新指向另一个对象。 - **对象不能变**:对于基本类型,`final` 修饰的变量其值不能变。 **11. "==" 和 equals 方法究竟有什么区别?** - **"=="**:比较两个对象的引用是否相等。 - **equals 方法**:比较两个对象的内容是否相等,通常用于自定义类中覆盖默认的 `equals` 方法。 **12. 静态变量和实例变量的区别?** - **静态变量**:属于类级别,所有对象共享一份。 - **实例变量**:属于对象级别,每个对象拥有独立的一份。 **13. 是否可以从一个 static 方法内部发出对非 static 方法的调用?** 不可以,因为非静态方法需要通过对象来访问,而静态方法是在类加载时就存在的,无需对象实例化。 **14. Integer 与 int 的区别** - **int**:基本数据类型。 - **Integer**:`int` 的包装类,提供了一些与 `int` 相关的实用方法。 **15. Math.round(11.5) 等于多少? Math.round(-11.5) 等于多少?** - `Math.round(11.5)` 结果为 12。 - `Math.round(-11.5)` 结果为 -11。 **16. 下面的代码有什么不妥之处?** 问题中未给出具体的代码示例,无法具体分析。 **17. 请说出作用域 public,private,protected,以及不写时的区别** - **public**:全局可见,任何类都可以访问。 - **private**:仅当前类可见。 - **protected**:当前类及子类可见,同一包内的其他类也可以访问。 - **不写**:默认(包私有):同一包内的其他类可以访问。 **18. Overload 和 Override 的区别。Overloaded 的方法是否可以改变返回值的类型?** - **Overload**:方法重载,允许在同一类中定义多个同名方法,但参数列表不同。 - **Override**:方法重写,发生在父类与子类之间,要求方法签名完全相同。 - **Overloaded 的方法是否可以改变返回值的类型**:可以,只要参数列表不同即可。 **19. 构造器 Constructor 是否可被 override?** 构造器不能被重写(override),但可以被隐藏(overload)。 **20. 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的 main 方法?** - **接口是否可继承接口**:可以,一个接口可以继承多个其他接口。 - **抽象类是否可实现(implements)接口**:可以。 - **抽象类是否可继承具体类**:不可以,抽象类只能继承抽象类或接口。 - **抽象类中是否可以有静态的 main 方法**:可以,静态方法不受抽象类的影响。 **21. 写 clone() 方法时,通常都有一行代码,是什么?** 通常会有一行代码 `this.clone()`,但这取决于具体的实现。标准的 `clone()` 方法通常包含一行 `return super.clone();`。 **22. 面向对象的特征有哪些方面** 面向对象编程的四大特征是封装、继承、多态和抽象。 - **封装**:将数据和操作数据的方法绑定在一起,隐藏对象的属性和实现细节。 - **继承**:允许创建现有类的子类,继承父类的特性。 - **多态**:允许子类对象代替父类对象,并且能够根据实际对象的类型选择合适的方法执行。 - **抽象**:定义一个类或方法的框架,但不提供具体的实现。 **23. java 中实现多态的机制是什么?** Java 实现多态主要依赖于方法的重写(override)和接口的实现。通过子类重写父类的方法或实现接口中的方法,可以在运行时根据对象的实际类型选择合适的方法执行。 **24. abstract class 和 interface 有什么区别?** - **abstract class**:可以有抽象方法和具体方法;可以包含字段;可以被继承。 - **interface**:只能包含抽象方法(Java 8 后可包含默认方法和静态方法);不能有字段(只能有常量);可以被多个类实现。 **25. abstract 的 method 是否可同时是 static, 是否可同时是 native,是否可同时是 synchronized?** - **abstract method** 和 **static**:不可以,因为抽象方法需要被子类实现,而静态方法是类级别的。 - **abstract method** 和 **native**:不可以,`native` 方法表示由本地代码实现的方法。 - **abstract method** 和 **synchronized**:不可以,`synchronized` 方法用于同步控制,而抽象方法不能直接被调用。 **26. 什么是内部类?Static Nested Class 和 Inner Class 的不同。** - **内部类**:定义在一个类内部的类。 - **Static Nested Class**:静态嵌套类,它是一个外部类的静态成员,不依赖于外部类的实例。 - **Inner Class**:非静态内部类,它依赖于外部类的实例,可以访问外部类的私有成员。 **27. 内部类可以引用它的包含类的成员吗?有没有什么限制?** 内部类可以引用其包含类的成员,包括私有成员。但是,内部类只能在其包含类的对象存在的情况下才能创建实例。 **28. Anonymous Inner Class (匿名内部类) 是否可以 extends (继承) 其它类,是否可以 implements (实现) interface (接口)?** - **extends**:不可以,匿名内部类只能继承一个类。 - **implements**:可以,匿名内部类可以实现一个或多个接口。 **29. super.getClass() 方法调用** `super.getClass()` 用来获取当前对象的直接父类的 `Class` 对象。 **30. String 是最基本的数据类型吗?** 不是,`String` 是一个类,不属于基本数据类型。 **31. Strings="Hello"; s=s+"world!"; 这两行代码执行后,原始的 String 对象中的内容到底变了没有?** 原始的 `String` 对象内容没有变,因为 `String` 是不可变的。每次对 `String` 进行修改都会创建一个新的 `String` 对象。 **32. 是否可以继承 String 类?** 不可以,`String` 类是 final 的,不能被继承。 **33. Strings=new String("xyz"); 创建了几个 String Object? 二者之间有什么区别?** - `String s = new String("xyz");` 创建了两个 `String` 对象:一个在字符串常量池中,另一个是通过 `new` 关键字创建的对象。 - `String s = "xyz";` 只创建了一个 `String` 对象,位于字符串常量池中。 **34. String 和 StringBuffer 的区别** - **String**:不可变,每次修改都会创建新的对象。 - **StringBuffer**:可变,适用于需要频繁修改字符串内容的场景。 **35. 如何把一段逗号分割的字符串转换成一个数组?** 可以使用 `split()` 方法,例如 `"a,b,c,d".split(",")`。 **36. 数组有没有 length() 这个方法? String 有没有 length() 这个方法?** - **数组**:没有 `length()` 方法,但有一个 `length` 属性表示长度。 - **String**:有 `length()` 方法,用于获取字符串的长度。 **37. 下面这条语句一共创建了多少个对象:Strings="a"+"b"+"c"+"d";** 该语句创建了四个 `String` 对象:一个在字符串常量池中(拼接后的 "abcd"),另外三个是拼接过程中产生的临时对象。 **38. try{} 里有一个 return 语句,那么紧跟在这个 try 后的 finally {} 里的 code 会不会被执行,什么时候被执行,在 return 前还是后?** `finally` 块中的代码总是会被执行,即使 `try` 块中有 `return` 语句。执行顺序是先执行 `finally` 块,再执行 `return` 语句。 **39. 下面的程序代码输出的结果是多少?** 问题中未给出具体的代码示例,无法具体分析。 **40. final, finally, finalize 的区别。** - **final**:用于声明常量、不可变类、方法等。 - **finally**:确保无论是否发生异常,指定的代码块都会被执行。 - **finalize**:对象被垃圾回收器回收之前调用的方法,已废弃。 **41. 运行时异常与一般异常有何异同?** - **运行时异常**:通常是程序错误,如 `NullPointerException`。 - **一般异常**:程序可以恢复的异常,如 `IOException`。 **42. error 和 exception 有什么区别?** - **Error**:严重错误,通常指程序无法处理的情况。 - **Exception**:可以被捕获并处理的异常。 **43. Java 中的异常处理机制的简单原理和应用。** Java 异常处理机制基于 `try-catch-finally` 结构,允许程序员捕获并处理运行时错误。 **44. 请写出你最常见到的 5 个 runtimeexception。** - `NullPointerException` - `IndexOutOfBoundsException` - `ArithmeticException` - `IllegalArgumentException` - `ArrayStoreException` **45. JAVA 语言如何进行异常处理,关键字:throws, throw, try, catch, finally 分别代表什么意义?在 try 块中可以抛出异常吗?** - **throws**:声明方法可能抛出的异常。 - **throw**:抛出异常。 - **try**:执行可能抛出异常的代码块。 - **catch**:捕获并处理异常。 - **finally**:无论是否发生异常,都要执行的代码块。 - **在 try 块中可以抛出异常**:可以使用 `throw` 关键字在 `try` 块中抛出异常。 **46. java 中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop() 和 suspend() 方法为何不推荐使用?** - **实现线程**:通过继承 `Thread` 类或实现 `Runnable` 接口。 - **同步方法**:使用 `synchronized` 关键字修饰。 - **stop() 和 suspend()**:不推荐使用,因为它们可能导致死锁。 **47. sleep() 和 wait() 有什么区别?** - **sleep()**:使当前线程暂停一段时间,不释放锁。 - **wait()**:使当前线程等待,直到被其他线程唤醒,释放锁。 **48. 同步和异步有何异同,在什么情况下分别使用他们?举例说明。** - **同步**:调用方等待响应,直到得到结果。 - **异步**:调用方发出请求后立即返回,后续通过回调等方式得到结果。 - **使用场景**:同步适合简单的任务,异步适合耗时较长的任务。 **49. 下面两个方法同步吗?(自己发明)** 问题中未给出具体的代码示例,无法具体分析。 **50. 多线程有几种实现方法? 同步有几种实现方法?** - **多线程实现方法**:通过继承 `Thread` 类或实现 `Runnable` 接口。 - **同步实现方法**:使用 `synchronized` 关键字、`ReentrantLock` 等。 **51. 启动一个线程是用 run() 还是 start()?** 使用 `start()` 来启动线程,`run()` 是线程执行的主体方法。 **52. 当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对象的其它方法?** 如果其他方法也是 `synchronized` 的,那么其他线程将无法进入。如果其他方法是非 `synchronized` 的,则其他线程可以进入这些方法。
剩余63页未读,继续阅读
- 粉丝: 1
- 资源: 53
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助