Think in Java 实例变量的初始化

  1. 说明:

    1.   父类为Fa,子类为Child
    2.   成员变量=全局变量 在类内部在方法外部定义的变量
    3.   静态成员=static 修饰的全局变量
    4. 成员变量=在方法内部定义的
    5.   将加载、连接、初始化过程 统称为 :全加载 为何里面单独的加载进行区分
      1.   疑问:静态代码块的执行和静态变量的赋值哪个先?
  2. 涉及的知识点:
    1.  什么情况下才加载类,已知的几种情况

      1.   当一个类为启动类时候,先加载其父类
      2.  当new 一个子类的时候,先加载其父类
    2.  子类对象和父类的加载先后顺序
      1.   加载的时候可以做什么  

        1.   类的加载机制-加载、连接、初始化
        2.   各阶段各做了什么
    3.  父类和子类的成员变量-通过不同的引用型变量访问的输出不同
    4. 父类和子类的方法-通过不同的引用型变量调用输出不同
    5. 成员变量的存放位置
    6. 局部变量的存放位置
    7. static成员的存放位置
    8. 常量池中存放的数据
  3.   具体讲解
    1.  什么情况下才加载类,已知的几种情况

      1. 当一个类为启动类时候,先加载其父类:验证实验如下
      2. /**
             *
             * 实验一  当子类为启动类时候,先全加载父类,再全加载子类
             *
             * 验证过程:
             * 验证1-在子类父类中都写 静态代码块
             * 验证2-比较静态代码块的执行顺序
             *
             * 结论:哪个静态代码块先执行 说明哪个类先被加载(不一定全家在,验证在实验三)
             * PS:静态代码块的执行发生在全加载过程的 准备阶段或者是初始化阶段,看静态代码块的顺序(验证在实验二)
             *
             */
        /**
         * 实验一
         * @author liuyan
         * 时间 2015年5月2日20:38:25
         * 地点 宿舍
         */
        
        public class Child extends Fa {
        
            static {
                // 静态代码块-在一个类的加载阶段执行
                System.out.println("子类 静态代码块");
            }
        
            public static void main(String[] args) {
        
            }
        }
        
        class Fa {
        
            static {
        
                System.out.println("父类 静态代码块");
        
            }
        
        }
        结果:
        父类 静态代码块
        子类 静态代码块
      3. 实验二:静态代码块执行发生在 全加载的初始化阶段
        1.       

          /*
               * 实验二 静态代码块的执行发生在全加载过程的 连接-准备阶段或者初始化阶段
               * 验证1.静态变量写在 静态变量定义语句之前
               *
               *说明:
               *-先执行的是 准备过程中的 给静态变量分配内存并初始化为其默认值
               *-再执行初始化阶段 将程序员想赋予静态变量的值赋值给静态变量
               *-再执行的是 静态代码块
               *解释:
               *-要是先执行静态代码块的内容的话,首先编译语句会报错:找不到变量 shuju
               *
               *
               */
          
          /*
           * 实验二 静态代码块的执行发生在全加载过程的 连接-准备或者  初始化阶段
           *
           */
          
          public class Child extends Fa {
          
              static {
                  // 静态代码块-在一个类的加载阶段执行
                  System.out.println("子类 静态代码块");
              }
          
              public static void main(String[] args) {
          
              }
          }
          
          class Fa {
          
          static{
          
              System.out.println("Fa static Area");
          }
          
              static int shuju = 2;
              /*
               * 在Fa.class一旦从硬盘被加载,
               * 则在加载其二进制代码,
               * 在连接-验证阶段验证代码完整性和规范性,
               * 在连接-准备阶段给静态变量分配内存并赋予默认值,
               * 在连接-解析阶段将 符号引用转换为直接引用先不说
               * 在初始化阶段 为类的静态变量(也 称类变量)赋予正确的初始值,也就是程序员想赋予的值,在这里是2
               *
               *
               * 接着执行静态代码块内的代码
               */
              static {
          
                  System.out.println("子类的静态变量shuju的值"+shuju);
              }
          
          }
          执行结果:
          
          Fa static Area
          子类的静态变量shuju的值2
          子类 静态代码块

          PS:父类的静态变量初始化完成,并执行完静态代码块中的值之后才加载子类,此外静态代码块按顺序执行

        2. 实验三
          1.     

            /*
             * 实验二 静态代码块的执行发生在全加载过程的 连接-准备或者  初始化阶段
             *
             */
            
            public class Test extends Fa {
                /*
                 * 实验三:哪个静态代码块先执行 说明哪个类先被加载(不一定全加载
                 */
            
                public static void main(String[] args) {
            
                    // Child child;-结果 Fa static Area说明 只有父类加载类,子类没有加载
                    // Fa fa=new Fa();//结果同上
                    Child child = new Child();// 结果Fa static Area 子类 静态代码块
                    // Fa fa =new Child();//结果同上
            
                }
            }
            
            class Child extends Fa {
            
                static {
                    // 静态代码块-在一个类的加载阶段执行
                    System.out.println("子类 静态代码块");
                }
            
            }
            
            class Fa {
            
                static {
            
                    System.out.println("Fa static Area");
                }
            
            }
    2.       
时间: 2024-10-05 05:31:31

Think in Java 实例变量的初始化的相关文章

朝花夕拾——看清java实例变量的初始化内幕

过一段时间可能就得去找实习,今天在宿舍翻开以前常放在枕头边的大砖头<Java编程思想>打算重温下之前学的知识点,看到有关java初始化的一些知识,综合之前看过的网页和书籍,记下自己对java实例变量初始化的理解,仅供需要的朋友参考,也为自己积累一些java编程应该注意的知识点. java中对实例变量的初始化可以在三个地方出现:定义实例变量时指定初始值:初始化块中为实例变量指定的初始值:构造器中为实例变量指定的初始值.如果理解其内部初始化的规律,一般在编程和面试中出现的变量赋值问题基本都可以解决

Java实例变量初始化

由一道面试题所想到的--Java实例变量初始化 时间:2015-10-07 16:08:38      阅读:23      评论:0      收藏:0      [点我收藏+] 该题目源自微信公众号(程序员的那些事)的推送:携程 Java 工程师的一道面向对象面试题 题目是这样的:求下面程序的输出: public class Base { private String baseName = "base"; public Base() { callName(); } public v

类变量和实例变量及其初始化

0.基本概念 类变量是指java类中的static数据成员,实例变量则是指java类中的非static数据成员.由于类变量不需要创建一个对象即可访问,而实例变量则必须与一个具体的对象对应,因此类变量和实例变量的初始化时机是不同的.本文主要关注以下3个问题: (1)什么时候初始化类变量?什么时候初始化实例变量? (2)什么时候会同时初始化类变量和实例变量? (3)在(1).(2)情形下各个类变量和实例变量的初始化顺序? 1.类变量初始化 根据有无被final关键字修饰,类变量的初始化时机不同.被f

JNI/NDK开发指南(七)——C/C++访问Java实例变量和静态变量

转载请注明出处:http://blog.csdn.net/xyang81/article/details/42836783 在上一章中我们学习到了如何在本地代码中访问任意Java类中的静态方法和实例方法,本章我们也通过一个示例来学习Java中的实例变量和静态变量,在本地代码中如何来访问和修改.静态变量也称为类变量(属性),在所有实例对象中共享同一份数据,可以直接通过[类名.变量名]来访问.实例变量也称为成员变量(属性),每个实例都拥有一份实例变量数据的拷贝,它们之间修改后的数据互不影响.下面看一

Java 实例变量与局部变量

一.变量: 实例变量声明在类中,不赋值,会有初始值. 例: integers   0 floating points 0.0 booleans false references null 局部变量声明在方法中,不赋值,不会有初始值.编译会报错! 二.变量比较 使用==来比较两个primitive主数据类型,或者判断两个引用是否引用同一对象. 使用equals() 来判断两个对象是否在意义上相等(内容).

java实例变量及方法调用顺序

public class Base { private String name="base"; public Base(){ sayHello(); } void sayHello() { System.out.println("Base hello " + name); } } class Derived extends Base { private String name="Derived"; public Derived(){ sayHel

类变量与实例变量

public class Cat { String name; int age; static void test(){ System.out.println("test static"); } public Cat(String name,int age){ System.out.println("执行构造器"); this.name = name; this.age = age; } {//这里一定要用花括号 System.out.println("执

程序启动的顺序以及实例变量相互赋值、传递拷贝的理解

1 public class InstanceInitializer { 2 private int i = 1; 3 private int getI() { 4 return i; 5 } 6 private int j = getI(); 7 8 9 public InstanceInitializer() 10 { 11 i = 2; 12 } 13 public static void main(String[] args) { 14 InstanceInitializer ii =

Java初始化顺序(静态变量、静态初始化块、实例变量、实例初始化块、构造方法)

1.执行顺序 1.1.一个类中的初始化顺序 (静态变量.静态初始化块)=>(变量.初始化块.构造器). 1.2.两个具有继承关系类的初始化顺序 父类的(静态变量.静态初始化块)=> 子类的(静态变量.静态初始化块)=> 父类的(变量.初始化块.构造器)=> 子类的(变量.初始化块.构造器). 示例如下:(结果见注释) 1 class A { 2 public A() { 3 System.out.println("Constructor A."); 4 } 5