1. Java类中初试化的顺序:

由此得出Java普通类初始化顺序结论:

(1)静态变量

(2)静态初始化块

(3)变量

(4)初始化块

(5)构造器

由此得出Java继承类初始化顺序结论:
(1)继承体系的所有静态成员初始化(先父类,后子类)
(2)父类初始化完成(普通成员的初始化-->构造函数的调用)
(3)子类初始化(普通成员-->构造函数)
 
 
2. Java初始化顺序如图:
 
代码演示:
class Sample
{
      Sample(String s)
      {
            System.out.println(s);
      }
 
      Sample()
      {
            System.out.println("Sample默认构造函数被调用");
      }
}
 
class Test{
      static Sample sam=new Sample("静态成员sam初始化");
 
      Sample sam1=new Sample("sam1成员初始化");
 
      static{
                System.out.println("static块执行");
                if(sam==null)
          System.out.println("sam is null");
                sam=new Sample("静态块内初始化sam成员变量");
             }
 
      Test()
      {
            System.out.println("Test默认构造函数被调用");
      }
 
}
 
//主函数
 public static void  main(String  str[])
{
     Test a=new Test();
 }
输出结果为:
静态成员sam初始化             -----静态成员初始化
static块执行                   -----静态块被执行
静态块内初始化sam成员变量       -----静态块执行
sam1成员初始化                          -----普通成员初始化
Test默认构造函数被调用                -----构造函数执行
 
 
由此可以得出结论:
a.  静态成员变量首先初始化(注意,Static可以看做一个静态成员,其执行顺序和其在类中申明的顺序有关)
b.  普通成员初始化
c.  执行构造函数。
 
对于静态成员(static块可以看成普通的一个静态成员,其并不一定在类初始化时首先执行)和普通成员,其初始化顺序只与其在类定义中的顺序有关,和其他因素无关。
例如下面的例子:
 
 
class Test{
      static{
              System.out.println("static 块 1  执行");
            }
 
      static Sample staticSam1=new Sample("静态成员staticSam1初始化");
 
      Sample sam1=new Sample("sam1成员初始化");
 
      static Sample staticSam2=new Sample("静态成员staticSam2初始化");
 
      static{
              System.out.println("static 块 2  执行");
            }
 
      Test()
      {
            System.out.println("Test默认构造函数被调用");
      }
      Sample sam2=new Sample("sam2成员初始化");
 
}
 
 
则结果为:
static 块 1  执行
静态成员staticSam1初始化
静态成员staticSam2初始化
static 块 2  执行 
                      --------静态成员
sam1成员初始化
sam2成员初始化
                      --------普通成员
Test默认构造函数被调用
                      --------构造函数
 
 
3. Java继承情况下的初始化顺序:
 
class Test{
      static{
              System.out.println("父类static 块 1  执行");
            }
 
      static Sample staticSam1=new Sample("父类 静态成员staticSam1初始化");
 
      Sample sam1=new Sample("父类 sam1成员初始化");
 
      static Sample staticSam2=new Sample("父类 静态成员staticSam2初始化");
 
      static{
              System.out.println("父类 static 块 2  执行");
            }
 
      Test()
      {
            System.out.println("父类 Test默认构造函数被调用");
      }
      Sample sam2=new Sample("父类 sam2成员初始化");
 
}
 
class TestSub extends Test
{
      static Sample staticSamSub=new Sample("子类 静态成员staticSamSub初始化");
 
      TestSub()
      {
            System.out.println("子类 TestSub 默认构造函数被调用");
      }
 
      Sample sam1=new Sample("子类 sam1成员初始化");
 
      static Sample staticSamSub1=new Sample("子类 静态成员staticSamSub1初始化");
      
      static{System.out.println("子类 static 块  执行");}
 
      Sample sam2=new Sample("子类 sam2成员初始化");
}
 
执行结果:
父类 static 块 1  执行
父类 静态成员staticSam1初始化
父类 静态成员staticSam2初始化
父类 static 块 2  执行
                        --------父类静态成员初始化
子类 静态成员staticSamSub初始化
子类 静态成员staticSamSub1初始化
子类 static 块  执行
                        -------子类静态成员初始化
父类 sam1成员初始化
父类 sam2成员初始化
父类 Test默认构造函数被调用       
                        -------父类普通成员初始化和构造函数执行
子类 sam1成员初始化
子类 sam2成员初始化
子类 TestSub 默认构造函数被调用
                        -------父类普通成员初始化和构造函数执行

Android(java)学习笔记78:Java类初始化顺序的更多相关文章

  1. java学习笔记7--抽象类与抽象方法

    接着前面的学习: java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) jav ...

  2. 0029 Java学习笔记-面向对象-枚举类

    可以创建几个对象? n多个:大部分的类,都可以随意创建对象,只要内存不爆掉 1个:比如单例类 有限的几个:采用单例类的设计思路,可以只允许创建少数的几个特定的对象:还有就是枚举类. 创建少数几个对象, ...

  3. 【原】Java学习笔记031 - 常用类

    package cn.temptation; public class Sample01 { public static void main(String[] args) { /* * 类 Math: ...

  4. java学习笔记4--对象的初始化与回收

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note4.html,转载请注明源地址. 1.对象初始化和回收 对象初始化 系统在生成对象时,会 ...

  5. 1.9(java学习笔记)object类及toString()与equals()方法

    object类 java中objec是所有类公共的父类,一个类只要没有明显的继承某一类,那么它就是继承object类. 例如 class Person {......};和class Person e ...

  6. Java 学习笔记(4)——java 常见类

    上次提前说了java中的面向对象,主要是为了使用这些常见类做打算,毕竟Java中一切都是对象,要使用一些系统提供的功能必须得通过类对象调用方法.其实Java相比于C来说强大的另一个原因是Java中提供 ...

  7. Java学习笔记16---抽象类与接口的浅显理解

    抽象类是由abstract修饰的类,定义方式如public abstract class A{...}. 接口由interface修饰,定义方式如public interface B{...}. 抽象 ...

  8. java学习笔记—实现一个类MyInputStream(28)

    1 实现一个类MyInputStream读取文件,且不能抛出异常 public class TestDemo { public static void main(String[] args) thro ...

  9. 6.1(java学习笔记)File类

    1.路径分隔符,文件分隔符. 路径分隔符(“:”) 文件名称分隔符(“\”windows,“/”Linux等). 不同平台使用的文件分隔符是不一样的,所以File类中提供了分隔符常量,它会根据平台的不 ...

  10. Java学习笔记day06_自定义类_ArrayList

    1.自定义类class 使用类的形式, 对现实中的事物进行描述. 类是引用数据类型. 事物: 方法,变量. 方法:事物具备的功能. 变量:事物的属性. 格式: public class 类名{ //属 ...

随机推荐

  1. Spark Checkpoint 概述

    有时候,Transformation 的 RDD 非常多或者具体 Transformation 产生的 RDD 本身计算特别复杂和耗时,此时我们必须考虑对计算结果数据进行持久化.与 persist 不 ...

  2. cogs 1685 魔法森林

    /* 写了个傻逼二分套二分,真的傻逼了,我这tmd是在贪心呐,70分满满的人品 */ #include<iostream> #include<cstdio> #include& ...

  3. android--系统路径获取

    Environment 常用方法: * 方法:getDataDirectory()解释:返回 File ,获取 Android 数据目录.* 方法:getDownloadCacheDirectory( ...

  4. ubuntu 14.04安装octave,及其使用

    从库安装: sudo apt-add-repository ppa:octave/stable sudo apt-get update sudo apt-get install octave 使用:以 ...

  5. [題解](搜索)生日蛋糕(NOI1999)

    搜索剪枝, 1.枚舉上下界: 先$R\subset$$(dep,min(\lfloor\sqrt{n-v}\rfloor,lastr-1))$ 后$H\subset$$(dep,min((n-v)/R ...

  6. 通过用axios发送请求,全局拦截请求,获取到错误弄明白promise对象

    axios.interceptors.response.use(function (response) { // 对响应数据做点什么 return response; }, function (err ...

  7. springMvc json 参数

    以前,一直以为在SpringMVC环境中,@RequestBody接收的是一个Json对象,一直在调试代码都没有成功,后来发现,其实 @RequestBody接收的是一个Json对象的字符串,而不是一 ...

  8. 05-树9 Huffman Codes (30 分)

    In 1953, David A. Huffman published his paper "A Method for the Construction of Minimum-Redunda ...

  9. Django - CRM项目(2)Q查询(模糊查询)

    一.CRM项目(2) 利用Q查询中的q对象完成条件筛选功能. 批量删除.公户转私户功能. 新增一张跟进记录表ConsultRecord,迁移数据库并添加测试数据,实现跟进记录列表页面. 客户列表新增跟 ...

  10. vue——运行一个项目

    教程:https://segmentfault.com/a/1190000009871504 启动:cnpm run dev