`
yangwn
  • 浏览: 77074 次
  • 性别: Icon_minigender_2
  • 来自: 大连
社区版块
存档分类
最新评论
  • icewubin: kimmking 写道icewubin 写道Dollyn 写道 ...
    Java
  • kimmking: icewubin 写道Dollyn 写道我十分怀疑最后一条,很 ...
    Java
  • beneo: 完全忽略了一個好的JVM的優化能力 難道java是C編譯器么 ...
    Java
  • icewubin: Dollyn 写道我十分怀疑最后一条,很多编译器都会自动做类似 ...
    Java
  • Dollyn: 我十分怀疑最后一条,很多编译器都会自动做类似优化吧(不知道JD ...
    Java

java中的构造方法的深入了解

    博客分类:
  • JAVA
阅读更多

很长时间对与构造方法没有很深的认识,但看过一篇介绍他的文章后感觉恍然大悟,故而把文章整理了一下收藏至此。

类的继承机制使得子类可以使用父类的功能(即代码),并且子类也具有父类的类型。下面介绍类在继承关系上的初始化的顺序问题。
示例1: 
class SuperClass
{
SuperClass()
{
System.out.println("SuperClass constructor");
}
}
public class SubClass extends SuperClass
{
SubClass()
{
System.out.println("SubClass constructor");
}
public static void main(String[] args)
{
SubClass sub = new SubClass();
}
}
输出结果: SuperClass
constructor
SubClass constructor
  在子类中只实例化了一个子类对象。从输出结果上看,程序并不是一开始就运行自己的构造方法,而是先运行其父类的默认构造方法。注意:程序自动调用其父类的默认构造方法。
 示例2:
class SuperClass
{
SuperClass(String str)
{
System.out.println("Super with a string.");
}
}
public class SubClass extends SuperClass
{
SubClass(String str)
{
System.out.println("Sub with a string.");
}
public static void main(String[] args)
{
SubClass sub = new SubClass("sub");
}
}
  在JDK下编译此程序不能成功。正如上例中说的:程序在初始化子类时先要寻找其父类的默认构造方法,结果没找到,那么编译自然不能通过。

  解决这个问题有两个办法:

  1.在父类中增加一个默认构造方法。
  2.在子类的构造方法中增加一条语句:super(str); 且必须在第一句。

  这两种方法都能使此程序通过编译,但就本程序来说运行结果却不相同。

  第1种方法的运行结果是:

  Sub with a string.

  第2种方法的运行结果是:





Super with a string.
Sub with a string.
  第2种解决方法实际上是指定编译器不要寻找父类的默认构造方法,而是去寻找带一个字符串为参数的构造方法。

  下面介绍对象的初始化顺序问题。

  示例3:
class One
{
One(String str)
{
System.out.println(str);
}
}
class Two
{
One one_1 = new One("one-1");
One one_2 = new One("one-2");
One one_3 = new One("one-3");
Two(String str)
{
System.out.println(str);
}
}
public class Test
{
public static void main(String[] args)
{
System.out.println("Test main() start...");
Two two = new Two("two");
}
}
输出结果:
Test main() start...
one-1
one-2
one-3
two
  在main()方法中实例化了一个Two类的对象。但程序在初始化Two类的对象时,并非先调用Two类的构造方法,而是先初始化Two类的成员变量。这里Two类有3个成员变量,它们都是One类的对象,所以要先调用3次One类的相应的构造方法。最后在初始化Two类的对象。

  示例4:
class One

{
One(String str)
{
System.out.println(str);
}
}
class Two
{
One one_1 = new One("one-1");
One one_2 = new One("one-2");
static One one_3 = new One("one-3");
Two(String str)
{
System.out.println(str);
}
}
public class Test
{
public static void main(String[] args)
{
System.out.println("Test main() start...");
Two two_1 = new Two("two-1");
System.out.println("------------");
Two two_2 = new Two("two-2");
}
}
输出结果:
Test main() start...
one-3
one-1
one-2
two-1
------------
one-1
one-2
two-2
  如果一个类中有静态对象,那么它会在非静态对象前初始化,但只初始化一次。非静态对象每次调用时都要初始化。

  示例5:
class One
{
One(String str)
{
System.out.println(str);
}
}
class Two
{
One one_1 = new One("one-1");
One one_2 = new One("one-2");
static One one_3 = new One("one-3");
Two(String str)
{
System.out.println(str);
}
3
}
public class Test
{
static Two two_3 = new Two("two-3");
public static void main(String[] args)
{
System.out.println("Test main() start...");
Two two_1 = new Two("two-1");
System.out.println("------------");
Two two_2 = new Two("two-2");
}
}
输出结果:
one-3
one-1
one-2
two-3
Test main() start...
one-1
one-2
two-1
------------
one-1
one-2
two-2
  程序中主类的静态变量会在main()方法执行前初始化。结果中只输出了一次one-3,这也说明:如果一个类中有静态对象,那么它会在非静态对象前初始化,但只初始化一次。非静态对象每次调用时都要初始化。

  示例6:
class One
{
One(String str)
{
System.out.println(str);
}
}
class Two
{
static int i = 0;
One one_1 = new One("one-1");
static One one_2 = new One("one-2");
static One one_3 = new One("one-3");
Two(String str)
{
System.out.println(str);
}
}
public class Test
{
public static void main(String[] args)
{
System.out.println("Test main() start...");
System.out.println("Two.i = "  Two.i);
}
}
4
输出结果:
Test main() start...
one-2
one-3
Two.i = 0
  不仅第1次创建对象时,类中所有的静态变量要初始化,第1次访问类中的静态变量(没有创建对象)时,该类中所有的静态变量也要按照它们在类中排列的顺序初始化。

  综上所述:

  在创建对象时,对象所在类的所有数据成员会首先进行初始化,如果其中的成员变量有对象,那么它们也会按照顺序执行初始化工作。在所有类成员初始化完成后,才调用对象所在类的构造方法创建对象。构造方法作用就是初始化。

  静态对象(变量)在非静态对象前初始化。静态对象(变量)只初始化一次,再次调用就不初始化了,但非静态对象在每次调用时都要初始化。

  程序中的主类的静态变量会在main()方法执行前进行初始化工作。

  不仅第1次创建对象时,类中所有的静态变量要初始化,第1次访问类中的静态变量(没有创建对象)时,该类中所有的静态变量也要按照它们在类中排列的顺序初始化。

  初始化的顺序包括构造方法调用的顺序如下:

  1.主类的静态成员首先初始化。
  2.主类的超类的构造方法按照从最高到最低的顺序被调用。
  3.主类的非静态对象(变量)初始化。
  4.调用主类的构造方法。

  在一个构造方法中只能调用一次其它的构造方法,并且调用构造方法的语句必须是第一条语句。

分享到:
评论

相关推荐

    Java中构造方法的深入研究与探讨.pdf

    Java 中构造方法的深入研究与探讨 ...本文对 Java 中构造方法的概念、特点和应用进行了深入的研究和探讨,阐述了其在继承和设计模式中的重要作用,为读者提供了一个深入的了解 Java 中构造方法的机会。

    java中带有不同构造方法的程序内存分析

    总的来说,Java中带有不同构造方法的程序内存分析涉及构造方法的选择、内存的分配(包括栈和堆)、对象的初始化以及垃圾回收机制的理解。通过深入研究这些概念,开发者可以更好地控制和优化程序的内存使用,提高程序...

    java构造方法

    ### Java构造方法详解 #### 一、构造方法基础概念 构造方法是Java中一种特殊的方法,主要用于初始化新创建的对象。每个类至少有一个构造...通过本文的详细阐述,希望读者能够对Java构造方法有更深入的理解和掌握。

    NDK开发之C语言调用Java构造方法、父类方法、返回中文字符串乱码问题案例

    这里,`<init>`是Java构造方法的特殊标识符,`()`V表示无参数的void构造方法。 对于父类方法,你需要先获取父类的`jclass`,然后按照同样的方式寻找并调用方法。例如,如果`YourJavaClass`继承自`ParentClass`,...

    java 子类构造方法

    本文将深入探讨Java子类构造方法的相关知识点。 首先,每个Java类都有至少一个构造方法。如果程序员没有显式定义任何构造方法,编译器会自动为类提供一个默认的无参构造方法。当子类继承父类时,它同样可以拥有自己...

    java 使用构造方法的重载计算课程的GPA值

    在Java编程语言中,构造方法是用于初始化新创建对象的特殊方法。它们的名字与类名相同,不返回任何类型,并且通常与new关键字一起使用。构造方法的重载(Overloading)是面向对象编程的一个重要特性,允许我们在同一...

    深入理解java构造器机理

    “深入理解Java构造器机理” 在 Java 编程语言中,构造器是一种特殊的方法,用于初始化对象的创建。它是 Java 类中最重要的一个概念。下面将深入讨论构造器的机理、执行顺序、作用及与其他概念的区别。 一、构造器...

    Java中默认构造方法的举例说明及代码清单.pdf

    本文将深入探讨Java中的默认构造方法,并通过一个具体的例子来展示其工作原理。 默认构造方法的特点是它没有参数,且不执行任何特定的操作。它的主要作用是确保在没有自定义构造方法的情况下,类的实例仍然可以被...

    包含圆类的程序(含几种构造方法)java语言实现

    通过这个示例,我们可以看到Java中面向对象编程的基本应用,包括如何定义一个类,使用构造方法初始化对象,以及通过成员方法操作对象的属性。`Circle`类的实现展示了如何封装数据(通过私有变量),并提供公共接口...

    Java零基础-构造方法.md

    本文旨在深入解析Java语言中的构造方法这一核心概念。构造方法是对象初始化的关键步骤,在Java编程中占据着至关重要的地位。通过对构造方法的学习,读者不仅能理解其基本原理,还能掌握其实现细节及应用场景。文章...

    Java语言程序设计教学中构造方法的研究.zip

    Java语言在程序设计领域占有重要地位,特别是...总之,Java语言程序设计教学中的构造方法研究是一个深入且实用的主题。通过理解和掌握构造方法,学生能够更好地理解和应用面向对象编程,为后续的Java学习打下坚实基础。

    Java中自定义构造方法及其测试的代码清单.pdf

    本文将深入探讨Java中自定义构造方法的概念,以及如何进行测试。我们将基于提供的代码清单来分析和解释相关知识。 首先,让我们看`Point.java`类的代码。在这个例子中,`Point`类有两个构造方法: 1. 构造方法1:...

    Java语言中的构造方法私有化.pdf

    本文将深入探讨私有构造方法的应用及其在单态模式中的作用。 首先,我们来看一个简单的例子,演示了如何将构造方法私有化: ```java class Singleton { private Singleton() {} // 私有化构造方法 public void ...

    java_构造者模式

    下面我们将深入探讨这个模式的概念、结构以及如何在Java中实现。 1. **模式概念** 构造者模式的核心思想是将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。这种模式常用于当一个对象的...

    深入剖析java类的构造方式

    首先,让我们明确Java中构造方法的作用。构造方法是一种特殊的方法,用于初始化新创建的对象。当创建一个新的类实例时,构造方法会被自动调用。按照Java规范,类实例的构造过程遵循以下顺序: 1. 如果构造方法有...

    Java入门理解构造器

    在Java中,构造器(Constructor)是一种特殊的方法,主要用于初始化对象。构造器的名字必须与类名相同,并且没有返回类型,甚至连`void`也不可以有。构造器的主要任务是在创建对象时为对象分配内存并初始化成员变量...

    MLDN魔乐JAVA_05构造方法、匿名对象.rar

    在Java编程语言中,构造方法和匿名对象是两个非常重要的概念,它们对于理解和创建对象起着关键作用。本文将深入探讨这两个主题,并结合实例进行详细解释。 首先,我们来看构造方法。构造方法是一种特殊的方法,它与...

    java构造函数示例(构造方法)

    在这个例子中,我们将深入理解Java构造函数,并通过两个示例来演示其用法。 首先,让我们分析原始的`TestCar`类。在这个简单的类中,我们定义了一个`Car`类,包含两个属性:`color`和`brand`。在`main`方法中,我们...

    实验三:Java类与对象

    在Java中,通过`new`关键字和类的构造方法来创建对象。实验中,我们创建了两个`Monkey`对象`monkey1`和`monkey2`,并调用了它们的方法,展示了对象的使用。 成员变量和局部变量是Java中的两种变量类型。成员变量是...

    Java程序设计课程实验8-封装、构造方法

    Java程序设计课程实验8主要关注的是封装和构造方法这两个核心的面向对象编程概念。...通过这个实验,学生不仅可以深入理解封装和构造方法的原理,还能提高自己的编程技巧,为后续更复杂的Java程序设计打下坚实的基础。

Global site tag (gtag.js) - Google Analytics