package com.hxw.T2; public class ExtendsMemo { public static void main(String[] args) { /* * 几大原则 * 一、静态成员变量(Static) * 1、静态成员变量为类变量,所有对象共享同一内存空间 * 2、静态成员变量的声明和定义仅在首次加载类时执行一次 * 3、首次加载类时首先对所有静态成员变量根据类型默认赋初值,然后再对有右值的附右值 * 二、静态初始块 * 1、静态初始化块仅在首次加载类时执行一次 * ······多个静态成员变量与静态始化快参照出现顺序先后执行······ * 三、动态成员变量 * 1、动态成员变量定义在每次实例化对象时在构造函数之前执行 * 四、动态初始化块 * 1、动态初始化块在每次实例化对象时在构造函数之前执行 * ······多个动态成员变量与动态初始化块参照出现顺序先后执行······ * 总结:总的来说,在不涉及继承的前提下,当首次加载类时,按照如下顺序执行 * 1、按照出现顺序先后执行静态成员变量定义与静态初始化块 * 2、按照出现顺序先后执行动态成员变量定义与动态初始化块 * 3、执行构造函数 * 再次实例化对象时只执行第2、3步即可 * * ············成员变量与定义与初始化块先于构造函数执行········· * 五、当涉及到继承时,按照如下顺序执行 * 1、执行父类的静态成员变量定义与静态初始化块,执行子类的静态成员变量定义与静态初始化块 * 2、执行父类的非静态成员变量定义与动态初始化块,执行父类构造方法 * 3、执行子类的非静态成员变量定义与动态初始化块,执行子类构造方法 * 另:父类构造方法中用到的方法如果已被子类重写,那么在构造子类对象时在调用父类构造函数中使用子类重写的方法 */ int i = 0; switch(i) { case 0: new A(); new A(); break; case 1: A ab = new B(); break; case 2 : C c1 = new C(); System.out.println("c.i1 = " + c1.i1);//2 System.out.println("c.i2 = " + c1.i2);//3 break; } /* 对i=2时的解释 * 为什么是2和3呢? * 其实代码的执行顺序是这样的:在初始化c1的时候首先加载类 * 定义静态变量t1,i1,i2并赋初值null,0,0 * 然后计算右值表达式new C(),准备将此对象赋给静态成员变量c * 然而上步中静态成员变量已定义,直接执行c的构造函数即可 * 这样i1++,i2++被执行,i1,i2都变为1 * 继续执行到int i1;没有赋值语句, i1,i2的值仍然是1 * 继续执行到int i2 = 2时i2被赋值2,即i1 = 1,i2 = 2 * 继续执行到c1的构造函数,i1,i2再执行++,此时i1 = 2,i2 = 3 * 输出i1,i2,结果就是:c1.i1 = 2,c1.i2 = 3 * 通过上面的代码我们可以认为系统默认值的给予比通过等号的赋予先执行。 */ } } class A { public A() { System.out.println("construct A"); m(); System.out.println(); } private int ai = getAI(); { System.out.println("dynamic block in A"); } static { System.out.println("static block in A"); } private static int asi = getASI(); static int getASI() { System.out.println("initial static int asi"); System.out.println(); return 5; } static int getAI() { System.out.println("initial int ai"); return 10; } public void m() { System.out.println("A.m()"); } } class B extends A{ public B() { System.out.println("construct B"); super.m(); m(); } { System.out.println("dynamic block in B"); } private int bi = getBI(); private static int bsi = getBSI(); static { System.out.println("static block in B"); System.out.println(); } static int getBSI() { System.out.println("initial static int bsi"); return 5; } static int getBI() { System.out.println("initial int bi"); return 10; } public void m() { System.out.println("B.m() bi=" + bi); } } class C{ private static C c = new C(); public static int i1; public static int i2 = 2; public C(){ i1++; i2++; } }
转自:http://blog.csdn.net/shijinupc/article/details/7692315
相关推荐
动态改变FastReport内的Memo内容 Delphi 动态改变FastReport内的Memo内容 Delphi
动态改变FastReport内的Memo内容
动态改变FastReprot内Memo的内容
动态设置Memo控件边框的大小,Delphi代码..rar
MEMO控件MEMO控件
FastReport3.0 以后版本动态改变Memo实用例子.
Java的学习总结,看完对初学者,也包括第一次接触java的人很有帮助
Delphi 7.0 获取Memo控件中字符的可见行数,没讲 时在Memo控件中随便粘贴入一些字符,单击窗口中的“检测可见行数”按钮,即可得到该文本框控件中字符的行数,将这一系列执行命令集成在delphi的按钮监听事件中,编写...
function SearchMemo(Memo: TCustomEdit; const SearchString: string; Options: TFindOptions): Boolean; var Buffer, P: PChar; Size: Word; begin Result := False; if Length(SearchString) = 0 then ...
在程序运行时,控制打印输出时的内容。
MyMemo
谁能帮我看看怎么样过滤MEMO字段吗?试验的是ACCESS,实际是SQLITE
封装了大数据DBF的读取、写入,并附有所使用javadbf.jar文件
向fastreport报表传递变量总是不成功,利用网上的信息,一个一个地试,弄了个通宵都没有成功,后来终于成功了,利用delphi的表单中的edit,向fastreport报表传递变量终于成功。与大家一起分享。 fastreport做报表画...
在memo中实现文字颜色设定,关键词高亮显示
Delphi7中Memo组件实现查找替换功能
Memo控件的使用方法和详解,比较全面的解释
一个用纯QT开发的备忘录小...支持插入或拖入静态或动态图并实时动态显示,支持设备备忘中的字体大小、颜色、背景色等,支持隐藏到托盘,支持快捷键唤醒,支持自动保存设置,自带屏幕截屏。。。更多功能等着你来发现~
Delphi 动态设置Memo控件边框的大小源代码,改变Memo组件的边框空隙,程序通过获取Memo1的矩形边界,更改Rect边界值,重绘Memo1的矩形边界。其效果类似CSS中的Padding,也就是区块边缘与正文边距之间的空隙。本代码...