【问题标题】:Ways of calling non static method from main in JavaJava中从main调用非静态方法的方法
【发布时间】:2014-08-25 21:29:11
【问题描述】:

我们都知道,我们不能直接从 Java 的静态 main 方法中调用非静态方法。我写了两种从 main 调用非静态方法的方法(如下所示)。

我想问的是:使用code 1code 2来克服限制有什么显着差异吗?

代码 1

public class Demo 
{ 
    public static void main(String[] args) 
    {           
        Demo demo = new Demo();
        demo.printText();
    }

    public void printText()
    {
        System.out.println("Method successfully called.");
    }   
}

代码 2

public class Demo 
{ 
    public static void main(String[] args) 
    {           
        new Demo().printText();    
    }

    public void printText()
    {
        System.out.println("Method successfully called.");
    }   
}

注意:在学校里,我们的教授告诉我们“在 Java 中,可以通过定义它们的类的名称来调用类的静态方法,而无需实例化先上课。”

但是在code 2 中没有实例化对象,但我能够调用非静态方法?

【问题讨论】:

  • new Demo() 实例化对象,见stackoverflow.com/questions/24221662/…
  • 顺便说一句,为什么投反对票?
  • 因为您假设您“在不实例化对象的情况下调用方法”,即使这正是您正在做的。您只是从未存储过引用,但它仍然是该类的实例化实例。因此,人们认为这是一个低质量的问题,因为该问题似乎缺乏 basic 关于 Java 以及作为教程的一部分的引用和对象实例化的知识:docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html
  • 两者都有效,但通常情况下,如果您发现自己创建对象来调用单个方法,那么您的方法应该是静态的
  • 听起来像printText() 可能需要一个static 方法。如果在不实例化对象的情况下调用方法是有意义的,那么它可能应该是一个静态方法......

标签: java methods static main


【解决方案1】:

在 Code1 中,您正在使用类名作为引用变量创建一个对象,并调用该函数,这将非常有效。 在code2中,您正在创建一个匿名对象,它基本上是在我们希望在类的生命周期中只使用一次对象时使用的。

在这两种代码中,程序都可以正常运行。

【讨论】:

    【解决方案2】:

    在使用第一个而不是第二个时,需要考虑两个主要事项..

    1. 您仍将拥有对Demo 对象的引用,因此您可以调用demo.someOtheMethod()
    2. printext() 返回后,您的演示对象将无法进行垃圾回收。即,直到您真正退出main(),它才会准备好。在第二种情况下,它会在printext() 返回后立即准备就绪..

    【讨论】:

    • 想解释一下为什么#2 是一个优势?
    • @TheLostMind 想详细说明第一种情况和第二种情况之间的垃圾收集?使用code 2 是不好的做法吗?
    • @IdanArye - 对不起.. 第二个是不是优势。更改答案以反映相同。
    • @user3437460 - 不完全是。如果您不希望引用持续存在,那么第二个选项实际上很好。例如,new Thread(new Runnable()...// 重写 run());这样可以确保线程只运行一次,并提前为 GC 准备 Thread 和 Runnable 对象。
    【解决方案3】:

    执行代码或创建对象没有任何区别。

    但是在第二种方法中,你没有对你创建的对象的引用。(在第一种方法中,demoDemoobject 的引用)所以你不能做任何其他事情这个对象更进一步,因为没有办法引用它。

    例如: 假设您在类 Demo 中有另一个方法称为 foo1()

    在第一个示例中,您可以使用单个对象运行这两种方法。

        Demo demo = new Demo();
        demo.printText();
        demo.foo1(); 
    

    但在第二种方法中,您必须分别处理 2 个对象。

    new Demo().printText();
    new Demo().foo1();
    

    【讨论】:

    • 请注意,第二个版本创建了两个对象,也就是实例化了两个对象,这不一定是正确的解决方案。我看到一个代码,该人在每个onDraw() 函数调用上都在执行canvas.drawText("whatever", 20, 20, new Paint());,这非常令人畏惧memory leak(或者至少它迫使GC 不断地完成它的工作)。又名bad performancebad memory management 的来源。
    【解决方案4】:

    唯一的区别是您可以稍后在对象演示中重用该值。但是,您不应该仅仅为了调用这样的方法而创建实例。正确的做法是将方法设为静态。

    【讨论】:

      猜你喜欢
      • 2013-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多