A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王贺 中级黑马   /  2013-11-29 21:19  /  1190 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class test1 {
static int x=100;
static void m(){
System.out.println(x);
}
}
class test2 extends test1{
  static  int x=200;
   static void m(){
  System.out.println("x="+x);
  System.out.println("super.x="+super.x);//出错了
  super.m();// 出错了
  }

为什么m()函数加个静态就不能掉super.x

评分

参与人数 1技术分 +1 黑马币 +6 收起 理由
枫儿 + 1 + 6 神马都是浮云

查看全部评分

5 个回复

倒序浏览
静态成员是随着类的加载而被加载进了静态方法区而不是堆中,this和super是代表本类对象和父类对象,而本类对象和父类对象是在堆中,所以报错,楼主只要记住,静态方法中不能出现this和super关键字就行了

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1 加油!

查看全部评分

回复 使用道具 举报
这个问题很简单啊,静态方法可以被继承但是不能被覆盖。
1. 当子类没有重新定义静态属性则子类的静态属性与父类的静态属性为同一个变量
2. 当子类重新定义了父类静态属性则子类的静态属性与父类的静态属性是两个不同的变量
原因是因为静态方法调用的是定义这个静态方法的类的静态属性。你加了静态等于新定义了一个方法而已,不存在覆盖和继承的问题。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
super关键字和this关键字差不多,super关键字表示的是父类的具体实例对象,this关键字表示的是本类的具体实例对象
静态方法也叫类方法。在类被加载的时候被初始化,可以通过类名和对象名进行调用,在类内部可以直接调用。仅该方法不需要实例化对象,即可调用。但是对象是在创建时才在内存中生成
super或是this,他们都是相对与某个对象而言的,跟具体的一个对象相关联,他们是对象引用;而static是相对于类而言的,所以在static中不能以任何形式引用super或者this

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
static方法内不能有super this关键字

不知道你需求是什么 不过你可以通过 类名.X 来访问
比如
test1.x

评分

参与人数 1黑马币 +3 收起 理由
简★零度 + 3 加油!

查看全部评分

回复 使用道具 举报
本帖最后由 刘敏 于 2013-11-29 21:54 编辑

class test1 {
static int x=100;
static void m(){
System.out.println(x);
}
}
class test2 extends test1{
  static  int x=200;
   static void m(){
  System.out.println("x="+x);
  System.out.println("test1.x="+test1.x);//出错了, super是父类的对象, 但你使用静态方法的时候在内存中是没有创建对象的,也就是super根本不存在,何来调用之说。可以直接用类名调用
test1.m();// 出错了,可以直接用类名调用
  }
  
  public static void main(String[] args)
  {
          test2.m();
  }
}

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1 可以写点总结之类的

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马