在主类中实例化时,构造函数的正确用法是什么?

时间:2012-11-01 21:32:44

标签: java constructor

我的老师编写和组织代码的方式与我的补充教科书中提出的方式非常不同。在最近的一个实验中,我们需要使用wheels库在一个窗口中显示多个对象。这是由我的老师编写的Snowman类(为方便起见,未包含其他对象的代码):

public class Snowman {
    private Ellipse _top;
    private Ellipse _middle;
    private Ellipse _bottom;

public Snowman() {
        _top = new Ellipse();
        _top.setColor(Color.WHITE);
        _top.setFrameColor(Color.BLACK);
        _top.setFrameThickness(1);
        _top.setSize(80, 80);
        _middle = new Ellipse();
        _middle.setColor(Color.WHITE);
        _middle.setFrameColor(Color.BLACK);
        _middle.setFrameThickness(1);
        _middle.setSize(120, 120);
        _bottom = new Ellipse();
        _bottom.setColor(Color.WHITE);
        _bottom.setFrameColor(Color.BLACK);
        _bottom.setFrameThickness(1);
        _bottom.setSize(160, 160);
    }
    public void setLocation(int x, int y) {
        _top.setLocation(x + 40, y - 170);
        _middle.setLocation(x + 20, y - 100);
        _bottom.setLocation(x, y);
    }
}    

此对象以及稍后在SnowmanCartoon类中实例化:

public class SnowmanCartoon extends Frame{
    private Snowman _snowman;
    private Eyes _eyes;
    private Hat _hat;
    private Bubble _bubble;

    public SnowmanCartoon() {
        _snowman = new Snowman();
        _snowman.setLocation(100, 300);
        _eyes = new Eyes();
        _eyes.setLocation(165, 150);        
        _hat = new Hat();
        _hat.setLocation(152, 98);
        _bubble = new Bubble();
        _bubble.setLocation(280, 60);
    }
    public static void main(String[] args) {
        new SnowmanCartoon();
    }
}

以下是我的担忧:

  1. 在这两个类中,为什么有一个与该类同名的方法,它的用途是什么?

  2. 为什么方法setLocation()是一个void方法而方法Snowman()不是,即使Snowman()没有返回任何内容?

  3. SnowmanCartoon课程中,private Snowman _snowman;_snowman = new Snowman();时,SnowmanSnowman类,或者更确切地说Snowman() {1}}方法?

  4. 如果Snowman对象的实例化是指Snowman()方法设置其所有属性,为什么我不需要使用点运算符:{{1} }

  5. 在我的教科书中,实例变量和方法在一个类中声明,并在另一个类中实例化。但是,它们似乎同时出现在我老师的代码中。

5 个答案:

答案 0 :(得分:8)

与类相同的方法称为类的“构造函数”。它用于实例化对象。

示例:

public class MyClass { // class
    public MyClass() { // constructor

    }
}

请注意,构造函数与任何其他方法一样,但是它没有返回类型。它基本上返回“this”对象。

致电时

MyClass a = new MyClass(); 

这实际上会调用构造函数并创建对象。

请注意,通过使用不同数量和类型的参数,您可以在一个类中拥有多个构造函数。

在java中,如果你不包含任何构造函数,那么任何类默认都会有默认的无参数构造函数。

public MyClass() {
}

在线构建者可获得的大量信息。它们是开始学习面向对象编程的基本概念。更多信息here

- EDIT-- 回答有关如何致电特定问题的问题。

拿这两个构造函数

public MyClass(){
// do things
}

public MyClass(String p){
// do things
}

然后当你实例化对象

MyClass c = new MyClass(); // use constructor 1
MyClass d = new MyClass("value"); // use constructor 2

答案 1 :(得分:6)

public Snowman() {...}被称为构造函数。在为此类创建对象时将调用此方法。如果你没有定义构造函数,jvm会隐式为你创建一个。请阅读此javadoc以了解有关构造函数的更多信息。

Snowman()不是方法,而是构造函数。构造函数没有返回类型。如果添加返回类型,则将其视为方法。

答案 2 :(得分:4)

  

在这两个类中,为什么有一个同名的“方法”   班级?

这种方法称为构造函数。如果它不带参数,则它被称为“默认构造函数”。构造函数是您用来构建实例的东西,即。 Snowman s = new Snowman();调用默认构造函数。

  

为什么方法setLocation是一个void方法,但Snowman不是一个,甚至   虽然它没有返回任何东西?

因为构造函数与普通方法不同。它们返回其Object的实例,即new Snowman()返回一个新的Snowman实例,其默认状态为。

  

在主要的SnowmanCartoon课程中,它说私人雪人   _雪人;和_snowman = new Snowman();,它是指Snowman类,还是Snowman()方法?

如果你看到new Snowman()(或任何等价物),那总是指的是构造函数。

  

既然如此,为什么我不需要运行Snowman.Snowman()   设置所有属性,因为它是一个方法,而不是公共静态   虚空主?

运行程序时,您没有运行类。您正在实例化对象的实例以用于其他操作。说Snowman s = new Snowman()会留下一个名为Snowman的{​​{1}}对象,以便您现在可以使用该对象执行操作。

  

在Head First Java中,实例变量和方法在a中声明   单独的类,而它们在一个单独的类中实例化。这里,   这似乎发生在同一时间,但我不明白如何。

这个问题对我来说没什么意义。

  

在主课堂上,当我创建一个新的SnowmanCartoon时,为什么不呢   需要做些什么来启动它,比如创建窗口等?

这是因为该课程正在扩展sFrame具有基类(Frame)使用的默认操作。所以简而言之,你的超级班级正在为你照顾这个。

希望有所帮助。

答案 3 :(得分:3)

这在java中称为constructor。执行

时会调用此方法
Snowman s = new Snowman();

答案 4 :(得分:2)

1这不是一个方法,它是一个构造函数。

2 void只是一种返回类型。 void表示该方法不返回任何内容。而构造函数没有回报。

3它引用了Snowman()构造函数。这不是一种方法。它创造了一个雪人对象。

5您可以将雪人对象的实例化放在不同的类中。我想你的老师为了简单起见将它放在同一个班级。

6我假设JVM负责它。