zoukankan      html  css  js  c++  java
  • java 对象成员变量初始化顺序

    对象成员变量指非static的变量,static的变量一般称为类成员变量,它们伴随着类的加载而初始化。

    package com.juneny.foundation;
    
    public class InitSeqOfObj {
    
    	ForSeqOfObjTest f1 = new ForSeqOfObjTest("create obj 1");
    	ForSeqOfObjTest f2 = new ForSeqOfObjTest("create obj 2");
    
    	public static void main(String[] args) {
    		InitSeqOfObj i = new InitSeqOfObj();
    	}
    }
    
    class ForSeqOfObjTest {
    
    	public ForSeqOfObjTest(String msg) {
    		System.out.println(msg);
    	}
    }
    

    运行,输出信息如下:

    create obj 1
    create obj 2
    
    

    和定义的顺序保持一致。

    总结

    java 对象的成员变量的初始化顺序和定义的顺序一致。java 类成员的初始化顺序也遵循这个原则,先定义的先初始化,非常符合人的认知习惯。

    以上只是独立的对象,如果有父类呢? 我大胆猜测一下,由于继承关系只是继承父类的接口,即方法,所以,当子类实例化时,父类的对象成员变量不会被初始化。

    还是做个实验吧:

    package com.juneny.foundation;
    
    class parentOfInitSeqOfObj{
    	ForSeqOfObjTest f1 = new ForSeqOfObjTest("Parent create obj 1");
    }
    
    public class InitSeqOfObj extends parentOfInitSeqOfObj{
    
    	ForSeqOfObjTest f1 = new ForSeqOfObjTest("create obj 1");
    	ForSeqOfObjTest f2 = new ForSeqOfObjTest("create obj 2");
    
    	public static void main(String[] args) {
    		InitSeqOfObj i = new InitSeqOfObj();
    	}
    }
    
    class ForSeqOfObjTest {
    
    	public ForSeqOfObjTest(String msg) {
    		System.out.println(msg);
    	}
    }
    

    结果让我大跌眼镜:

    Parent create obj 1
    create obj 1
    create obj 2
    
    

    看来,并非是我想象的那样。不过,这也说的通。 因为毕竟父对象需要随时向子对象提供自己的变量,

    super.f1
    

    在初始化子对象的时候,同时初始化父类的成员变量,也保证了随时能向子对象提供变量引用的能力。

    以上。

  • 相关阅读:
    【Oracle】求历史表以往记录中最接近给定时间的一批记录
    【Oracle】用check语法限制字段的输入值
    【Oracle】行转列
    【Thymeleaf】如何实现including
    【Javascript】JS dom设置元素的css样式
    MS SQL BackUp Database && Shrink DB Log && SP WHO LOCK
    PHP magic_quotes_gpc的详细使用方法
    [轉載]用PHP的ob_start();控制您的浏览器cache!
    [轉]jQuery选择器 – 属性过滤(Attribute Filters)
    [轉]CSS之自动换行
  • 原文地址:https://www.cnblogs.com/Rexxar/p/4821621.html
Copyright © 2011-2022 走看看