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){
}
}
请澄清我..
答案 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();
调用它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()?然后...
public class Test{
static void dispose(){
System.out.println("disposing");
}
public static void main(String[] args){
Test.dispose(); // Since dispose() is static.
}
}
您不能使用类引用调用非静态方法。您必须使用Class对象但您可以使用类对象调用静态方法(不推荐)。您应使用类引用调用它。
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();
}
}
此外,我们可以在类的方法外声明对象,但不能在方法或块外调用方法。