【问题标题】:Java: Why can't I call this method outside of main? [closed]Java:为什么我不能在 main 之外调用这个方法? [关闭]
【发布时间】:2014-09-01 10:18:05
【问题描述】:

作为一个初学者,我想知道为什么我的caller.VelocityC 只在放在主块内时才有效?

当我有这样的代码时,我无法调用该方法。

方法调用类:

public class Velocity2 {

VelocityCounter caller = new VelocityCounter();
caller.VelocityC(6, 3);
}

包含该方法的类:

public class VelocityCounter {  
void VelocityC(int s, int v){
    System.out.print(s/v);
  }
}

【问题讨论】:

    标签: java object methods main


    【解决方案1】:

    在 Java 中,不能有不属于方法的可执行语句。* 第一行没问题:

    VelocityCounter caller = new VelocityCounter();
    

    因为编译器认为您正在为类Velocity2 声明和初始化一个名为caller 的实例变量。但是,第二行:

    caller.VelocityC(6, 3);
    

    在类声明的顶层是非法的。

    *从技术上讲,这并不完全正确。语句也可以出现在构造函数、static 块和实例初始化块中。

    【讨论】:

    • +1 获得更多描述性和信息性的答案。
    【解决方案2】:

    这是因为方法或构造函数之外的代码只是声明性的。您不能将诸如赋值或方法调用之类的语句放在方法或构造函数之外。

    【讨论】:

    • 其实可以:public class Test { int v = 5; { v += 2; } }
    • @Andrew_CS 构造函数不被视为方法吗?
    • @Jashaszun 不,他们不是
    • @JamesB 有什么区别,除了构造函数不返回任何东西?构造函数类似于返回 void 的方法。
    【解决方案3】:

    源文件的那个区域是您可以声明类的字段或实例的字段的地方,但是如果您仍然真的想调用caller.VelocityC(6, 3);,那么您可以使用如下的实例初始化块:

    public class Velocity2 {
    
        VelocityCounter caller = new VelocityCounter();
        {
            caller.VelocityC(6, 3);
        }
    }
    

    caller.VelocityC(6, 3); 将在 Velocity2 的每个构造过程中执行,就像 VelocityCounter 构造函数的执行和对调用者的赋值一样。

    http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

    【讨论】:

    • 只有在构造Velocity2 的实例时才会执行。并且每次构建时都会执行,这可能不是 OP 想要的。
    • 我假设 OP 知道它每次都会执行,因为他/她知道调用者的构造也会发生在每个 Velocity2 构造中,但我可以编辑该信息。
    猜你喜欢
    • 1970-01-01
    • 2015-07-08
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多