初始化时内存清零
当创建一个对象时,首先将在堆上为这个对象分配足够的空间,这块空间会被清零,即基本类型数据都设置成了缺省值,即数字为0,布尔型为false,字符为空白字符(是一个字符,但不是null),引用设置成null。
public abstract class P { //在构建子类时先调用父类构造函数 public P() { //调用子类的方法 f(); } public abstract void f(); } class S extends P { int integer = 11; double decimal = 0.1; boolean bool = true; char character = 'a'; String str = "str"; public S() { print("子类构造函数调用前"); } public void f() { print("子类构造函数调用中"); } private void print(String msg) { System.out.println(msg + " integer=" + integer + " decimal=" + decimal + " bool=" + bool + " character=" + (int) character + "(" + character + ")" + " str=" + str); } public static void main(String[] args) { new S(); } /* * output: * 子类构造函数调用中 integer=0 decimal=0.0 bool=false character=0() str=null * 子类构造函数调用前 integer=11 decimal=0.1 bool=true character=97(a) str=str */ }
初始化顺序
在一个类里,属性初始化的顺序是由属性在类内的定义顺序决定的。即使属性定义大量遍布于方法定义的中间,这些属性仍会在调用任何方法之前得到初始化——甚至在构造函数调用之前,如:
class Tag { Tag(int marker) { System.out.println("Tag(" + marker + ")"); } } class Card { Tag t1 = new Tag(1); // 定义在构造函数前 Card() { System.out.println("Card()"); t3 = new Tag(4); // 重新初使化t3 } Tag t2 = new Tag(2); // 定义在构造函数后 void f() { System.out.println("f()"); } Tag t3 = new Tag(3); // 最后 } public class MainTest { public static void main(String[] args) { Card t = new Card(); t.f(); } /* output: Tag(1) Tag(2) Tag(3) Card() Tag(4) f() */ }
但要注意的是,属性之间的引用初始化时,被引用的属性一要在先于引用属性的定义,如:
public class A { private int g(int ii) { /* * 此输入i语句在调用的方法定义在属性变量定义前是可以的,因为属性的 * 初始化一定在调用前完成 */ System.out.println(i); return 1; } int i = f(); /* * 注:这一行调用一定要放在i定义后,不然编译时出错,因为引用前一定要先 * 定义 */ int j = g(i); private int f() { return 0; } }
注:上面讲的是非静态属性,静态属性也一样,比如将上面的i与j都是定义成静态时与面上规则是一样;但是如果i是静态j为非静态时,静态属性i是可以在引用它的非静态j后面定义的,因为静态属性要先于非静态属性初始(静态与非静态属性混合定义时先初始化静态的,再初始化非静态,后面还进一步讨论);当然不可能j是静态的,而i是非静态的,因为静态的方法或属性不能引用非静态的方法或属性。
上面讨论了非静态属性初始化顺序,下面来看看静态与非静态属行、静态与非静态块还有构造函数一起时初始化顺序:
class P { int i = 9; int j; { System.out.println("P's block"); } int y = prt("P.y initialized"); P() { System.out.println("P()"); prt("i = " + i + ", j = " + j); j = 39; } static { System.out.println("P's static block"); } static int x1 = prt("static P.x1 initialized"); static int prt(String s) { System.out.println(s); return 47; } } public class S extends P { int k = prt("S.k initialized"); { System.out.println("S's block"); } S() { System.out.println("S()"); prt("k = " + k); prt("j = " + j); } static int x2 = prt("static S.x2 initialized"); static { System.out.println("S's static block"); } static int prt(String s) { System.out.println(s); return 63; } public static void main(String[] args) { new S();//①如果注释掉此句,还是会输出下面结果中的前四行 } /* output: P's static block static P.x1 initialized static S.x2 initialized S's static block P's block P.y initialized P() i = 9, j = 0 S.k initialized S's block S() k = 63 j = 39 */ }
最来后总结一下类的初始化顺序:
父类静态属性(块)初始化->子类静态属性(块)初始化->对象内存清零->父类非静态属性(块)初始化->父类构造函数->子类非静态属性(块)初始化->子类构造函数
注,静态属性与静态块的初始化顺序是按定义的先后顺序初始化,即静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的;非静态属性与非静态块的初始化也是这样。
相关推荐
初始化和清理.ppt初始化和清理.ppt初始化和清理.ppt初始化和清理.ppt初始化和清理.ppt初始化和清理.ppt
java编程思想-初始化与清理了解this之后,你就能更全面地理解“静态(static)方法”的含义。静态方法就是没有this的方法。在“静态方法”的内部不能调用“非静态方法”,反过来倒是可以的。而且你可以在没有创建...
Java 的初始化问题和其他高级语言类似。一个明显不一样的地方是体现在它的类加 载过程。传统的编程语言包括C++等,...Sun 公司说类初始化的时机是“initialize on first actice use”, (在首次主动使用时初始 化)。
Java编程思想初始化与清理PPT教案学习.pptx
Java编程思想第05章初始化与清理.ppt
第4章 初始化和清理.ppt安徽工业大学博士生 课件
winform NUNIT的测试初始化和清理! 很值得下载看看!资源免费,大家分享!!
PremiereProCS3初始化清理工具清理视频合成过程中所有记录
NULL 博文链接:https://listen-raining.iteye.com/blog/1887594
主要介绍了Java的初始化与清理,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
纯虚函数和抽象类;构造函数的分类及调用;构造函数和析构函数;继承;静态成员;拷贝构造函数调用;虚析构和纯虚析构;友元;运算符重载;多态及多态的三个案例:计算器类、制作饮品、电脑组装。
初始化 2.清理 1.初始化 虽然自己的Java基础还是比较良好的..但是在解读编程思想的时候还是发现了许多的细节问题自己并没有完全的掌握.既然是研磨,那么应该更加的细致. i.构造方法的重载. 首先说明...
} 如果要将变量赋值为对象,那么只能在构造器中进行初始化,例如: class A { private $child; public function __construct() { $this->child = new B(); } } 但是php中并没有一个类似java中的静态构造器/静态块的...
adobe安装清理程序,清理注册表,非常好用的,适用于adobe的各种软件安装前的清理。
Windows7区域图标清理器相信大家看到标题 都知道这个...区域图标清理工具将会为您轻松完成清理工作,简单方便,绿色实用点击[想要清理]释放[开始清理]并单击便会自动进行历史记录的清理,还通知区域图标初始化状态…
初始化和清理 操作符与控制程序流 初始化与清理 - 涉及程序安全 构造器使用与初始化 方法重载 this关键字 终结处理与垃圾回收 初始化:成员、构造器、数组
理光 MP C2004SP 2504SP 维修手册,英文版的,不知道有没有需要。理光 MP C2004SP 2504SP 维修手册,英文版的,不知道有没有需要。
清理adboe的软件。以前电脑用过无法初始化可以使用的软件。
系统运维过程中,常遇到客户问一些常识性的问题,因为问题虽简单但客户因年龄等问题对计算机信息化认识水平欠缺,本人总结了些浅显但常见的问题
京瓷FS一1025MFP更换硒鼓、显影仓、废粉清理