为什么如下错误?

wingofsea 2005-10-19 08:40:01
interface A{
int x=0;
}
class B{
int x=1;
}
class C extends B implements A{

static int x=2;
public void pX(final int x){
//int x=3;
System.out.println(x);
}

public static void main(String[] args){
new C().pX(super.x);
}
}


Cannot use super in a static context , 为什么?
...全文
142 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
fankobe 2005-10-21
  • 打赏
  • 举报
回复
当一个创建一个子类的对象时,子类的对象里面会自动创建一个父类的对象,就是说子类对象总是包含一个父类的对象,而这个父类的对象就是通过super这个关键字指向的。当这里你应该知道这super是与对象相关的,就不可能是static的,所以你不能在static的main方法中使用super。
晨星 2005-10-21
  • 打赏
  • 举报
回复
干吗从stack和heap的角度说啊?
yanxiazhiqiu 2005-10-20
  • 打赏
  • 举报
回复
class A{
void f1(){}
}

public class B extends A{
void f2(){super.f1();}
}
Lee_seu 2005-10-20
  • 打赏
  • 举报
回复
我记得super只能在构造函数中用。别的地方不行。
wingofsea 2005-10-20
  • 打赏
  • 举报
回复
那从stack和heap的角度说呢?
紫炎圣骑 2005-10-19
  • 打赏
  • 举报
回复
同意楼上

静态方法是没有对象可以调用的,可以直接使用 类名.静态方法名 来使用

当然如果在同一个类中,也可以直接使用。
晨星 2005-10-19
  • 打赏
  • 举报
回复
当然,以上只是从道理上解释一下原因。
从简单的角度说,“静态方法不能调用非静态成员”这是Java语法规定的,违反语法的事当然编译器不会允许的。
晨星 2005-10-19
  • 打赏
  • 举报
回复
因为静态方法隶属于整个类,没有对象也可以调用,而非静态方法只能从对象上调用。
比如类A又静态方法f和非静态方法g,那么调用f可以直接
A.f();
而调用g则必须:
A a;
a.f();
wingofsea 2005-10-19
  • 打赏
  • 举报
回复
那为什么静态方法不能调用非静态成员呢?
晨星 2005-10-19
  • 打赏
  • 举报
回复
分别用来表示父类对象部分和对象本身。
晨星 2005-10-19
  • 打赏
  • 举报
回复
super,this等都是用于非静态成员的。

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧