【问题标题】:Difference between call to a method in Java?Java中调用方法的区别?
【发布时间】:2014-06-30 06:24:32
【问题描述】:

我只是想明确一点,以两种形式调用函数,例如

  1. 通过创建对象并使用该对象调用方法。
  2. 不创建调用函数的对象。

我的意思是例如我有一个像这样的类

Class A{
  public int callMethod(){
     return 2;
  }
}

现在我正在创建另一个类来调用A类中定义的方法callMethod

Class B {
  public static void main(String[] args) throws ParseException {

      A a = new A();
      //1st form to call the method
      int aa = a.callMethod()
      System.out.println(aa);

      //2nd form to call the method
      aa = new A().callMethod();
      System.out.println(aa);
  }
}

在创建对象后的第一个语句中,我使用 A 的类对象调用 A 类的 callMethod()。第二次我直接调用该方法而不创建对象类 A。在第一种调用该方法的形式是该死的确定我们正在创建对象并在内存中为该对象占用一些空间。那么调用该方法的第二种形式呢?它需要创建任何对象吗?哪个更快?谁能给我澄清一下。

【问题讨论】:

  • 好吧,new A() 本身就是在堆中创建一个对象!不是吗!!!
  • “不创建对象”短语是错误的。当您调用 new A() 时,您实际上是在创建对象
  • This answer 可以帮到你!!然而,它是关于将对象传递给方法,而不是调用方法。但上下文几乎相似。
  • 没有区别(无论在这里)。由于局部变量a 只是堆栈上的一个内存位置,用于存储指向new A() 产生的对象的“指针”。同样在第二种情况下,new A() 的临时结果存储在堆栈中。
  • 关键字new 总是实例化对象并返回对象引用。是否要将其分配给变量取决于您。

标签: java object method-call


【解决方案1】:

当您使用new 关键字和constructor,在本例中为new A(),它正在创建一个新对象。

【讨论】:

    【解决方案2】:

    第二次我直接调用该方法 创建对象类 A。

    这不是真的 - 对象仍在创建中,只是没有您以后可以参考的名称。

    【讨论】:

      【解决方案3】:

      您的两种方式都是创建对象的实例,但在第二种情况下,如果您想稍后访问第二个对象,则您没有指向该对象的变量,您不能这样做

      【讨论】:

      • 为什么不作为评论发布?请编辑并提供合适的点,以便将其标记为答案!
      【解决方案4】:

      在第二个代码中,您正在创建 A 的一个实例,它正在占用堆栈上的空间。

      第一个代码将要求您在堆空间上实例化 A(除非您从静态代码实例化它,例如:

      static {
         A a = new A();
      }
      

      )

      【讨论】:

        【解决方案5】:

        您正在这两种方法中创建对象。声明

        new A()
        

        创建一个新对象,然后您正在调用一个函数。 您还应该知道对象不会为方法获得不同的内存空间。一个类的所有对象为方法共享相同的内存空间。所以空间真的无关紧要。 如果您想在不使用对象的情况下调用函数,则应该将函数设为静态,这样您就可以在不实际使用对象的情况下调用函数。

        希望这会有所帮助。

        【讨论】:

          【解决方案6】:

          了解java中的堆栈空间和堆空间

          在 java 中,我们有引用堆空间上的对象的引用,

          在这两种情况下,它都是在堆空间上创建对象,但在第一种情况下 你有引用存储在堆栈空间中 A a ("a" 是引用)

          因此,在相同的方法或此引用所指的任何其他方法中 传递的可以引用原始对象(创建的第一个对象) 堆空间...

          在第二种情况下,您直接在新的 obj 上调用方法,它没有 存储在堆栈空间中的引用,以便之后引用它,就像第一次一样 案例。

          【讨论】:

            【解决方案7】:

            两者都一样..!!

            当你写作时

            new A();
            

            这里编译器调用非参数化构造函数(如果不是程序员编写的,编译器调用默认构造函数)

            喜欢:

             A()
            {
             //i am default constructor
             super();
            }
            

            注意:这里是 super();调用 Object 类的直接超类默认构造函数并创建对象。

            A a = new A();
            

            这里对象被创建并且你将该对象分配给引用'a';

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-06-06
              • 2016-08-15
              • 2018-12-20
              • 1970-01-01
              相关资源
              最近更新 更多