我是java
的新手,我想知道为什么我需要创建一个新的类实例,以便在non-static methods
中使用main method
,而不是在其他方法中使用public class Test {
public void test(){
System.out.println("test");
}
public static void main(String args[]){
test(); // error Cannot make a static reference to the non-static method test() from the type Test
}
public void tst(){
test(); // no errors
}
}
以下
double?
答案 0 :(得分:2)
看,main
是static
方法。您可以从尚未初始化的类中调用它。您可以这样做,但如果没有Test#test
的实例,则无法致电Test
。
public class Test {
public void test(){
System.out.println("test");
}
public static void main(String args[]){
Test test = new Test();
test.test();
}
public void tst(){
test(); // no errors
}
}
必须在对象上调用非静态方法。使用new
关键字创建对象。有时候,有些方法可以返回新对象,但是它们会在里面调用new
。
可以在不创建对象的情况下调用静态方法。然后,您需要声明它们static
。怎么样?只需在返回类型之前添加static
。
public class Test {
public void test(){
System.out.println("test");
}
public static void main(String args[]){
tst();
Test test = new Test();
test.test();
}
public static void tst(){
Test test = new Test();
test.test();
}
}
tst()
中没有错误,因为您调用了从该范围中看到的方法。这意味着如果创建了一个类Test
的对象,则可以调用tst
和test
。如果您尝试在我的重构之前调用tst
,那么您会收到相同的警告。
答案 1 :(得分:1)
按照定义
静态方法属于该类,这意味着您可以通过调用
来使用它们ClassName.methodName();
必须在某个类的对象的实例上调用实例方法(非静态)。
像
Test test = new Test();
test.test();
答案 2 :(得分:1)
无论如何创建对象,您都无法从静态区域调用非静态方法,只有通过此对象才能调用此方法。
或者如果你想直接从静态区域调用方法,那么make方法也是静态的。
为什么?? 通常在java中有3种类型的变量基于我们的声明位置1)局部变量2)实例变量和3)静态变量,也与实例方法和静态方法相同。
注意静态方法或块在类加载时执行,并且您尝试调用普通方法的时间和普通方法的范围与对象的范围相同,因此,不创建对象你也不能考虑正常/实例方法。
答案 3 :(得分:1)
将静态方法视为在该类的任何实例之外存在。它实际上是一种无实例的方法。为了调用非静态方法,您必须引用一个实例才能调用它。
另一种看待问题的方法是从变量的角度来看。静态变量由类的所有实例共享,不属于单个实例。
public class Test {
private static int var1 = 0;
private int var2 = 0;
public static void main(String[] args) {
Test test1 = new Test();
Test test2 = new Test();
var1++;
test1.testMethod();
test2.testMethod();
System.out.println("var1=" + var1);
System.out.println("test1.var2=" + test1.var2);
System.out.println("test2.var2=" + test2.var2);
}
private void testMethod() {
var1++;
var2++;
}
}
将产生以下内容
var1=3
test1.var2=1
test2.var2=1
静态方法也由类的所有实例共享,因此不能直接访问非静态变量。
答案 4 :(得分:0)
该课程1:从班级创建一个对象:
Test test = new Test ();
test.test(); // will print test
答案 5 :(得分:0)
public static void main
是静态方法,这意味着它不会在类的特定实例的上下文中执行。
任何不符合static
限定的方法都需要在类的特定实例的上下文中调用,这就是为什么实例化对象或处理实例的必要性class来从静态上下文调用,或者从非静态上下文(例如public void tst()
方法)调用它。
我强烈建议您阅读一些基本的Java教程,例如Understanding Class Members。
答案 6 :(得分:0)
在java中,类有字段和方法(或函数)。关键字'静态'可以添加到这两个实体。
标有关键字'静态'的实体是类相关的,其他实体是实例相关的。对于访问类的静态字段或方法,我们只需要创建类及其实例(使用new关键字创建)。
未标记为静态的方法和字段属于该类的活动实例。
现在假设有一个类Test.java,我们没有它的实例。我们可以调用任何标记为static的方法。尝试回答:"从静态方法内部(没有类的实例)我们如何调用方法或如何访问属于某个实例的字段?"
对于从静态方法访问非静态字段或方法,我们需要一个实例。如果是“呼叫方法”'是非静态的,然后必须在对象上调用它。如果现在我们通过这种非静态调用方法调用另一种方法'我们可以轻松地这样做,因为该方法将在与调用方法相同的对象上调用'已被援引。
正如哈维在他的回答中提到的,你也可以参考 https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html了解'静态'。
所有非静态方法和字段都有'这个' (https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html)与它们相关联,它引用该类的当前活动实例。
因此'主要'如果没有类'测试'
的实例,静态方法不能调用任何非静态方法答案 7 :(得分:0)
要调用静态方法,只需要一个类,而“非静态”则需要特定类的实例(创建该类的对象)。