有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

构造函数和方法之间的java差异

下面是我在教程中找到的一个例子,一个构造函数的例子。我得到了大部分,但我不明白为什么需要构造函数方法

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

我的问题是,是什么阻止你这样做

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

这两个人不是做了同样的事吗

以下是完整的程序供参考:

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); 
    }
}

共 (6) 个答案

  1. # 1 楼答案

    Java Spec for Constructors中指出:

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

      In all other respects, the constructor declaration looks just like a method declaration that has no result (§8.4.5).

    • 不能重写构造函数

      Constructor declarations are not members. They are never inherited and therefore are not subject to hiding or overriding.

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

      An explicit constructor invocation statement in a constructor body may not refer to any instance variables or instance methods or inner classes declared in this class or any superclass, or use this or super in any expression; otherwise, a compile-time error occurs.

  2. # 2 楼答案

    构造函数和方法之间有很大的区别。当你像在程序中一样实例化一个对象时

    Puppy myPuppy = new Puppy( "tommy" );
    

    通过使用new关键字,JVM调用构造函数生成对象。因此,构造函数生成不存在的对象,但方法与存在的对象相关联。你可以在这个链接上阅读更多内容 http://www.javaworld.com/article/2076204/core-java/understanding-constructors.html

  3. # 3 楼答案

    关于构造函数已经有了一些很好的答案

    一个小问题;不能有与类同名的静态方法。该名称是为构造函数保留的

  4. # 4 楼答案

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

    我敢肯定你知道什么是汽车;你知道它能让你从一个地方移动到另一个地方,它有四个轮子等等。这是一个概念,你车库里的实际汽车就是这个概念的一个实例(<;=>;class

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

    只要回顾一下这些概念;没有它,你将一事无成

  5. # 5 楼答案

    我想你的问题是为什么构造函数是用

    public Puppy(String name)
    

    。。。而不是

    public static void Puppy(String name)
    

    。。。,对吧?

    如果是,首先您应该知道构造函数是一个类所拥有的特殊方法,每当您创建该类的新实例时都会调用该类。例如,如果你有这个类

    public class Clazz {
        public Clazz (String s) {
             System.out.println(s);
        }
    }
    

    。。。,然后,每当您创建此类的新实例时,如

    Clazz c = new Clazz("Hello World");
    

    。。。,将调用构造函数并执行该方法。(在本例中,它将在屏幕上打印“Hello World”。)

    也就是说,您可以看到构造函数是一个方法,但它是在实例化类时调用的一个特殊方法。因此,关于您的问题,构造函数之所以这样而不是常规方法头是正确的,是为了向编译器表明它是一个构造函数,而不是一个常规方法。如果您编写public void Clazz ()而不是public Clazz (),那么编译器将无法识别您的构造函数,并且会认为它只是一个常规方法

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

  6. # 6 楼答案

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