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.
------------------------------------------------------------------------
上面说的很模糊,或者说错了,如果有人理解更深入的麻烦补充或者纠正。谢谢!
分享到:
相关推荐
在`C`类的`main`方法中,创建第二个`B`类实例时,由于静态代码块只执行一次,所以不会再输出1和"a",而是直接执行`B`类构造器两次,输出两次"b"。因此,完整的输出结果为:1a2b2b。 接着,我们来看构造方法的执行...
java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...
静态代码块与实例代码块(非静态代码块)的主要区别在于它们的执行时机以及作用范围。 - **执行时机**:静态代码块在类加载时执行,而实例代码块则是在创建对象时执行。 - **作用范围**:静态代码块作用于整个类的...
非静态代码块在构造器之前执行,如果类中有多个非静态代码块,也会按源码顺序依次执行。 例如,以下代码展示了不同类型的代码块: ```java class Person { String name; int age; // 静态代码块 static { ...
- 主方法`main`中创建了一个`TestStaticCon`对象,展示了类加载和对象创建的顺序:静态代码块 -> 非静态代码块 -> 构造器。 4. **网友提供的代码示例:** 类`StaticBlock`的执行顺序展示了静态代码块和构造块的...
如果在构造器或初始化块中依赖其他静态或非静态成员,必须确保这些成员在需要之前已经被正确初始化。否则,可能会导致程序运行时错误或者逻辑错误。 此外,静态初始化块只在类加载时执行一次,而初始化块(也称为...
它们的执行顺序早于非静态代码块(即构造器代码块)和实例初始化块,也早于任何构造方法。 静态代码块的格式如下: ```java public class ClassName { static { // 静态代码块的内容 } } ``` 在给出的例子中:...
6. 随后,执行App的静态代码块,输出App static。 7. 最后,执行public类的入口方法main,输出App main。 通过上面的实例,我们可以了解Java中代码的加载顺序。了解Java中代码的加载顺序对于编写高质量的Java代码...
在这个方法中返回 `"###"`,因此在静态代码块执行后,控制台输出 `"###"`。 4. **初始化顺序**:根据上述分析,可以得出以下初始化顺序: - 静态变量 `a` 的初始化(输出 `"sss"`) - 执行 `Test` 类的静态代码块...
总之,类的初始化顺序是:静态成员 -> 静态初始化块 -> 非静态成员 -> 非静态初始化块 -> 构造器。这个顺序同样适用于继承关系,只是会先初始化父类的部分,再初始化子类的部分。掌握这一知识能帮助程序员更好地设计...
3. **父类的非静态部分**:在创建子类实例时,首先执行父类的非静态变量初始化和非静态初始化块,然后调用父类的构造器。 4. **子类的非静态部分**:最后执行子类的非静态变量初始化和非静态初始化块,以及子类的...
构造方法主要用于初始化类的新实例,而普通方法则是完成特定任务的代码块。 构造方法的关键特性包括: 1. **名称匹配**:构造方法必须与定义它的类的名称完全相同,不包括任何返回类型。 2. **无返回类型**:构造...
静态初始化通过`static`关键字标记,可以用于声明静态变量、静态方法或静态代码块。 #### 二、静态初始化的过程 1. **静态初始化的时机**: - 当类首次被加载到JVM中时。 - 当第一次访问该类的静态成员(字段或...
showMain.java 演示main方法访问本类成员 showMethod.java 演示如何定义一个方法体 showReturn_1.java return语句示例1 showReturn_2.java return语句示例2 showStaicVar.java 演示静态变量的使用 staticBlock...
- **非静态变量与非静态初始化块**:当类的新实例被创建时,这些部分将按其在类中出现的顺序依次执行。 - **构造器**:用于创建类的实例,通常位于初始化过程的最后一步。 接下来,我们通过具体的例子进一步解释...
按照默认情况,这些部分的执行顺序为:静态变量 > 静态初始化块 > 非静态变量 > 非静态初始化块 > 构造器。 #### 示例代码分析 为了更直观地理解这一过程,我们可以参考以下示例代码: ```java public class ...
在`Person`类中,非静态块和非静态属性`b1`、`b2`会按照它们在类中的顺序执行,然后调用父类构造器`Person()`。 4. **构造器**: - **父类构造器**:父类构造器负责设置父类的非静态属性的初始值,如`Person`类的...
这表明了类初始化的基本顺序:静态变量和静态初始化块优先于非静态成员变量和初始化块执行,而后者又优先于构造器执行。 #### 继承情况下的初始化顺序 当涉及继承时,初始化顺序会有所变化。假设有一个父类`Parent...
首先执行的是静态变量和静态初始化块,之后是非静态变量、非静态初始化块和构造器。具体来说,初始化顺序可以总结为以下几点: 1. **静态变量**:类加载时最先被初始化。 2. **静态初始化块**:紧跟在静态变量之后...
- **非静态成员与非静态初始化块**:之后是对类中非静态成员变量的赋值及非静态初始化块的执行。 - **构造函数**:最后是构造函数的调用,完成对象实例化的最后一步。 **2. 示例验证** 为了更直观地理解这一过程,...