### Java基础知识点详解 #### 1. 多个类在一个.java文件中 - 在一个`.java`源文件中,确实可以包含多个类定义,但是有以下限制: - 源文件名必须与其中一个公共类(`public class`)的名字完全相同。 - 文件中只能有一个公共类。 - 其他类必须是非公共类(即默认访问级别或受保护的`protected`)。 #### 2. Java中的`goto` - Java中没有传统意义上的`goto`语句。`goto`最初在Java中作为保留关键字存在,但最终并未在语言规范中正式采用。因此,`goto`在Java中是不可用的。 #### 3. `&`和`&&`的区别 - `&`和`&&`都可以用于逻辑与运算,但它们的行为有所不同: - `&`:这是一个位操作符,它同时执行按位与和逻辑与运算。在布尔表达式中,即使左侧的操作数为`false`,右侧的操作数也会被计算。 - `&&`:这是短路逻辑与运算符。如果左侧的操作数为`false`,则右侧的操作数不会被计算,这样可以提高效率。 #### 4. 跳出多重嵌套循环 - 在Java中,可以通过设置标签来跳出多重嵌套循环: ```java outerLoop: for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (/* 条件 */) { break outerLoop; } } } ``` #### 5. `switch`语句支持的数据类型 - `switch`语句可以作用于`byte`类型。 - `switch`语句不能直接作用于`long`类型,但可以通过显式转换为`int`来实现。 - 从Java 7开始,`switch`语句支持`String`类型。 #### 6. `short s1`的自动类型提升问题 - `short s1 = 1; s1 = s1 + 1;`会引发编译错误,因为`+`操作会将`short`类型的`s1`提升为`int`类型,然后赋值给`short`类型的`s1`会导致类型不匹配。 - 使用复合赋值运算符`+=`则不会出现此问题,因为它会自动处理类型转换。 #### 7. `char`类型存储中文字符 - `char`类型可以存储一个中文汉字,因为Java中的`char`类型使用的是Unicode编码,每个`char`占用2个字节,足够存储一个汉字。 #### 8. 计算效率 - 最有效率的方法是使用位移运算符:`2 << 3`,这等价于`2 * 8`。 #### 9. 设计一个百亿级的计算器 - 对于百亿级别的计算任务,需要考虑数据类型的选择和算法优化。可以使用`BigInteger`类来进行大整数运算,确保不会发生溢出。 #### 10. `final`关键字的使用 - 使用`final`关键字修饰一个变量时,主要是引用本身不能变,而不是引用的对象不能变。这意味着你可以改变`final`对象的内容,但不能改变指向该对象的引用。 #### 11. `==`与`equals`方法的区别 - `==`比较的是两个对象的引用是否相等,而`equals`方法比较的是两个对象的内容是否相等。 - 默认情况下,`equals`方法的行为与`==`相同,但在许多类中会被重写以提供自定义的比较逻辑。 #### 12. 静态变量与实例变量的区别 - **静态变量**:属于类,所有对象共享同一份副本;在内存中只有一份。 - **实例变量**:属于对象,每个对象都有自己独立的一份副本;在内存中有多个副本。 #### 13. `static`方法调用非`static`方法 - 从`static`方法内部无法直接调用非`static`方法,因为非`static`方法依赖于特定的对象实例。 #### 14. `Integer`与`int`的区别 - `int`是基本数据类型,而`Integer`是`int`的封装类。 - `int`只能表示数值,而`Integer`还可以表示`null`。 #### 15. `Math.round()`函数 - `Math.round(11.5)`等于`12`,`Math.round(-11.5)`等于`-11`。这是因为`Math.round()`方法对于正数会向远离零的方向舍入,对于负数会向接近零的方向舍入。 #### 16. 未给出代码示例 - 由于没有具体的代码示例,这里无法分析具体的问题所在。 #### 17. 访问修饰符的区别 - `public`:允许从任何地方访问。 - `private`:仅限于当前类内部访问。 - `protected`:允许当前类、子类以及同一个包中的其他类访问。 - 如果不写修饰符,默认为包访问级别,允许同一个包中的其他类访问。 #### 18. `overload`与`override`的区别 - `overload`(重载):在同一类中,具有相同方法名但参数列表不同的多个方法。 - `override`(覆盖/重写):子类重新定义父类中的方法。返回类型必须相同。 #### 19. 构造器`Constructor`不可被覆盖 - 构造器不能被重写,因为构造器用于初始化对象,没有继承关系中的“覆盖”概念。 #### 20. 接口与抽象类的继承与实现 - 接口可以继承接口。 - 抽象类可以实现接口。 - 抽象类可以继承具体类。 - 抽象类中可以有静态的`main`方法。 #### 21. `clone()`方法中的典型代码 - 典型的`clone()`方法实现通常包含一行代码:`return super.clone();`,这是为了实现浅拷贝。 #### 22. 面向对象的特征 - 封装:隐藏对象的实现细节,只暴露必要的接口。 - 继承:子类继承父类的特性,减少重复代码。 - 多态:通过接口或抽象类实现,允许子类以多种形态呈现。 #### 23. 多态的实现机制 - Java中实现多态主要通过继承和接口来实现。通过重写方法和使用抽象类或接口来实现多态性。 #### 24. `abstract class`与`interface`的区别 - `abstract class`可以有抽象方法也可以有具体实现,而`interface`中只能有抽象方法(默认为`public abstract`)。 - `abstract class`可以包含构造器、实例变量、静态方法等,而`interface`中不允许这些元素。 - 类只能继承一个`abstract class`,但可以实现多个`interface`。 #### 25. `abstract`方法的特性 - `abstract`方法不可以是`static`的,因为`abstract`方法是没有实现的,而`static`方法是类级别的。 - `abstract`方法可以是`native`的,表示由外部代码实现。 - `abstract`方法可以是`synchronized`的,虽然实际上没有意义,因为`abstract`方法没有实现。 #### 26. 内部类与静态内部类的区别 - **内部类**:依赖于外部类实例,可以访问外部类的所有成员,包括私有成员。 - **静态内部类**:不依赖于外部类实例,不能访问外部类的非静态成员。 #### 27. 内部类引用外部类成员 - 内部类可以引用其外部类的所有成员,包括私有成员。但是,当外部类实例被销毁时,内部类仍然可以存活,因为内部类持有一个对外部类实例的隐式引用。 #### 28. 匿名内部类 - 匿名内部类可以继承其他类并实现接口。 - 匿名内部类没有名称,通常在声明的同时创建其实例。 #### 29. `super.getClass()` - `super.getClass()`用于获取父类的`Class`对象。这是一种常用的技术,用于在子类中获取父类的信息。 #### 30. `String`是不是最基本的数据类型 - `String`不是基本数据类型,它是`String`类的一个实例。 #### 31. `String`的不可变性 - `String`对象是不可变的。在执行`String s = "Hello"; s = s + "world!";`之后,原始的`String`对象并没有改变,而是创建了一个新的`String`对象。 #### 32. 继承`String`类 - `String`类是最终类(`final`),不能被继承。 #### 33. `String`对象的创建 - `String s = new String("xyz");`创建了两个`String`对象,一个在常量池中,另一个是通过`new`关键字创建的对象。 - `String`字面量直接赋值只会创建一个对象。 #### 34. `String`与`StringBuffer`的区别 - `String`是不可变的,而`StringBuffer`是可变的。 - `StringBuffer`提供了线程安全的方法来修改字符串内容,适用于多线程环境。 #### 35. 字符串转数组 - 可以使用`split()`方法将逗号分隔的字符串转换为数组: ```java String str = "a,b,c,d"; String[] arr = str.split(","); ``` #### 36. 数组与字符串的`length`属性 - 数组有一个`length`属性,用于获取数组的长度。 - `String`类有一个`length()`方法,用于获取字符串的长度。 #### 37. 字符串连接创建对象数量 - `String s = "a" + "b" + "c" + "d";`创建了1个对象,因为字符串字面量是在编译时期就连接好的。 #### 38. `try`与`finally`的执行顺序 - 即使`try`块中有`return`语句,`finally`块中的代码依然会被执行。 - `finally`块在`return`之前执行。 #### 39. 未给出具体代码示例 - 由于没有具体的代码示例,这里无法分析结果。 #### 40. `final`, `finally`, `finalize`的区别 - `final`:表示变量不可更改或方法不可被重写。 - `finally`:用于指定必须执行的代码,无论是否发生异常。 - `finalize`:已废弃,是`Object`类中的方法,用于对象垃圾回收前的清理工作。 #### 41. 运行时异常与一般异常的异同 - 运行时异常通常是编程错误,如`NullPointerException`。 - 一般异常通常是由外部因素引起的,如`IOException`。 - 运行时异常不需要显式捕获或声明,而一般异常必须捕获或声明。 #### 42. `Error`与`Exception`的区别 - `Error`表示系统级错误,如`OutOfMemoryError`。 - `Exception`表示可以被应用程序捕获或处理的异常情况。 #### 43. 异常处理机制 - Java的异常处理机制基于`try-catch-finally`结构。 - `try`块用来包装可能抛出异常的代码。 - `catch`块用来处理异常。 - `finally`块总是被执行,通常用于资源释放。 #### 44. 常见的运行时异常 - `NullPointerException`:尝试访问空对象的成员。 - `ArrayIndexOutOfBoundsException`:数组索引越界。 - `ClassCastException`:非法的类型转换。 - `IllegalArgumentException`:传入非法参数。 - `ArithmeticException`:除以零等算术异常。 #### 45. 异常处理关键字的意义 - `throws`:声明方法可能会抛出的异常。 - `throw`:抛出异常。 - `try`:尝试执行的代码块。 - `catch`:捕获异常。 - `finally`:无论是否发生异常都会执行的代码块。 - 在`try`块中可以抛出异常。 #### 46. 线程的实现方法 - 可以通过继承`Thread`类或实现`Runnable`接口来创建线程。 - 同步方法使用`synchronized`关键字修饰。 - `stop()`和`suspend()`方法已被废弃,因为它们可能导致数据不一致和死锁。推荐使用更安全的线程中断机制。
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助