- 浏览: 169083 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
ooo456mmm:
正解~~~
无需安装oracle,配置plsql developer -
tjuking:
帮我解决了一大问题,thx~
vim批量修改文件 解决 非法字符: \65279 问题 -
dou85dou:
where is lz's content?
如何打造Linux下的IDE
zz from http://ig2net.info/archives/321.html
我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化 块)>构造器。我们也可以通过下面的测试代码来验证这一点:
Java代码
public class InitialOrderTest {
// 静态变量
public static String staticField = " 静态变量";
// 变量
public String field = "变量";
// 静态初始化块
static {
System.out.println(staticField);
System.out.println("静态初始化块");
}
// 初始化块
{
System.out.println(field);
System.out.println("初始 化块");
}
// 构造器
public InitialOrderTest() {
System.out.println("构造 器");
}
public static void main(String[] args) {
new InitialOrderTest();
}
}
运行以上代码,我们会得到如下的输出结果:
静态变量
静态初始化块
变量
初始化块
构造器
这与上文中说的完全符合。那么对于继承情况下又会怎样呢?我们仍然以一段测试代码来获取最终结果:
Java代码 复制代码
class Parent {
// 静态变量
public static String p_StaticField = "父类–静态变量";
// 变量
public String p_Field = "父类–变量";
// 静态初始化块
static {
System.out.println(p_StaticField);
System.out.println("父类–静态初始化块");
}
// 初始化块
{
System.out.println(p_Field);
System.out.println("父类 –初始化块");
}
// 构造器
public Parent() {
System.out.println("父类 –构造器");
}
}
public class SubClass extends Parent {
// 静态变量
public static String s_StaticField = "子类–静态变量";
// 变量
public String s_Field = "子类–变量";
// 静态初始化块
static {
System.out.println(s_StaticField);
System.out.println("子类–静态初始化块");
}
// 初始化块
{
System.out.println(s_Field);
System.out.println("子类 –初始化块");
}
// 构造器
public SubClass() {
System.out.println("子类 –构造器");
}
// 程序入口
public static void main(String[] args) {
new SubClass();
}
}
运行一下上面的代码,结果马上呈现在我们的眼前:
父类–静态变量
父类–静态初始化块
子类–静态变量
子类–静态初始化块
父类–变量
父类–初始化块
父类–构造器
子类–变量
子类–初始化块
子类–构造器
现在,结果已经不言自明了。大家可能会注意到一点,那就是,并不是父类完全初始化完毕后才进行子类的初始化,实际上子类的静态变量和静态初始化块的初始化 是在父类的变量、初始化块和构造器初始化之前就完成了。
那么对于静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢?是否静态变量总是先于静态初始化块,变量总是先于初始化块就被初始化了 呢?实际上这取决于它们在类中出现的先后顺序。我们以静态变量和静态初始化块为例来进行说明。
同样,我们还是写一个类来进行测试:
Java代码
public class TestOrder {
// 静态变量
public static TestA a = new TestA();
// 静态初始化块
static {
System.out.println("静态 初始化块");
}
// 静态变量
public static TestB b = new TestB();
public static void main(String[] args) {
new TestOrder();
}
}
class TestA {
public TestA() {
System.out.println("Test–A");
}
}
class TestB {
public TestB() {
System.out.println("Test–B");
}
}
运行上面的代码,会得到如下的结果:
Test–A
静态初始化块
Test–B
这也不要太纠结。
下面的写法会产生递归。
public class A
{
static{
a = new A("static block");
}
final static A a;
static A aa = new A("static init");
// A ma = new A("inner init");//这里在实例化变量时又实例自己的对象,递归
{
new A("inner block");//这里在实例化变量时又实例自己的对象,递归
}
public A()
{
// TODO Auto-generated constructor stub
}
public A(String i)
{
System.out.println(i);
}
public static void main(String[] args)
{
}
}
这里顺便温习一下构造函数的继承问题:
创建一个子类的对象实例的时候,必先调用父类的无参数的构造函数(默认构造函数),假如父类有带参数的构造函数,那么系统将不会给它创建无参数的构造函数,这时,子类在实例化的时候,因为找不到父类的默认构造函数,编译器将会报错,但如果在子类的构造函数中指定用父类的带参数的构造函数的时候,或者在父类中加一个无参数的构造函数,就不会报错。
我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化 块)>构造器。我们也可以通过下面的测试代码来验证这一点:
Java代码
public class InitialOrderTest {
// 静态变量
public static String staticField = " 静态变量";
// 变量
public String field = "变量";
// 静态初始化块
static {
System.out.println(staticField);
System.out.println("静态初始化块");
}
// 初始化块
{
System.out.println(field);
System.out.println("初始 化块");
}
// 构造器
public InitialOrderTest() {
System.out.println("构造 器");
}
public static void main(String[] args) {
new InitialOrderTest();
}
}
运行以上代码,我们会得到如下的输出结果:
静态变量
静态初始化块
变量
初始化块
构造器
这与上文中说的完全符合。那么对于继承情况下又会怎样呢?我们仍然以一段测试代码来获取最终结果:
Java代码 复制代码
class Parent {
// 静态变量
public static String p_StaticField = "父类–静态变量";
// 变量
public String p_Field = "父类–变量";
// 静态初始化块
static {
System.out.println(p_StaticField);
System.out.println("父类–静态初始化块");
}
// 初始化块
{
System.out.println(p_Field);
System.out.println("父类 –初始化块");
}
// 构造器
public Parent() {
System.out.println("父类 –构造器");
}
}
public class SubClass extends Parent {
// 静态变量
public static String s_StaticField = "子类–静态变量";
// 变量
public String s_Field = "子类–变量";
// 静态初始化块
static {
System.out.println(s_StaticField);
System.out.println("子类–静态初始化块");
}
// 初始化块
{
System.out.println(s_Field);
System.out.println("子类 –初始化块");
}
// 构造器
public SubClass() {
System.out.println("子类 –构造器");
}
// 程序入口
public static void main(String[] args) {
new SubClass();
}
}
运行一下上面的代码,结果马上呈现在我们的眼前:
父类–静态变量
父类–静态初始化块
子类–静态变量
子类–静态初始化块
父类–变量
父类–初始化块
父类–构造器
子类–变量
子类–初始化块
子类–构造器
现在,结果已经不言自明了。大家可能会注意到一点,那就是,并不是父类完全初始化完毕后才进行子类的初始化,实际上子类的静态变量和静态初始化块的初始化 是在父类的变量、初始化块和构造器初始化之前就完成了。
那么对于静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢?是否静态变量总是先于静态初始化块,变量总是先于初始化块就被初始化了 呢?实际上这取决于它们在类中出现的先后顺序。我们以静态变量和静态初始化块为例来进行说明。
同样,我们还是写一个类来进行测试:
Java代码
public class TestOrder {
// 静态变量
public static TestA a = new TestA();
// 静态初始化块
static {
System.out.println("静态 初始化块");
}
// 静态变量
public static TestB b = new TestB();
public static void main(String[] args) {
new TestOrder();
}
}
class TestA {
public TestA() {
System.out.println("Test–A");
}
}
class TestB {
public TestB() {
System.out.println("Test–B");
}
}
运行上面的代码,会得到如下的结果:
Test–A
静态初始化块
Test–B
这也不要太纠结。
下面的写法会产生递归。
public class A
{
static{
a = new A("static block");
}
final static A a;
static A aa = new A("static init");
// A ma = new A("inner init");//这里在实例化变量时又实例自己的对象,递归
{
new A("inner block");//这里在实例化变量时又实例自己的对象,递归
}
public A()
{
// TODO Auto-generated constructor stub
}
public A(String i)
{
System.out.println(i);
}
public static void main(String[] args)
{
}
}
这里顺便温习一下构造函数的继承问题:
创建一个子类的对象实例的时候,必先调用父类的无参数的构造函数(默认构造函数),假如父类有带参数的构造函数,那么系统将不会给它创建无参数的构造函数,这时,子类在实例化的时候,因为找不到父类的默认构造函数,编译器将会报错,但如果在子类的构造函数中指定用父类的带参数的构造函数的时候,或者在父类中加一个无参数的构造函数,就不会报错。
发表评论
-
c++与java内存模型& c++ vTable
2012-11-03 16:25 1030参见: http://stackoverflow.com/q ... -
maven pom 指南
2012-11-03 15:56 791http://maven.apache.org/pom.htm ... -
could not discover transaction status
2012-11-01 18:08 1030https://community.jboss.org/thr ... -
JSP JSF tag关系
2012-07-12 23:44 950zz from http://drewdev.blogspot ... -
class泛型反射相关API介绍
2012-06-21 10:49 881class泛型反射相关API介绍: 1. getGeneri ... -
服务提供者框架(Service provider framework)
2012-06-14 16:55 1128服务提供者框架(Service provider framew ... -
JMS的使用
2012-05-30 16:24 9671. 何时使用MQ 如果仅仅是为了达到异步调用的目的, ... -
java EE 6 中Jsf 2.0 managedBean和CDI关系
2012-05-29 15:55 2772转自 :http://stackoverflow.com/qu ... -
maven 默认编码
2012-05-28 15:59 5440maven会使用平台的默认编码,中文系统就是GBK 如果使用 ... -
Seam的事务管理
2012-05-17 17:10 1168Seam的事务管理 Seam和jsf绑定在一起,seam将j ... -
seam与jsf的结合
2012-04-10 23:02 891Seam与JSF的结合 1. 采用org.jboss.seam ... -
maven依赖之optional
2012-04-09 15:42 918http://maven.apache.org/guides/ ... -
Visualsvn+trac 0.12 配置
2012-03-13 09:54 959主要参考了: http://www.cnblogs.com/ ... -
seam 的interceptor分析
2012-03-12 10:36 10291. componet.initialInstance()的时 ... -
zzEJB sessionBean的生命周期
2012-02-29 22:18 844【译】 Stateless Session Be ... -
关于jboss 4 的JNDIVIew 名字空间
2012-02-27 18:11 1053Jboss JNDI http://do ... -
多个EJB entity jar 使用同一个 persistence.xml
2012-02-22 18:32 755可以利用 persistence.xml 的 class、ma ... -
java的ClassLoader机制
2012-02-22 16:27 872zz from :http://www.cnblogs.com ... -
关于JPA的FlushModel---Manual
2012-02-21 17:08 1728zz from : http://www.codeinstr ... -
hibernate 分页
2011-11-01 09:10 684setFirstResult 是起始数据,setMaxResu ...
相关推荐
- **Arrays.fill()**:用于填充数组,可以方便地初始化数组。 - **Collections.reverse()**:反转列表中的元素顺序。 - **Collections.sort()**:对列表进行排序,支持自定义比较规则。 - **Arrays.sort()**:对数组...
- 初始化一个空箱子列表,用于存放箱子对象。 - 根据物品列表,按体积升序排序,以便先尝试小体积物品。 3. **算法流程**: - 对于每个物品: - 遍历所有箱子,按顺序检查每个箱子是否能容纳该物品。 - 如果...
1. 初始化:创建一个空箱子列表,每个箱子具有长、宽、高的属性。 2. 对每个待装物体,计算其体积(物体的长×宽×高)。 3. 遍历箱子列表,找到第一个能容纳该物体且剩余空间最小的箱子,如果找不到,创建一个新的...
在Java中,你可以先定义一个数据类,然后创建一个LogisticRegression类,包含初始化、训练、预测等方法。训练过程中,你需要实现梯度上升法或优化算法,每次迭代更新权重。预测时,使用Sigmoid函数计算概率并根据...
3. **初始化Cipher对象**:根据密钥初始化`Cipher`对象,并设置为加密或解密模式。 4. **加密与解密操作**:通过`Cipher`对象的`doFinal()`方法完成数据的加密与解密。 #### 二、RSA(Rivest–Shamir–Adleman)...
这个问题涉及到Java中的`Calendar`类和`SimpleDateFormat`类。`Calendar`类用于处理日期和时间,当设置的日期超出了月份的天数,如2月的32日,系统会自动转到下个月的第一天,所以输出应该是3月1日,答案是B。 2. ...
`4zz`可能涉及到数组的使用,学习如何创建、初始化和遍历数组。`2zz`可能涉及条件语句和逻辑运算,讲解如何根据条件执行不同的代码块。 中级阶段的源代码将更深入,可能会涵盖异常处理、多线程、集合框架、IO流、...
### 深入Java核心:Java内存分配原理精讲 #### 一、Java内存区域概述 在Java程序运行过程中,其内存主要分为...它不仅能帮助我们更好地掌握Java语言的本质,还能有效避免因内存问题导致的性能瓶颈或系统崩溃等问题。
例如,`MainActivity.java`可能是主活动的实现,包含`onCreate()`方法用于初始化界面,以及其他回调方法如`onClick()`处理按钮点击事件。 3. **数据存储**:在zz-doctor应用中,可能涉及到数据库操作,如SQLite,...
这段代码通过一个for循环遍历1到N的整数,每次迭代时,先初始化一个空字符串`output`用于存储当前数字的输出结果。接着,我们分别检查数字是否能被3和5整除,如果满足条件则在`output`中添加相应的字符串。最后,...
- 初始化块可以用来设置初始值或执行某些初始化操作。 #### 18. 接口与抽象类 - 接口用于定义行为标准,而抽象类则提供了部分实现。 - 根据实际需求选择使用接口还是抽象类。 #### 19. 数据一致性 - 确保数据的...
通常,这个类可能会包含初始化概率数组,动态规划计算,以及回溯路径的函数。通过阅读源码,我们可以更深入地理解算法的细节,包括如何处理边界条件,优化内存使用,以及如何处理实际数据结构。不过,由于具体源码...
2. 在方法内部,初始化两个变量,`currentNumber`用于存储当前遍历到的数字子串,`longestNumber`用于存储目前为止找到的最长数字子串。 3. 使用一个循环遍历输入字符串的每个字符。 4. 对于每个字符,检查它是否为...
- **初始化**:创建一个空的优先队列用于存储待处理的路径,并将起点到自身的初始路径加入队列。 - **迭代过程**: - 从优先队列中取出当前最短路径。 - 将该路径的终点设为新的起点,探索其所有邻接顶点。 - ...
在此次实训过程中,我先是完成了FIFO、LRU、OPT、Clock四个算法的实现,之后结合Java的Swing图形化界面,将算法融入到图形化界面中,并且可以进行序列长度和运行时间的初始化,紧接着,可以将序列和物理块进行随机...
初始化列表 initGrid ; } ; window dhx globalImgPath "${ctx} images public "; 初始化列表 function initGrid { showSkyLoading "数据加载中 请稍候 " ; mygrid new ...
1. **初始化地图**: 首先需要在Activity中设置地图容器,并通过`AMap`类初始化地图,设置地图类型、比例尺等属性。 ```java MapView mapView = findViewById(R.id.map_view); mapView.onCreate(savedInstanceState)...
Objenesis则是另一个Java库,它主要用于实例化未被初始化的类,即使这些类没有无参数构造函数。在Spring框架中,Objenesis用于AOP代理的创建,特别是在CGLIB中,当需要创建一个实例而没有合适的构造函数时,...