不可以。
因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用。
上面这句话是从文档上抄的,其实我还是有疑问,不是不能调吧而是不能直接调用,所以还是可以调用的,看下面代码:
public static void main(String[] args) {
//静态方法 调用
int a = test01(1, 1);
System.out.println("a:" + a);
// 普通方法调用
StaticTest staticTest = new StaticTest();
int b = staticTest.test02(1, 1);
System.out.println("b:" + b);
// 普通方法内部调用静态方法
StaticTest staticTest1 = new StaticTest();
System.out.println("c:" + staticTest1.test03(1, 1));
// 静态方法内部调用普通方法
int d = test04(1,1);
System.out.println("d:"+d);
}
//静态方法
static int test01(int x, int y) {
return x + y;
}
// 普通方法
int test02(int x, int y) {
return x - y;
}
// 普通方法内部调用静态方法
int test03(int x, int y) {
int c = test01(x, y);
return c;
}
// 静态方法内部调用普通方法
static int test04(int x, int y) {
StaticTest staticTest = new StaticTest();
int d = staticTest.test02(x, y);
return d;
}
输出:
a:2
b:0
c:2
d:0
看代码并没有编译运行报错。
那么想一下为啥要用静态方法?
静态方法的生命周期跟相应的类一样长,静态方法和静态变量会随着类的定义而被分配和装载入内存中。一直到线程结束,静态属性和方法才会被销毁。(也就是静态方法属于类)
非静态方法的生命周期和类的实例化对象一样长,只有当类实例化了一个对象,非静态方法才会被创建,而当这个对象被销毁时,非静态方法也马上被销毁。(也就是非静态方法属于对象)
也就是说平时项目中我们创建共用方法和共用变量直接创建静态的,那样就可以直接调用,不用再创建对象了,是不是就方便多了。