`
wangleide414
  • 浏览: 606705 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

java 中的初始化顺序

阅读更多

前几天去东软笔试,考到了这种题目。回来好好总结一下。一般考肯定是结合继承一起考的。


一:先不考虑继承。一个类中初始化的顺序规则是:

      (1)静态变量>普通变量>构造器。

      (2)变量定义的顺序决定初始化的顺序。

      (3)静态变量和静态块是一样的,变量和非静态块是一样的。即可以把静态块看作是静态变量,把非静态块看作是 
              变量。


测试代码如下:

 

       

class C{
                  public C(String s){
                            System.out.println(s+"------cccccccccccccc");
                   }
        }

 

 

        class D {
 
             /**D的构造器**/
              public D(){
                       System.out.println("D的构造器");
              }
 
              /**D静态代码块**/
              static{
                        System.out.println("执行静态代码块");
              }
 
              /**D变量**/
 
              private C c1=new C("变量--(1)");
              private C c2=new C("变量--(2)");
 
             /**D非静态代码块**/
             {
              System.out.println("执行非静态代码块");
             }
 
             /**D的静态变量**/
 
             private static C c3=new C("静态变量--(3)");
             private static C c4=new C("静态变量--(4)");
 
             public static void main(String [] args){
                          new D();
             }
     }

 

  

  

     执行的结果是:

           执行静态代码块
           静态变量--(3)------cccccccccccccc
           静态变量--(4)------cccccccccccccc
           变量--(1)------cccccccccccccc
           变量--(2)------cccccccccccccc
           执行非静态代码块
           D的构造器

 

可以改变定义顺序,结果是符合上面初始化顺序规则的。



二:如果有继承的话。那么初始化的顺序规则是:

      (1)父类的初始化>子类的初始化

      (2)静态变量>普通变量>构造器。

      (3)变量定义的顺序决定初始化的顺序。

      (4)静态变量和静态块是一样的,变量和非静态块是一样的。即可以把静态块看作是静态变量,把非静态块看作是 
              变量。 

 

java代码

 

     

 class C{
             public C(String s){
                    System.out.println(s+"------cccccccccccccc");
             }
      }

      class A {
       
       /***构造器***/
       public A() {
              System.out.println("父类--构造器");
       }
 
       /***** 静态变量****/
       public static C c3=new C("父类静态变量1");
       /***** 静态初始化块****/
       static {
        System.out.println("父类--静态初始化块");
       }
       public static C c4=new C("父类静态变量2");
 
       /***** 变量****/
       public C c1 = new C("父类--变量1");
       /***** 始化块****/
       {
              System.out.println("父类--初始化块");
       }
       public C c2 = new C("父类--变量2");
       
      }


      public class B extends A {
       /***构造器***/
       public B() {
              System.out.println("子类--构造器");
       }
 
       /***** 静态变量****/
       public static C c1=new C("子类静态变量1");
       /***** 静态初始化块****/
       static {
              System.out.println("子类--静态初始化块");
       }
       public static C c2=new C("子类静态变量2");
 
       /***** 变量****/
       public C c3 = new C("子类--变量1");
       /***** 始化块****/
       {
              System.out.println("子类--初始化块");
       }
       public C c4 = new C("子类--变量2");
 
       public static void main(String[] args) {
              new B();
       }

  }

  

执行结果是:

       父类静态变量1------cccccccccccccc
       父类--静态初始化块
       父类静态变量2------cccccccccccccc
       子类静态变量1------cccccccccccccc
       子类--静态初始化块
       子类静态变量2------cccccccccccccc
       父类--变量1------cccccccccccccc
       父类--初始化块
       父类--变量2------cccccccccccccc
       父类--构造器
       子类--变量1------cccccccccccccc
       子类--初始化块
       子类--变量2------cccccccccccccc
       子类--构造器


结果证实了上面的规则,当然可以改变里边的定义顺序来证实一下。

 

0
0
分享到:
评论

相关推荐

    java程序初始化顺序

    以下是对Java程序初始化顺序的详细说明: 1. **类加载阶段**: - **加载**:当Java虚拟机(JVM)首次遇到一个类的引用时,会通过类加载器进行加载。加载过程包括找到类的.class文件,读取其字节码,并转化为内存中...

    详解Spring 中如何控制2个bean中的初始化顺序

    在 Spring 框架中,控制多个 bean 的初始化顺序是一个常见的问题。本篇文章将详细介绍如何控制 2 个 bean 的初始化顺序,提供了多种实现方式,并分析了每种方式的优缺。 问题场景 在实际开发中,我们经常会遇到...

    java代码的初始化顺序demo

    让我们深入探讨Java中的初始化顺序及其背后的机制。 1. **类加载阶段**: 在Java程序运行时,JVM会先加载类的字节码文件(.class文件)。这个过程包括加载、验证、准备、解析和初始化五个步骤。这里我们主要关注...

    java面试题-类的初始化顺序.doc

    在实际开发中,理解这个初始化顺序是非常重要的,尤其是在设计复杂的类结构或者涉及单例模式、线程安全初始化等场景时。如果在构造器或初始化块中依赖其他静态或非静态成员,必须确保这些成员在需要之前已经被正确...

    Java类继承初始化顺序

    当我们谈论“Java类继承初始化顺序”时,涉及到的关键知识点包括构造器、成员变量的初始化、super关键字以及方法的覆盖。 首先,了解类初始化的顺序至关重要。当创建一个子类实例时,初始化过程遵循以下步骤: 1. ...

    java中类的初始化顺序

    ### Java中类的初始化顺序详解 #### 一、概述 在Java编程语言中,类的初始化是一个非常重要的概念。类的初始化涉及到多个方面,包括静态成员变量、实例成员变量、静态初始化块、实例初始化块以及构造函数等。本文...

    “礼让”原则学习Java对象初始化顺序.pdf

    Java 对象初始化顺序是指在 Java 程序中,对象的初始化过程中发生的顺序问题。这是 Java 编程语言的基础知识点之一,但是许多学生在学习和使用时总是感到困惑和困难。 二、JVM 执行过程中的“礼让”原则 JVM 在...

    Java静态初始化块和对象初始化块

    在Java编程语言中,初始化块是程序执行时用于初始化对象或类的重要机制。这里我们将深入探讨两种类型的初始化块:静态初始化块(Static Initializer Block)和对象初始化块(Instance Initializer Block)。这两种...

    java类变量初始化顺序

    详细讲解java类中静态变量,普通标量,对象、基本类型的初始化顺序。

    Java变量初始化

    Java 变量初始化的时机是指在 Java 语言中变量的初始化过程,包括变量的声明、初始化和赋值的步骤。 Java 变量声明 在 Java 语言中,每个变量必须先声明,然后才能使用。声明变量时必须指定该变量的数据类型。...

    Java初始化顺序1

    Java 中的初始化顺序是按照定义的顺序进行的,而静态变量的初始化顺序则是按照定义的顺序,并且只在第一次访问时初始化。 Java 初始化顺序的知识点总结: * 类变量(静态变量)和实例变量(对象变量)的区别 * ...

    java类中静态域、块,非静态域、块,构造函数的初始化顺序

    ### Java 类中静态域、块,非静态域、块,构造函数的初始化顺序 #### 一、概述 在 Java 编程语言中,类的初始化顺序对于理解程序的行为至关重要。特别是当涉及到静态域(静态变量)、非静态域(实例变量)、静态块...

    类继承的初始化顺序类,继承的初始化顺序

    本文详细介绍了类继承中的初始化顺序问题,包括初始化的基本概念、初始化过程中的关键步骤以及如何正确处理基类和子类之间的构造函数调用。理解这些概念对于编写高效、可维护的面向对象程序至关重要。希望通过对这些...

    C++和Java初始化顺序的比较代码

    在Java中,初始化顺序则有所不同: 1. 基本类型的静态字段和引用类型的静态字段(如果它们是常量,即final且已初始化):这些字段在类加载时按声明顺序初始化。 2. 静态初始化块:当类第一次被加载时执行,按块的...

    详解Java的初始化与清理

    本文将深入探讨Java中的初始化过程,包括对象的构造器初始化以及类成员的初始化顺序,同时也会涉及Java的垃圾回收机制,即内存的自动清理。 首先,让我们详细了解一下Java中的构造器初始化。构造器是Java中用于初始...

    Java中初始化List的5种方法示例

    "Java中初始化List的5种方法示例" Java中初始化List有多种方法,本文将介绍五种常见的初始化方式。了解这些方法可以帮助开发者更好地使用Java中的List数据结构。 第一种方法:构造List后使用add方法初始化,这是最...

    探究java的ClassLoader及类变量初始化顺序

    Java中,类变量(static变量)的初始化顺序遵循以下规则: 1. 首先,执行父类的静态初始化块(方法),如果有的话。 2. 然后,执行子类的静态初始化块。 3. 静态变量的初始化顺序取决于它们在代码中声明的顺序,而...

    Java初始化块Java初始化块.doc

    总结起来,Java初始化块是Java中用于对象和类初始化的重要工具,它们在不同场景下提供了一种灵活的方式来控制对象和类的状态。理解初始化块的工作原理对于编写高效且无错误的Java代码至关重要。在编写代码时,应谨慎...

Global site tag (gtag.js) - Google Analytics