类的初始化顺序 到底创建了几个String对象? 变量(属性)的覆盖 final、finally和finalize的区别 传了值还是传了引用? 字符串(String)杂谈 日期和时间的处理 聊聊基本类型(内置类型) 继承、多态、重载和重写 话说多线程 这些运算符你是否还记得? ### 类的初始化顺序 在Java中,类的初始化顺序是一个重要的概念,特别是在处理继承时尤为重要。根据提供的描述,我们可以了解到作者希望通过一系列实例帮助读者更好地理解类的初始化过程。以下是对几个核心知识点的深入探讨。 #### (一)类的初始化顺序 - **静态变量**:在类加载时初始化,其初始化顺序按照它们在类中的定义顺序执行。 - **静态初始化块**:也是在类加载时执行,其执行顺序同样遵循它们在类中出现的顺序。 - **非静态变量**:在对象创建时初始化。 - **非静态初始化块**:在对象创建时执行,其执行顺序同样遵循它们在类中出现的顺序。 - **构造器**:在对象创建时调用,用于初始化该对象。 #### 继承情况下的类初始化顺序 在继承情况下,类的初始化顺序遵循以下原则: 1. **父类的静态变量和静态初始化块**:首先初始化父类中的所有静态变量和静态初始化块。 2. **子类的静态变量和静态初始化块**:接下来初始化子类中的所有静态变量和静态初始化块。 3. **父类的非静态变量和非静态初始化块**:随后初始化父类中的所有非静态变量和非静态初始化块。 4. **父类构造器**:调用父类构造器完成父类对象的初始化。 5. **子类的非静态变量和非静态初始化块**:最后初始化子类中的所有非静态变量和非静态初始化块。 6. **子类构造器**:调用子类构造器完成子类对象的初始化。 ### 到底创建了几个String对象? 对于这个问题,我们需要具体分析代码中的String对象是如何创建的。在Java中,`String`对象可以通过两种方式创建: - 直接赋值:如`String s = "abc";`,这种方式会在字符串常量池中查找或创建一个对应的字符串对象。 - 使用`new`关键字:如`String s = new String("abc");`,这种方式会在堆内存中创建一个新的字符串对象。 例如,考虑下面的代码片段: ```java String str1 = "hello"; String str2 = new String("hello"); ``` 这里`str1`指向字符串常量池中的"hello",而`str2`则指向堆内存中的一个新创建的"hello"对象。因此,总共创建了2个不同的`String`对象。 ### 变量(属性)的覆盖 变量覆盖通常发生在子类覆盖父类的变量时。当子类和父类拥有同名变量时,子类中的变量会覆盖父类中的同名变量。例如: ```java class Parent { public int x = 10; } class Child extends Parent { public int x = 20; // 覆盖父类中的x } ``` 在这个例子中,`Child`类中的`x`变量覆盖了`Parent`类中的`x`变量。 ### final、finally和finalize的区别 - **final**:用来声明不可变的变量或类,可以用于修饰类、方法和变量。 - 修饰类时,表示该类不能被继承。 - 修饰方法时,表示该方法不能被子类重写。 - 修饰变量时,表示该变量一旦初始化就不能再改变其值。 - **finally**:用于异常处理语句块中,确保无论是否发生异常,其中的代码都会被执行。 - **finalize**:是一个特殊的方法,用于对象被垃圾回收前进行一些清理工作,但并不常用。 ### 传了值还是传了引用? Java中所有的对象都是通过引用传递的。当我们传递一个对象作为方法参数时,实际上是传递了该对象的引用。例如: ```java public static void main(String[] args) { MyClass obj = new MyClass(); modifyObject(obj); System.out.println(obj.value); // 输出10 } public static void modifyObject(MyClass obj) { obj.value = 10; } ``` 在这个例子中,`modifyObject`方法修改了`obj`对象的状态,这表明在Java中传递的是对象的引用而不是值。 ### 字符串(String)杂谈 - `String`类是不可变的,这意味着一旦一个`String`对象被创建,它的内容就不能被改变。 - 可以使用`StringBuilder`或`StringBuffer`来构建可变的字符串,这两个类提供了更多的操作字符串的方法,且效率更高。 - 字符串拼接时,使用`+`操作符会导致多次创建新的字符串对象,使用`StringBuilder`或`StringBuffer`更高效。 ### 日期和时间的处理 在Java中处理日期和时间主要有几种方式: - **`java.util.Date`**:表示特定瞬间的时间点。 - **`java.util.Calendar`**:提供了一个可以操作日期和时间字段的对象。 - **`java.time`包**:Java 8引入的新API,包括`LocalDate`、`LocalTime`、`LocalDateTime`等类,更加现代和易用。 ### 聊聊基本类型(内置类型) Java提供了八种基本数据类型,分为两类:整型和浮点型。 - 整型:`byte`、`short`、`int`、`long` - 浮点型:`float`、`double` 此外,还有两种特殊的基本类型:`boolean`和`char`。 ### 继承、多态、重载和重写 - **继承**:子类继承父类的属性和行为。 - **多态**:允许子类对象替代父类对象,实现动态绑定。 - **重载**:同一个类中的多个方法具有相同的名字但参数列表不同。 - **重写**:子类中定义一个与父类中同名的方法,通常是为了提供一个与父类不同的实现。 ### 话说多线程 在Java中,多线程可以通过以下两种方式实现: - 实现`Runnable`接口并创建线程对象。 - 继承`Thread`类并创建线程对象。 Java还提供了`ExecutorService`等高级API来管理和控制线程池。 ### 这些运算符你是否还记得? Java支持多种运算符,包括算术运算符、比较运算符、逻辑运算符、位运算符等。正确理解和使用这些运算符对于编写高效的Java代码至关重要。 通过以上对各个知识点的详细介绍,希望可以帮助读者更好地理解和掌握Java面试中常见的问题及其解决方案。
剩余113页未读,继续阅读
- 粉丝: 0
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于dubbo-go、gin的集成项目资料齐全+详细文档.zip
- 基于dubbo2.5.3开发的监控平台,兼容了dubbo-admin的特性,有redis、mysql两个版本资料齐全+详细文档.zip
- 基于Dubbo的agent探针数据采集模块资料齐全+详细文档.zip
- 基于Dubbo-RPC的分布式配置服务中心资料齐全+详细文档.zip
- 基于dubbo的分布式工程开发规范实例工程,分布式跟踪、ID生成、分布式事务、分布式治理、分表分库、分布式锁、选举、分布式配置、API文档生成器...资料齐全+详细文档.zip
- 基于Dubbo的分布式任务调度系统资料齐全+详细文档.zip
- 基于dubbo的分布式商城资料齐全+详细文档.zip
- 基于dubbo的分布式数据库事务资料齐全+详细文档.zip
- @Transactional事务,太坑了!前言 对于从事java开发工作的同学来说,Spring的事务肯定再熟悉不过了
- 基于dubbo的微服务架构资料齐全+详细文档.zip
- 基于dubbo第三方支付系统资料齐全+详细文档.zip
- 基于Dubbo框架的raft算法库资料齐全+详细文档.zip
- 基于dubbo框架+leveldb存储构建高可用的事件通讯组件资料齐全+详细文档.zip
- 基于Dubbo分布式简易支付系统资料齐全+详细文档.zip
- 基于Dubbo埋点的分布式调用跟踪系统资料齐全+详细文档.zip
- 基于Dubbo微服务项目快速搭建脚手架,提供基础功能,方便企业快速搭建项目。资料齐全+详细文档.zip