对java构造函数感到困惑

时间:2013-09-28 11:51:47

标签: java constructor

所以我正在学习Java。我最多constructors,处理classes。我有一些问题确切地了解他们的目的是什么?我相信它们的使用类似于函数调用,在调用时将参数传递给函数?

我在这个想法中是否正确?

例如:

class test{
    void durp(String input){
        System.out.print(input);
    }
}

如果我要在我的主要课堂上制作一个像这样的对象:

test object = new test("hey");

它会将hey作为字符串传递给durp()

这是对的吗?

7 个答案:

答案 0 :(得分:3)

  

如果我要在我的主类中创建一个像这样的对象:test object = new test(“hey”);它会将“hey”作为字符串传递给durp()吧?

不,因为您的方法durp()不是构造函数。它只是属于类的方法,可以从创建的活动对象中调用。

public class Test {
    /** this is a constructor */
    public Test() {
    } 

    /** this is also a constructor with a parameter */
    public Test(String arg1) { 
        System.out.println(arg1); 
    } 

    /** this is a method of Test */
    public void derp() {
    }
}

您可以阅读this tutorial from oracle about constructors

答案 1 :(得分:1)

class Test{

     // this is a constructor (name is same as class and no return type)
    public Test(String input){
      // some code here
   }

  // this is a method 
  public void durp(String input){
   // some code
  } 

 public static void main(String[] args){
       Test test = new Test("hey"); // calls constructor
  }

}

答案 2 :(得分:1)

Java构造函数看起来只是函数 * ,但实际上它们是非常不同的:

  • 在对象完全初始化时调用方法;当对象不存在时调用构造函数
  • 方法不能改变类的final个变量;对于构造者来说,这是他们目的的一部分
  • 方法可能会返回不同的东西;构造函数不返回任何内容
  • 方法调用可用于各种表达式;构造函数只能作为new表达式的一部分调用。

构造函数必须遵循特殊的命名约定:它们的名称必须与类的名称匹配。在您的情况下,那将是test。通常,构造函数的任务是设置类的成员变量。鉴于你的test类没有这样的变量,你不需要构造函数 ** :这样的简单调用就足够了:

new test().drup("hello");

<小时/> * 在Java中,“函数调用”的正确术语是“方法调用”,尽管具有其他编程语言背景的程序员经常可以互换地使用这两个术语。

** 当类没有定义自定义构造函数时,会为您提供一个不带参数的默认构造函数。

答案 3 :(得分:1)

在Java中,构造了对象。每次制作一个新对象时,至少有一个 构造函数被调用。每个类都有一个构造函数,但如果你不创建 一个显式,编译器将为您构建一个。有很多规则 构造函数,让我们关注基本的声明规则。这是一个简单的例子:

 class Tets{
   protected Test() { } // this is Test's constructor
   protected void Test() { } // this is a badly named,
   // but legal, method
 }

首先要注意的是构造函数看起来很像方法。一个 关键的区别在于构造函数永远不会有永远的返回类型......永远! 但是,构造函数声明可以具有所有正常的访问修饰符,以及 他们可以接受参数(包括var-args),就像方法一样。另一个大 RULE,要了解构造函数,它们必须具有相同的名称 声明它们的类。构造函数不能标记为静态(它们 毕竟与对象实例化相关联),它们不能被标记为final 或抽象(因为它们不能被覆盖)。这里有一些合法和非法的 构造函数声明:

 class Foo2 {
    // legal constructors
    Foo2() { }
    private Foo2(byte b) { }
    Foo2(int x) { }
    Foo2(int x, int... y) { }
    // illegal constructors
    void Foo2() { } // it's a method, not a constructor
    Foo() { } // not a method or a constructor
    Foo2(short s); // looks like an abstract method
    static Foo2(float f) { } // can't be static
    final Foo2(long x) { } // can't be final
    abstract Foo2(char c) { } // can't be abstract
    Foo2(int... x, int t) { } // bad var-arg syntax
}

访问https://java.net/downloads/jfjug/SCJP%20Sun%20Certified%20Programmer%20for%20Java%206-0071591060.pdf

答案 4 :(得分:0)

您需要学习核心java basic,它会告诉您带参数的构造函数

class test{

public test(String s)
{
   durp(s);
}

 void durp(String input){

  System.out.print(input);

} 
  public static void main(String args[])
  {
   test obj=new test("hey");
 }
 }

答案 5 :(得分:0)

java中的构造函数用于构造对象,例如你想设置durp的值(不是durp(),因为这是一个方法)你可以使用构造函数来完成这些任务。

我想你想要这样的话:

class Test {
    private String durp;

    public Test(String durp) {
        //set value of durp
        this.durp = durp;
    }

    //function for getting durp string.
    //Use getDurp() rather than durp() in java.
    public String getDurp() {
        return durp;
    }
}

答案 6 :(得分:0)

在OOP中,构造函数是将生命放入类中的东西。 方法(在OOP中它们是方法,而不是函数)只执行具有已存在对象的东西(之前使用构造函数创建)。除非重新定义自己的构造函数,否则每个类都有其默认构造函数(无参数构造函数)。在你的情况下:

class Test{
   String durp;
   public Test(String anInput)
   {
      this.durp = anInput;
   }

   void durp(){
      System.out.print(input);
   }
}

此时代码中的其他位置应该有一个构造类的方法,例如:

Test test = new Test("hey");
test.durp() // prints "hey" (without quote)

注意:由于命名约定类名始终以大写和驼峰符号(即ThisIsMyClass)开头,在本例中为Test。争论非常广泛,你需要学习很多新东西。