5

我的老师编写和组织代码的方式与我的补充教科书中提出的非常不同。在最近的一个实验中,我们需要使用该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;and时_snowman = new Snowman();,是SnowmanSnowman类还是Snowman()方法?

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

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

4

5 回答 5

8

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

例子:

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

    }
}

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

你打电话时

MyClass a = new MyClass(); 

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

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

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

public MyClass() {
}

大量关于在线构造函数的信息。它们是开始学习面向对象编程的基本概念。更多信息在这里

--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
于 2012-11-01T21:35:56.417 回答
6

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

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

于 2012-11-01T21:33:51.343 回答
4

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

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

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

因为构造函数不同于普通方法。他们返回其对象的一个​​实例,即new Snowman()返回一个新的雪人实例,其默认状态。

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

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

既然是这样,为什么我不需要运行 Snowman.Snowman() 来设置所有属性,因为它是一种方法,而不是 public static void main?

当你运行你的程序时,你并没有运行你的课程。您正在实例化对象的实例以用于其他操作。说Snowman s = new Snowman()给你留下了一个Snowman命名的对象s,这样你现在就可以用那个对象做事了。

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

这个问题对我来说没有多大意义。

在主类中,当我创建一个新的 SnowmanCartoon 时,为什么我不需要做一些事情来启动它,比如创建窗口等?

这是因为该类正在扩展FrameFrame具有基类 ( ) 使用的默认操作SnowmanCartoon。所以简而言之,你的超级班级正在为你处理这个问题。

希望有帮助。

于 2012-11-01T21:42:56.913 回答
3

这在java中称为构造函数。执行此操作时会调用此方法

Snowman s = new Snowman();
于 2012-11-01T21:38:47.237 回答
2

1 这不是方法,而是构造函数。

2 void 只是一个返回类型。void 表示该方法不返回任何内容。并且构造函数没有返回值。

3 它指的是 Snowman() 构造函数。这不是一种方法。它创建一个雪人对象。

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

6 我假设 JVM 会处理它。

于 2012-11-01T21:38:06.093 回答