构造函数和方法之间的区别

Ste*_*hao 12 java methods constructor

Bellow是我在Tutorials Points上发现的一个例子,它是一个构造函数的例子.我得到了大部分,但我不明白为什么你需要一个构造函数一个方法.

public Puppy(String name){
    System.out.println("Passed Name is :" + name ); 
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,是什么阻止你做这个呢?

public static void Puppy(String name){
    System.out.println("Passed Name is: "+name);
}
Run Code Online (Sandbox Code Playgroud)

一旦打电话,这两个人做同样的事情吗?

以下是完整的参考程序:

public class Puppy {
    int puppyAge;

    public Puppy(String name) {
        System.out.println("Passed Name is :" + name); 
    }

    public void setAge(int age) {
        puppyAge = age;
    }

    public int getAge() {
        System.out.println("Puppy's age is :" + puppyAge); 
        //what does this return do? since the puppyAge is already printed above.
        return puppyAge;
    }

    public static void main(String []args){
        Puppy myPuppy = new Puppy("tommy");

        myPuppy.setAge(2);
        myPuppy.getAge();

        System.out.println("Variable Value :" + myPuppy.puppyAge); 
    }
}
Run Code Online (Sandbox Code Playgroud)

Dic*_*ici 22

您没有获得实例的基本概念,这在OOP中是基础.如果你想要一个比喻,让我们谈谈汽车.

我很确定你知道汽车是什么; 你知道它可以让你从一个地方移动到另一个地方,它有4个轮子,依此类推.这是一个概念,你车库里的实际车辆就是这个概念的一个实例(<=>类).

构造函数的目标是创建一个实例,而不是打印一些文本.如果没有构造函数,您将永远无法调用类的非静态方法.你将无法驾驶汽车的概念,你将需要先建造一辆汽车.

只需回顾这些概念; 如果没有它,你将无处可去.


fel*_*eek 10

我想你的问题是为什么使用...创建构造函数

public Puppy(String name)
Run Code Online (Sandbox Code Playgroud)

...代替...

public static void Puppy(String name)
Run Code Online (Sandbox Code Playgroud)

..., 对?

如果是,首先你应该首先构造函数是一个类所拥有的特殊方法,只要你创建该类的新实例就会调用它.所以,例如,如果你有这个课......

public class Clazz {
    public Clazz (String s) {
         System.out.println(s);
    }
}
Run Code Online (Sandbox Code Playgroud)

...,然后每当你创建这个类的新实例时...

Clazz c = new Clazz("Hello World");
Run Code Online (Sandbox Code Playgroud)

...,将调用构造函数并执行该方法.(在此示例中,它将在屏幕上打印"Hello World".)

也就是说,您可以看到构造函数是一个方法,但它是一个在实例化类时调用的特殊方法.所以,关于你的问题,构造函数这种方式而不是常规方法头的原因是向编译器指示它是构造函数不是常规方法.如果你写public void Clazz ()而不是public Clazz (),那么编译器将无法识别你的构造函数,并认为它只是一个常规方法.

请注意,构造函数永远不会返回任何内容,因此不必使用void关键字.此外,将构造函数设置为静态没有任何意义,因为在实例化新对象时会调用构造函数.

  • @nbrooks在我看来,是什么让`new String("Hello World")`返回一个String它是`new`关键字,而不是构造函数本身.请注意,如果我们在类中单独调用构造函数方法,如`this()`,它肯定不会返回任何内容.关于java文档,它说`构造函数声明看起来像方法声明 - 除了它们使用类的名称并且没有返回类型.这是在这里写的https://docs.oracle.com/javase/tutorial/java /javaOO/constructors.html (2认同)

tur*_*ete 5

构造函数是方法,但它们是特殊类型的方法.构造函数是没有返回类型的方法,必须以其封闭类命名.那么为什么我们需要构造函数呢?好吧,这就是我们如何创建类的实例.如果要创建某个类的实例,可以通过调用其构造函数来实现.构造函数为对象保留内存并返回对新创建的对象的引用.


Mr.*_*irl 5

Java Spec for Constructors中陈述:

  • 构造函数不返回任何内容,因此它们没有返回类型.

    在所有其他方面,构造函数声明看起来就像没有结果的方法声明(第8.4.5节).

  • 您不能覆盖构造函数.

    构造函数声明不是成员.它们永远不会被遗传,因此不会被隐藏或覆盖.

  • 它们不能直接访问实例变量,而是必须使用thissuper委托类的变量.

    构造函数体中的显式构造函数调用语句可能不引用此类或任何超类中声明的任何实例变量或实例方法或内部类,或者在任何表达式中使用this或super; 否则,发生编译时错误.