package com.constructor.test;
class Parent {
int pm1;
int pm2 = 100;
int pm3 = pmethod();
{
System.out.println("Parent's instance initialize block");
}
public static int spm1 = 200;
public static int spmethod = spmethod();
static {
System.out.println("Parent's static initialize block");
}
Parent() {
System.out.println("Parent's default constructor");
}
Parent(int i,int j)
{
//无用this();就不会调用默认的构造器
System.out.println("two 参数的parent构造器");
}
static void staticmethod() {
System.out.println("Parent's staticmethod");
}
int pmethod() {
System.out.println("Parent's method");
return 3;
}
static int spmethod()
{
System.out.println("parent's static field and static method give it the value");
return 88;
}
}
class Child extends Parent {
int cm1;
int cm2 = 1000;
int cm3 = cmethod();
Other co;
static Other co2;
public static int cmethod = scmethod();
public static int scm1 = 2000;
{
System.out.println("Child's instance initialize block");
}
static {
co2 = new Other();
cmethod2(); // 要static的方法才行
System.out.println("Child's static initialize block");
}
{
System.out.println("Child's instance initialize block 2222");
}
Child() {
co = new Other();
System.out.println("Child's default constructor");
}
Child(int m) {
this(); //如果无this就不会调会默认的构造器Child()
cm1 = m;
System.out.println("Child's self-define constructor");
}
static void staticmethod() {
System.out.println("Child's staticmethod");
}
int cmethod() {
System.out.println("Child's method");
return 3;
}
static void cmethod2() {
System.out.println("Child's method2!!!");
}
static int scmethod()
{
System.out.println("child's static field and static method give it the value");
return 888;
}
}
class Other {
int om1;
Other() {
System.out.println("Other's default constructor");
}
}
public class TestConstructor {
public static void main(String args[]) {
Child c;
System.out.println("program start");
System.out.println("Child.scm1=" + Child.scm1);
// System.out.println("c.cm3="+c.pm2); pm2还未被初始化!
c = new Child(10);
System.out.println("program end");
System.out.println();
System.out.println("second instance begin");
Child d = new Child(20);
System.out.println("sencond instance end");
//Child e = new Child(10,12); //没有声明Child(int,int)的构构器,不能通过编译
Parent e = new Parent(10,12);
}
}
program start
parent's static field and static method give it the value
Parent's static initialize block
child's static field and static method give it the value
Other's default constructor
Child's method2!!!
Child's static initialize block
Child.scm1=2000
Parent's method
Parent's instance initialize block
Parent's default constructor
Child's method
Child's instance initialize block
Child's instance initialize block 2222
Other's default constructor
Child's default constructor
Child's self-define constructor
program end
second instance begin
Parent's method
Parent's instance initialize block
Parent's default constructor
Child's method
Child's instance initialize block
Child's instance initialize block 2222
Other's default constructor
Child's default constructor
Child's self-define constructor
sencond instance end
Parent's method
Parent's instance initialize block
two 参数的parent构造器
从代码可以看到,对象的构造分为
类的构造和
实例的构造两部分.
类的构造是在类的静态属性,方法调用之前完成的.System.out.println("Child.scm1=" + Child.scm1);之前就会完成类的静态属性和方法和块.
实例的构造是在new 构造方法时开始做的,Child d = new Child(20);.
构造的详细顺序如下:
类构造 (只做一次的,不论你new了多少个对象)
1.父类的static 属性(field)
2.父类的static块(block)
3.子类的static field
4.子类的static block
实例构造 (new一次做一次)
1.实例父类的field (非static)
2.实例父类的初始化block (非static,是用{}括起来的那些)
3.实例父类的默认构造器 (默认构造器是类名()这个)
4.实例子类(这个类)的field
5.实例子类(这个类)的初始化block
6.实例子类(这个类)的默认构造器 /no 应该是new的那一个构造器,见Parent e = new Parent(10,12);
(1)属性的构造顺序是按顺序的,先出现先构造.
(2)块的构造顺序是也是按顺序的,先出现先构造.
(3)如果块中,或方法中有new X类();的,就会调用X类的构造器.
(4)final不能用来声明构造方法.
分享到:
相关推荐
"Java 对象初始化顺序学习指南" 在学习 Java 编程语言时,对象初始化顺序是一个非常重要的知识点,但是许多学生却感到困惑和困难。事实上,Java 对象初始化顺序并不难理解,只需要掌握“礼让”原则和 JVM 的执行...
在Java编程语言中,构造函数(Constructor)是用于初始化新创建的对象的关键组成部分。默认情况下,构造函数的访问级别设置为`public`,以便其他类能够通过这个构造函数实例化对象。然而,在某些特定场景下,将构造...
在深入探讨Java类的完整构造执行顺序之前,我们先来明确一下Java中构造函数与类初始化的基本概念。构造函数在创建对象时被调用,用于初始化该对象的状态。而类初始化则是指在类首次被使用时,JVM执行的一系列初始化...
通过对上述练习题的分析,我们可以加深对Java面向对象编程中类和对象、实例变量、方法重载、构造方法、引用和this关键字的理解和应用。这些知识点对于日后进一步学习面向对象的高级特性,比如继承和多态,打下了坚实...
8.java构造函数.zip8.java构造函数.zip8.java构造函数.zip8.java构造函数.zip8.java构造函数.zip8.java构造函数.zip8.java构造函数.zip8.java构造函数.zip8.java构造函数.zip8.java构造函数.zip8.java构造函数.zip8....
### Java:构造函数与对象 #### 第一章:构造函数揭秘——创造者的第一次触碰 在Java编程语言中,构造函数扮演着极其重要的角色。它是一种特殊的成员方法,主要用于对象的初始化过程。构造函数没有返回类型,其...
构造方法是Java中一种特殊的方法,主要用于初始化新创建的对象。每个类至少有一个构造方法。如果程序员没有显式地定义构造方法,Java编译器会自动为类添加一个无参的默认构造方法。构造方法的名字必须与类名完全相同...
在IT领域,特别是Java编程中,对象数组与JSON之间的转换是一项常见且重要的操作。下面将深入探讨如何在Java中实现对象数组向JSON的转换,并反过来将JSON字符串转换为Java对象数组,同时也会提及一些相关技术和代码...
Java面向对象编程练习题 本资源摘要信息涵盖了 Java 面向对象...本资源摘要信息展示了 Java 面向对象编程的基础知识,涵盖了类的成员变量、方法、构造方法等概念,为学习 Java 编程语言的基础知识提供了有价值的参考。
- **静态构造器不存在**:Java中没有静态构造器的概念,所有构造器都用于创建对象实例。 #### 七、示例代码解析 在提供的部分代码中,可以看到如下示例: ```java public class Platypus extends Mammal { String...
下面是关于JAVA类和对象及数组的习题,涵盖了构造方法、继承、多重继承、变量声明、数组初始化等方面的知识点。 1. 构造方法的调用方式: 构造方法是类的特殊方法,用于初始化对象的状态。调用构造方法的方式有很多...
本示例将详细介绍如何对Java对象属性Map进行排序。 首先,了解Map的基本类型。Java提供了HashMap、TreeMap等实现Map接口的类。HashMap是非排序的,而TreeMap是基于红黑树数据结构,会按照键的自然顺序或者自定义...
总的来说,Java中带有不同构造方法的程序内存分析涉及构造方法的选择、内存的分配(包括栈和堆)、对象的初始化以及垃圾回收机制的理解。通过深入研究这些概念,开发者可以更好地控制和优化程序的内存使用,提高程序...
Java对象的初始化顺序是一个关键的编程概念,它涉及到类加载、静态初始化、实例初始化等多个步骤。下面我们将详细探讨这些步骤。 首先,当程序运行并创建一个新的对象时,JVM(Java虚拟机)会按照特定的顺序来初始...
- 默认构造方法:如果没有显式定义任何构造方法,Java编译器将自动提供一个默认构造方法。 - 显式构造方法:可以通过定义一个或多个构造方法来自定义对象的初始化方式。 ```java public class Student { private ...
在Java中,对象的创建主要包括定义对象变量和构造对象两个步骤,而构造对象的过程又分为为对象分配内存和初始化对象两个阶段。 ##### 3.1 定义对象变量 定义对象变量实际上就是定义一个指向对象的引用,例如: ```...