`
zzzzzz5530041
  • 浏览: 34840 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

JAVA静态代码块,非静态代码块,构造器,main方法执行顺序

阅读更多
package java.oop;
public class Customer extends Person{

	static Name name = new Name("Tom");
 
	static{
		Screen.print("2", "Customer static init block!");
	}

	{
		Screen.print("3", "Customer instance init block!");
	}

	Customer(){
		Screen.print("4", "Customer instance constructor!");
	}

	public static void main(String[] args){
		Screen.print("1", "Customer Initial Test!");
		Person p = new Customer();
	}
	
} 
class Person{

	private Name name = new Name();

	static{
		Screen.print("5", "Person static init block!");
	}

	Person(){
		Screen.print("6", "Person instance constructor!");
	}

	{
		Screen.print("7", "Person instance init block!");
	}

}
class Name{
	
	Name(){
		Screen.print("8", "Name instance constructor!");
	}

	Name(String value){
		Screen.print("9", "Name instance constructor with: " + value);
	}

}

class Screen{
	static void print(String sn, String msg){
		System.out.println("P["+sn+"] - " + msg);
	}
}
 



上面这段代码是关于OOP构造器的一个测试,打印出执行顺序。
不卖关子了  答案   5 9 2 1 8 7 6 3 4。
解释一下:
1、 Customer继承了Person,这时会执行Person的代码,因为在Person里有静态代码库 于是 打印 5 .

2、然后跟着会执行 静态代码块
static Name name = new Name("Tom");
因为在这里创建了一个Name对象并且是带参数的构造器 因此将会打印 9.
3、继续往下 执行
static{
		Screen.print("2", "Customer static init block!");
	}

4、上面的执行完毕后才会去执行main方法。
Screen.print("1", "Customer Initial Test!");

5、往下走 会有
Person p = new Customer();
先创建一个Person的引用,但是他会先创建Name对象是没有参数的,于是 打印8
6、 因为Customer是继承Person的,因此得先创建Person对象,但Person有非静态代码块
{
		Screen.print("7", "Person instance init block!");
	}
我们可以把它当做是类的成员属性来理解.每次创建对象的时候都会执行一遍是属于成员变量 ,因此  7、6

7、最后 有非静态代码块 
 {
		Screen.print("3", "Customer instance init block!");
	}

7、最后 对象创建完成  打印4.


------------------------------------------------------------------------
上面说的很模糊,或者说错了,如果有人理解更深入的麻烦补充或者纠正。谢谢!
2
0
分享到:
评论

相关推荐

    java中静态代码块与构造方法的执行顺序判断

    在`C`类的`main`方法中,创建第二个`B`类实例时,由于静态代码块只执行一次,所以不会再输出1和"a",而是直接执行`B`类构造器两次,输出两次"b"。因此,完整的输出结果为:1a2b2b。 接着,我们来看构造方法的执行...

    java 静态非静态 字段方法 子类父类构造_初始化顺序!

    java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...

    静态代码块

    静态代码块与实例代码块(非静态代码块)的主要区别在于它们的执行时机以及作用范围。 - **执行时机**:静态代码块在类加载时执行,而实例代码块则是在创建对象时执行。 - **作用范围**:静态代码块作用于整个类的...

    Java面向对象(高级)- 类的成员之四:代码块

    非静态代码块在构造器之前执行,如果类中有多个非静态代码块,也会按源码顺序依次执行。 例如,以下代码展示了不同类型的代码块: ```java class Person { String name; int age; // 静态代码块 static { ...

    Java中的static静态代码块的使用详解

    - 主方法`main`中创建了一个`TestStaticCon`对象,展示了类加载和对象创建的顺序:静态代码块 -> 非静态代码块 -> 构造器。 4. **网友提供的代码示例:** 类`StaticBlock`的执行顺序展示了静态代码块和构造块的...

    java面试题-类的初始化顺序.doc

    如果在构造器或初始化块中依赖其他静态或非静态成员,必须确保这些成员在需要之前已经被正确初始化。否则,可能会导致程序运行时错误或者逻辑错误。 此外,静态初始化块只在类加载时执行一次,而初始化块(也称为...

    java 四种关系修饰符访问(csdn)————程序.pdf

    它们的执行顺序早于非静态代码块(即构造器代码块)和实例初始化块,也早于任何构造方法。 静态代码块的格式如下: ```java public class ClassName { static { // 静态代码块的内容 } } ``` 在给出的例子中:...

    实例解析JAVA中代码的加载顺序

    6. 随后,执行App的静态代码块,输出App static。 7. 最后,执行public类的入口方法main,输出App main。 通过上面的实例,我们可以了解Java中代码的加载顺序。了解Java中代码的加载顺序对于编写高质量的Java代码...

    java程序员经典笔试面试题汇总

    在这个方法中返回 `"###"`,因此在静态代码块执行后,控制台输出 `"###"`。 4. **初始化顺序**:根据上述分析,可以得出以下初始化顺序: - 静态变量 `a` 的初始化(输出 `"sss"`) - 执行 `Test` 类的静态代码块...

    JAVA类的初始化顺序文.pdf

    总之,类的初始化顺序是:静态成员 -> 静态初始化块 -> 非静态成员 -> 非静态初始化块 -> 构造器。这个顺序同样适用于继承关系,只是会先初始化父类的部分,再初始化子类的部分。掌握这一知识能帮助程序员更好地设计...

    JAVA面试题解惑系列类的初始化顺序JAVA程序员JAVA工程师面试必看.pdf

    3. **父类的非静态部分**:在创建子类实例时,首先执行父类的非静态变量初始化和非静态初始化块,然后调用父类的构造器。 4. **子类的非静态部分**:最后执行子类的非静态变量初始化和非静态初始化块,以及子类的...

    java中构造方法和方法全面解析.pdf

    构造方法主要用于初始化类的新实例,而普通方法则是完成特定任务的代码块。 构造方法的关键特性包括: 1. **名称匹配**:构造方法必须与定义它的类的名称完全相同,不包括任何返回类型。 2. **无返回类型**:构造...

    学习java静态数据初始化.doc

    静态初始化通过`static`关键字标记,可以用于声明静态变量、静态方法或静态代码块。 #### 二、静态初始化的过程 1. **静态初始化的时机**: - 当类首次被加载到JVM中时。 - 当第一次访问该类的静态成员(字段或...

    Java开发技术大全(500个源代码).

    showMain.java 演示main方法访问本类成员 showMethod.java 演示如何定义一个方法体 showReturn_1.java return语句示例1 showReturn_2.java return语句示例2 showStaicVar.java 演示静态变量的使用 staticBlock...

    Java面试题解惑系列

    - **非静态变量与非静态初始化块**:当类的新实例被创建时,这些部分将按其在类中出现的顺序依次执行。 - **构造器**:用于创建类的实例,通常位于初始化过程的最后一步。 接下来,我们通过具体的例子进一步解释...

    java面试解惑系列

    按照默认情况,这些部分的执行顺序为:静态变量 > 静态初始化块 > 非静态变量 > 非静态初始化块 > 构造器。 #### 示例代码分析 为了更直观地理解这一过程,我们可以参考以下示例代码: ```java public class ...

    对象初始化流程梳理对象初始化流程梳理

    在`Person`类中,非静态块和非静态属性`b1`、`b2`会按照它们在类中的顺序执行,然后调用父类构造器`Person()`。 4. **构造器**: - **父类构造器**:父类构造器负责设置父类的非静态属性的初始值,如`Person`类的...

    JAVA面试题解惑大全

    这表明了类初始化的基本顺序:静态变量和静态初始化块优先于非静态成员变量和初始化块执行,而后者又优先于构造器执行。 #### 继承情况下的初始化顺序 当涉及继承时,初始化顺序会有所变化。假设有一个父类`Parent...

    JAVA面试题解惑系列

    首先执行的是静态变量和静态初始化块,之后是非静态变量、非静态初始化块和构造器。具体来说,初始化顺序可以总结为以下几点: 1. **静态变量**:类加载时最先被初始化。 2. **静态初始化块**:紧跟在静态变量之后...

    JAVA语言面试宝典.doc

    - **非静态成员与非静态初始化块**:之后是对类中非静态成员变量的赋值及非静态初始化块的执行。 - **构造函数**:最后是构造函数的调用,完成对象实例化的最后一步。 **2. 示例验证** 为了更直观地理解这一过程,...

Global site tag (gtag.js) - Google Analytics