黑马程序员技术交流社区

标题: 关于静态的这点事 [打印本页]

作者: 王贺    时间: 2013-11-29 21:19
标题: 关于静态的这点事
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

作者: xibozglr    时间: 2013-11-29 21:32
静态成员是随着类的加载而被加载进了静态方法区而不是堆中,this和super是代表本类对象和父类对象,而本类对象和父类对象是在堆中,所以报错,楼主只要记住,静态方法中不能出现this和super关键字就行了
作者: 衣带赞    时间: 2013-11-29 21:36
这个问题很简单啊,静态方法可以被继承但是不能被覆盖。
1. 当子类没有重新定义静态属性则子类的静态属性与父类的静态属性为同一个变量
2. 当子类重新定义了父类静态属性则子类的静态属性与父类的静态属性是两个不同的变量
原因是因为静态方法调用的是定义这个静态方法的类的静态属性。你加了静态等于新定义了一个方法而已,不存在覆盖和继承的问题。
作者: aion2013tian    时间: 2013-11-29 21:42
super关键字和this关键字差不多,super关键字表示的是父类的具体实例对象,this关键字表示的是本类的具体实例对象
静态方法也叫类方法。在类被加载的时候被初始化,可以通过类名和对象名进行调用,在类内部可以直接调用。仅该方法不需要实例化对象,即可调用。但是对象是在创建时才在内存中生成
super或是this,他们都是相对与某个对象而言的,跟具体的一个对象相关联,他们是对象引用;而static是相对于类而言的,所以在static中不能以任何形式引用super或者this
作者: 王明明    时间: 2013-11-29 21:49
static方法内不能有super this关键字

不知道你需求是什么 不过你可以通过 类名.X 来访问
比如
test1.x
作者: 刘敏    时间: 2013-11-29 21:51
本帖最后由 刘敏 于 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();
  }
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2