关于java方法调用的几个问题

时间:2014-07-24 14:07:26

标签: java

1:我有一个类似的程序。

public class Test{
    void dispose(){
        System.out.println("disposing");
    }
    Test t=new Test();
    public static void main(String[] args){
        t.dispose();
    }
}

为什么我不能从main()调用dispose方法?如果它的静态和非静态关系,为什么以下代码有效?

public class Test{
    void dispose(){
        System.out.println("disposing");
    }
    public static void main(String[] args){
        Test t=new Test();
        t.dispose();
    }
}

2:方法调用代码应始终在方法中吗?因为,下面的代码不起作用..

public class Test{
    void dispose(){
        System.out.println("disposing");
    }
    Test t=new Test();
    t.dispose();
    public static void main(String[] args){
    }
}

请澄清我..

8 个答案:

答案 0 :(得分:1)

示例1

您处于静态方法(main)并尝试访问非静态变量t。您已将变量t声明为:

 Test t=new Test();

这已将其创建为类的成员变量。相反,您需要将其声明为:

 static Test t=new Test();

现在静态方法可以访问它(虽然这通常不是一种好办法)。

示例2

您现在将变量t声明为main方法中的局部变量,因此从main中访问它是有效的。

示例3

除了initalizer块(您不必担心),所有代码都必须放在方法中。

答案 1 :(得分:1)

你来自过程语言的背景,如C。

Java 与众不同。它是面向对象的

来到你​​的问题。 。 。

Ans1:说你不一定要创建一个类的实例来使用该类的方法是正确的。如果使用static关键字声明方法,则可以在不先创建类的实例的情况下调用该方法。那是因为静态方法是从类调用的,而不是从对象调用的。

您无法从静态上下文中调用非静态方法(此处为静态方法main())。为什么? 因为you can't call something that doesn't exist. Since you haven't created an object, the non-static method doesn't exist yet. A static method (by definition) always exists.

然而,即使这不是这里的确切案例

您可能会觉得您已经在代码的第5行创建了该类的实例,但是对于编译器,它不存在。它在main()方法之外,这是在任何可运行的Java程序中首先寻找的方法。然后编译器根据需要在其他部分中进行编织。您不能拥有不在方法中的可执行代码,查看对象初始化。 在第二个代码块中,编译器会看到对象初始化,因此程序会执行。

Ans2:是。以前为mentioned,您不能拥有不在方法中的可执行代码

<强>插图:

class DeclarationTest  
{  
  int a = 5;  
  int b = 10;  
  int c = a + b;//it is Ok, this is a declaration statement for c  

  /* 
  int c; 
  c = a + b; ------> this is not Ok, you are performing an action here this must be inside a method! 
  */  
}

如果是这种情况,它会使方法变得不那么有用。 。 。想一想。

答案 2 :(得分:0)

  

为什么我不能从main()调用dispose方法?如果它的静态和非静态关系,为什么以下代码有效?

由于您有一个Test实例,所以即使在静态环境中也可以使用它。

  

应该始终将方法调用代码shold放在方法中吗?

是。究竟。在方法,静态块或构造函数中。其他地方不允许。

答案 3 :(得分:0)

第二个块不起作用的原因是由于静态关系。

如果方法不是静态的,那么它必须具有要访问的实例。这就是为什么,创建类的实例允许您调用方法。

如果你将dispose方法设为静态,那么你可以直接调用该方法,因为它只有一个实例。

这是一个解释它的不同问题的链接:

calling non-static method in static method in Java

希望这会有所帮助:)

答案 4 :(得分:0)

在开始之前,让我清楚什么是类变量和对象变量

类变量:静态变量,无需初始化类

即可访问

对象变量:非静态变量,只能在CLass实例化时访问

因此,在您的情况下,当主要获取调用时,不会启动类,因此该对象不会被初始化,因此您无法调用dispose方法。

答案 5 :(得分:0)

  

为什么我不能从main()调用dispose方法?如果它的静态和非   静态关系,为什么以下代码有效?

非静态变量t不能从静态上下文引用(编译器异常)。 你应该永远记住jvm搜索main()方法并执行它。之后初始化方法和块。 注意: - 您始终编译并运行包含main方法的类。

您将变量t声明为main方法中的局部变量,因此从main中访问它是有效的。

  

应该始终将方法调用代码放在方法中吗?

是方法调用总是需要在方法内部或构造函数或初始化块中,甚至是静态块。

答案 6 :(得分:0)

当执行java程序时,JVM会查找main方法。如果你不写任何东西,在主要内部什么都不会发生。

public class Test{
    void dispose(){
        System.out.println("disposing");
    }
    Test t=new Test();  //That's ok.
    t.dispose();        //causes compilation error

    public static void main(String[] args){
         //Executed as soon as you run your program.
    }
}

您想要调用dispose()。你想要什么?将测试对象上的dispose()称为 t.dispose(),或者可以使用 Test.dispose();

调用它

方法1:

public class Test{
    void dispose(){
        System.out.println("disposing");
    }

    public static void main(String[] args){
        Test t=new Test();  //You need a reference to Test object
        t.dispose();        //to call its methods

    }
}

在Test静态中是dispose()吗?不...所以,你必须使用Test对象来调用它。 如果在Test静态中dispose()?然后...

方法2:

public class Test{
    static void dispose(){
        System.out.println("disposing");
    }

    public static void main(String[] args){
        Test.dispose();  // Since dispose() is static.
    }
}

您不能使用类引用调用非静态方法。您必须使用Class对象但您可以使用类对象调用静态方法(不推荐)。您使用类引用调用它。

方法3 :(不推荐)

public class Test{
    static void dispose(){
        System.out.println("disposing");
    }

    public static void main(String[] args){
        Test t = new Test();
        t.dispose();  //Static members should be accessed using class name
    }
}

答案 7 :(得分:0)

是的,您不能在静态块内调用非静态对象或变量。如果您将object声明为static,则您的代码将按以下方式工作。

public class Test{
    void dispose(){
        System.out.println("disposing");
    }

    static Test t=new Test();

    public static void main(String[] args){
        t.dispose();        
    }
}

您也可以尝试以下操作:

public class Test{
    void dispose(){
        System.out.println("disposing");
    }

    {
         dispose();
    }

    public static void main(String[] args){
        Test t=new Test();
    }
}

此外,我们可以在类的方法外声明对象,但不能在方法或块外调用方法。