网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 交易代码 > Java精品代码 > 正文

java静态域、块,非静态域、块,构造函数

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

        面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,另外还有一些将变量值输出到控制台的代码,然后让我们判断输出的结果。这实际上是在考查我们对于继承情况下类的初始化顺序的了解。

        我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序以此是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:

Java代码
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();      
    }      
}     

运行以上代码,我们会得到如下的输出结果:
静态变量
静态初始化块
变量
初始化块
构造器

这与上文中说的完全符合。那么对于继承情况下又会怎样呢?我们仍然以一段测试代码来获取最终结果:

Java代码
 
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();      
    }      
}      

运行一下上面的代码,结果马上呈现在我们的眼前:
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器

       现在,结果已经不言自明了。大家可能会注意到一点,那就是,并不是父类完全初始化完毕后才进行子类的初始化,实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。

        那么对于静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢?是否静态变量总是先于静态初始化块,变量总是先于初始化块就被初始化了呢?实际上这取决于它们在类中出现的先后顺序。我们以静态变量和静态初始化块为例来进行说明。

同样,我们还是写一个类来进行测试:

Java代码
 
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以及静态初始化块的前后位置,就会发现输出结果随着它们在类中出现的前后顺序而改变,这就说明静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。同样,变量和初始化块也遵循这个规律。

        了解了继承情况下类的初始化顺序之后,如何判断最终输出结果就迎刃而解了。

TAG: Java教程java教程JAVA教程




点击下载系统:http://www.myeducs.cn/chaxun/index.html?go=java 静态域、块,非静态域、块,构造函数&aa=%CB%D1%CB%F7%C2%DB%CE%C4
设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师