- 浏览: 164506 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 928参见: http://stackoverflow.com/q ... -
maven pom 指南
2012-11-03 15:56 729http://maven.apache.org/pom.htm ... -
could not discover transaction status
2012-11-01 18:08 992https://community.jboss.org/thr ... -
JSP JSF tag关系
2012-07-12 23:44 916zz from http://drewdev.blogspot ... -
class泛型反射相关API介绍
2012-06-21 10:49 836class泛型反射相关API介绍: 1. getGeneri ... -
服务提供者框架(Service provider framework)
2012-06-14 16:55 1097服务提供者框架(Service provider framew ... -
JMS的使用
2012-05-30 16:24 9301. 何时使用MQ 如果仅仅是为了达到异步调用的目的, ... -
java EE 6 中Jsf 2.0 managedBean和CDI关系
2012-05-29 15:55 2722转自 :http://stackoverflow.com/qu ... -
maven 默认编码
2012-05-28 15:59 5394maven会使用平台的默认编码,中文系统就是GBK 如果使用 ... -
Seam的事务管理
2012-05-17 17:10 1106Seam的事务管理 Seam和jsf绑定在一起,seam将j ... -
seam与jsf的结合
2012-04-10 23:02 844Seam与JSF的结合 1. 采用org.jboss.seam ... -
maven依赖之optional
2012-04-09 15:42 856http://maven.apache.org/guides/ ... -
Visualsvn+trac 0.12 配置
2012-03-13 09:54 898主要参考了: http://www.cnblogs.com/ ... -
seam 的interceptor分析
2012-03-12 10:36 9921. componet.initialInstance()的时 ... -
zzEJB sessionBean的生命周期
2012-02-29 22:18 804【译】 Stateless Session Be ... -
关于jboss 4 的JNDIVIew 名字空间
2012-02-27 18:11 993Jboss JNDI http://do ... -
多个EJB entity jar 使用同一个 persistence.xml
2012-02-22 18:32 710可以利用 persistence.xml 的 class、ma ... -
java的ClassLoader机制
2012-02-22 16:27 838zz from :http://www.cnblogs.com ... -
关于JPA的FlushModel---Manual
2012-02-21 17:08 1680zz from : http://www.codeinstr ... -
hibernate 分页
2011-11-01 09:10 641setFirstResult 是起始数据,setMaxResu ...
相关推荐
base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz
关于java的笔试题,大家共享。阿里巴巴java笔试,希望对大家有用。
可以通过脚本进行服务器的初始化、挂载磁盘、安装常用软件等等
总结Java标准类库的容器类; 容器类库是你每天都会用到的工具,它能使程序更简介,更强大并且更搞笑。
NULL 博文链接:https://greatwqs.iteye.com/blog/2429185
Java牌类小游戏24点,联机,仅供初学者的参考与学习。
ZZ-2022006 建筑智能化系统安装与调试赛项赛题. 中职赛项 适合正在准备技能大赛的人群
聊天工具的java开发 超越QQ 天翔ZZ,有两个压缩包,一个是服务器程序,另一个是客户端程序.真的不错的哦~~~
俄罗斯方块JAVA源代码,可自定义按键,彩色方块
ZZ561401.CAB ZZ561401.CAB ZZ561401.CAB
利用Best Fit启发式算法,解决3D物体装箱问题,Java实现,用最少的箱子装规定的物体,解决物流问题
利用First Fit启发式算法,解决3D物体装箱问题,Java实现,用最少的箱子装规定的物体,解决物流问题
自己写的解决凸包问题的代码,还具备界面。
wincc SIMATIC WinCC是第一个使用最新的32位技术的过程监视系统,具有良好的开放性和灵活性。 从面市伊始,用户就对SIMATIC WinCC印象深刻。
当程序运行的时候,JVM把程序初始化的所有对象置于堆上;而每个线程创建的时候,都会拥有自己的程序计数器和 Java栈,其中程序计数器中的值指向下一条即将被执行的指令,线程的Java栈则存储为该线程调用Java方法的...
java面试笔试题大汇总[zz] JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是...
我们研究了四轻子最终状态ℓ+ℓ-ℓ+ℓ-的产生,这些状态主要由一对弱电Z玻色子ZZ产生。 使用LoopSim方法,我们合并ZZ和ZZ + jet的NLO QCD结果,并获得ZZ产生的近似NNLO预测。 还包括对ZZ过程的精确胶子融合环平方的...
嗡嗡声一个用多种方法实现的简单 FizzBuzz Java 程序。
JAVA源码用Java加密类实现DES、RSA及SHA的加密算法提取方式是百度网盘分享地址
在CAD中想要快速测量长度,在CAD工具栏找到加载应用程序,再点击加载 加载成功后在输入栏输入“zz”(不分大小写)在选择你需要测量的线段即可。