- 浏览: 136049 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
jptiancai:
提供下第六种做法,多用些内存,遍历set的时候,用list删除 ...
解决ArrayList的ConcurrentModificationException -
langmanjian0212:
spring 2.5
spring中文文档下载 -
hoarhoar:
我已经更新了,现在是完整版了。请到csdn上下载,或者向我要。 ...
java编程思想第四版勘误下载 -
zzplovejava:
好,英文差有中文的先学学
spring中文文档下载 -
呆哥儿:
Service 确实 不过为什么没有得到广泛应用呢 !求教
使用泛型类简化服务层(Service)类的设计
网址:http://zangweiren.iteye.com
大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码
对变量值进行了某种运算,另外还有一些将变量值输出到控制台的代码,然后让我们判断输出的结果。这实际上是在考查我们对于继承情况下类的初始化顺序的了
解。
我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:
- public class InitialOrderTest {
- // 静态变量
- public static String staticField = "静态变量" ;
- // 变量
- public String field = "变量" ;
- // 静态初始化块
- static {
- System.out.println(staticField);
- System.out.println("静态初始化块" );
- }
- // 初始化块
- {
- System.out.println(field);
- System.out.println("初始化块" );
- }
- // 构造器
- public InitialOrderTest() {
- System.out.println("构造器" );
- }
- public static void main(String[] args) {
- new InitialOrderTest();
- }
- }
public class InitialOrderTest { // 静态变量 public static String staticField = "静态变量"; // 变量 public String field = "变量"; // 静态初始化块 static { System.out.println(staticField); System.out.println("静态初始化块"); } // 初始化块 { System.out.println(field); System.out.println("初始化块"); } // 构造器 public InitialOrderTest() { System.out.println("构造器"); } public static void main(String[] args) { new InitialOrderTest(); } }
运行以上代码,我们会得到如下的输出结果:
- 静态变量
- 静态初始化块
- 变量
- 初始化块
- 构造器
这与上文中说的完全符合。那么对于继承情况下又会怎样呢?我们仍然以一段测试代码来获取最终结果:
- class Parent {
- // 静态变量
- public static String p_StaticField = "父类--静态变量" ;
- // 变量
- public String p_Field = "父类--变量" ;
- // 静态初始化块
- static {
- System.out.println(p_StaticField);
- System.out.println("父类--静态初始化块" );
- }
- // 初始化块
- {
- System.out.println(p_Field);
- System.out.println("父类--初始化块" );
- }
- // 构造器
- public Parent() {
- System.out.println("父类--构造器" );
- }
- }
- public class SubClass extends Parent {
- // 静态变量
- public static String s_StaticField = "子类--静态变量" ;
- // 变量
- public String s_Field = "子类--变量" ;
- // 静态初始化块
- static {
- System.out.println(s_StaticField);
- System.out.println("子类--静态初始化块" );
- }
- // 初始化块
- {
- System.out.println(s_Field);
- System.out.println("子类--初始化块" );
- }
- // 构造器
- public SubClass() {
- System.out.println("子类--构造器" );
- }
- // 程序入口
- public static void main(String[] args) {
- new SubClass();
- }
- }
class Parent { // 静态变量 public static String p_StaticField = "父类--静态变量"; // 变量 public String p_Field = "父类--变量"; // 静态初始化块 static { System.out.println(p_StaticField); System.out.println("父类--静态初始化块"); } // 初始化块 { System.out.println(p_Field); System.out.println("父类--初始化块"); } // 构造器 public Parent() { System.out.println("父类--构造器"); } } public class SubClass extends Parent { // 静态变量 public static String s_StaticField = "子类--静态变量"; // 变量 public String s_Field = "子类--变量"; // 静态初始化块 static { System.out.println(s_StaticField); System.out.println("子类--静态初始化块"); } // 初始化块 { System.out.println(s_Field); System.out.println("子类--初始化块"); } // 构造器 public SubClass() { System.out.println("子类--构造器"); } // 程序入口 public static void main(String[] args) { new SubClass(); } }
运行一下上面的代码,结果马上呈现在我们的眼前:
- 父类--静态变量
- 父类--静态初始化块
- 子类--静态变量
- 子类--静态初始化块
- 父类--变量
- 父类--初始化块
- 父类--构造器
- 子类--变量
- 子类--初始化块
- 子类--构造器
现在,结果已经不言自明了。大家可能会注意到一点,那就是,并不是父类完全初始化完毕后才进行子类的初始化,实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。
那么对于静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢?是否静态变量总是先于静态初始化块,变量总是先于初始化块就被初始化了呢?实际上这取决于它们在类中出现的先后顺序。我们以静态变量和静态初始化块为例来进行说明。
同样,我们还是写一个类来进行测试:
- public class TestOrder {
- // 静态变量
- public static TestA a = new TestA();
- // 静态初始化块
- static {
- System.out.println("静态初始化块" );
- }
- // 静态变量
- public static TestB b = new TestB();
- public static void main(String[] args) {
- new TestOrder();
- }
- }
- class TestA {
- public TestA() {
- System.out.println("Test--A" );
- }
- }
- class TestB {
- public TestB() {
- System.out.println("Test--B" );
- }
- }
public class TestOrder { // 静态变量 public static TestA a = new TestA(); // 静态初始化块 static { System.out.println("静态初始化块"); } // 静态变量 public static TestB b = new TestB(); public static void main(String[] args) { new TestOrder(); } } class TestA { public TestA() { System.out.println("Test--A"); } } class TestB { public TestB() { System.out.println("Test--B"); } }
运行上面的代码,会得到如下的结果:
- Test--A
- 静态初始化块
- Test--B
大家可以随意改变变量a、变量b以及静态初始化块的前后位置,就会发现输出结果随着它们在类中出现的前后顺序而改变,这就说明静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。同样,变量和初始化块也遵循这个规律。
了解了继承情况下类的初始化顺序之后,如何判断最终输出结果就迎刃而解了。
发表评论
-
毕业两年我学到了什么
2010-06-04 14:34 1289明天就要离开我现在的 ... -
java反射机制与动态代理
2010-06-02 16:42 17111 java反射机制:运行时的类信息 Class类与java ... -
浅析java回调机制与观察者模式
2010-06-02 10:38 42211 java回调机制: 首先解释java回调机制,对象能够携 ... -
java编程思想第四版勘误下载
2010-05-25 17:08 1242此文档是在CSDN下载的,提供javaeye社区下载 -
java泛型通配符-协变与逆变
2010-05-24 12:36 5682周末研究了下java泛型,关于泛型通配符的协变与逆变问题,题目 ... -
java反射机制-通过非默认构造器创建对象
2010-05-21 12:27 3631今天研究了下java反射机制,并利用反射机制,通过非默认构造器 ... -
浅谈非静态内部类不能有静态成员
2010-05-05 23:09 41571 非静态内部类为什么不能有静态成员,我自己总结了下, 如下 ... -
类的初始化顺序
2010-05-02 10:39 11961 对于继承来讲,初始化次序大致如下: 1)父类的静态变量和 ... -
解决ArrayList的ConcurrentModificationException
2010-04-15 22:19 251411 问题 :在list<String> 中清 ... -
日期的加减法
2010-03-24 15:30 1872今天小试了日期的加减法,功能实现了,但觉得代码很长,有更好的解 ... -
JDK1.5 新特性
2009-07-08 11:12 878"JDK1.5"的一个重要主题就是通过新增 ... -
JAVA反射机制的学习
2009-07-07 14:07 1100原文:http://www.iteye.com/t ... -
JAVA多线程
2009-07-02 14:14 993原文出处:http://www.iteye.com/topic ... -
java虚拟机的类装载
2009-06-25 17:19 822原文出处:http://webservices.ctocio. ... -
JAVA面试试题解惑系列(创建几个String对象)
2009-06-22 15:33 1147作者:臧圩人(zangweiren) 网址:http:/ ... -
java参数传递总结
2008-12-13 12:53 946以前学习C的 时候参数传递的方式有两种,一种叫"值传 ...
相关推荐
理解这个初始化顺序对解决面试题和编写可靠的代码至关重要。在实际编程中,我们有时需要依赖这种初始化顺序来确保数据的正确初始化,特别是在处理复杂的继承结构和多线程场景时。因此,熟练掌握类初始化顺序是每个...
总结来说,对于Java面试中常出现的关于类初始化顺序的问题,开发者应当掌握以下几点: 1. 单个类内成员的初始化顺序:静态变量、静态初始化块、变量、初始化块、构造器。 2. 在继承关系中,子类的静态成员会在父类...
《JAVA面试题解惑系列合集》这篇文章详细地讨论了Java面试中常见的一些知识点和问题。它包括了从类的初始化顺序、String对象的创建数量、变量的覆盖、final关键字、传值和传引用的区别、字符串的处理、日期和时间的...
JAVA面试题解惑系列(一)——类的初始化顺序 JAVA 是一门面向对象的编程语言,类的初始化顺序是 JAVA 程序员和 JAVA 工程师面试中一个非常重要的知识点。本文将详细讲解类的初始化顺序,并提供了相关的测试代码,...
### JAVA面试题解惑系列:类的初始化顺序详解 在JAVA面试中,考察候选人对类初始化顺序的理解是一项常见且重要的环节。本篇文章旨在深入解析这一主题,帮助读者掌握类初始化的详细过程,尤其是在继承关系中的类如何...
来自网络,主要包括以下内容:1、类初始化的顺序;2、到底创建了几个String对象;3、变量(属性)的覆盖;4、final,finally,finalize;5.传了值还是传了引用;6.String杂谈;7.日期与时间的处理;8.基本类型总结;9....
《JAVA面试题解惑系列——类的初始化顺序》 在Java编程中,理解类的初始化顺序是面试中常见的考察点,因为它直接关系到程序的执行逻辑。本文将深入探讨类的初始化过程,以及在继承场景下如何理解这个过程。 首先,...
JAVA面试题解惑系列 在 Java 中,类的初始化顺序是一个经常被问到的面试题。 nhiều 开发者可能会混淆类的初始化顺序,特别是在继承的情况下。下面我们来探讨一下类的初始化顺序。 首先,让我们看一下类的初始化...
"子类--构造器"); } public static void main(String[] args) { new SubClass(); } } 当我们运行这段代码时,会看到以下输出...所以,对于Java程序员和工程师来说,掌握类的初始化顺序是非常基础且重要的知识点。
JAVA面试题解惑系列(一)——类的初始化顺序 在Java编程语言中,理解类的初始化顺序是非常重要的,尤其是在涉及继承的情况下。本节将详细介绍类初始化的规则,并通过实例来帮助理解。 ##### 类的初始化顺序规则 ...