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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴扬 中级黑马   /  2012-6-30 12:00  /  5634 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

B类继承A类,B类中methodB方法调用了父类中的静态变量,但是报错了,看代码:
父类:
  1. public class ClassA {
  2.        
  3.         static int i = 4;
  4.        
  5.         public void methodA()
  6.         {
  7.                 System.out.println(i);
  8.         }
  9. }
复制代码
子类:
  1. public class ClassB extends ClassA{
  2.        
  3.         static int i = 5;
  4.        
  5.         public static void methodB()
  6.        
  7.         {
  8.                 super.i = 3;//报错内容:“静态上下文不能使用super关键字”,为什么静态方法中不能使用super关键字调用父类的静态变量?
  9.                 System.out.println(i + "..." +super.i);//
  10.         }
  11. }
复制代码

5 个回复

倒序浏览
静态不能使用this 和super关键字
回复 使用道具 举报
因为静态是“不属于”类的,它不在堆内存中,在一片独立的内存内,因而不能被继承。
因为不属于某个类,所以在静态方法中不能调用this   super因为它没有所属类,同样也不会有对应父类中的静态成员。

点评

是不属于对象  发表于 2012-6-30 13:18
回复 使用道具 举报
静态里是不能用this或super关键字的,因为静态是随着类的加载就已经存在于内存中了,而this和super是指的一个对象,创建了对象才会存在于内存中,也就是说一个先来后到的原理,
被static修饰的成员变量,是属于某个类的,都可以直接用类名.变量名调用,不能用super。你的代码可以这样写,把父类和子类的i值都打印出来
  1. class ClassA {
  2.         
  3.         static int i = 4;
  4.         
  5.         public void methodA()
  6.         {
  7.                 System.out.println(i);
  8.         }
  9. }

  10. class ClassB extends ClassA{
  11.    
  12.          static int i = 5;
  13.         public static void methodB()
  14.         
  15.         {
  16.                 //super.i = 3;//报错内容:“静态上下文不能使用super关键字”,为什么静态方法中不能使用super关键字调用父类的静态变量?
  17.                 System.out.println("子类的值"+i + "..." +"父类的值"+ClassA.i);
  18.         }
  19.          
  20. }
  21. class wentiDemo
  22. {
  23.             public static void main(String[] args)
  24.          {
  25.                        
  26.                         ClassB.methodB();
  27.       
  28.                 }
  29. }
复制代码

点评

java规范中不推荐直接使用静态变量,本类中最好也加上类名  发表于 2012-6-30 13:19

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
静态方法中不允许访问类的非静态成员,包括成员的变量和方法,因为此时是通过类调用的,没有对象的概念。This,super是不可用的。

一般情况下,主方法是静态方法,所以可调用静态方法,主方法为静态方法是因为它是整个软件系统的入口,而进入入口时系统中没有任何对象,只能使用类调用。

覆盖不适用于静态方法。
静态方法不可被覆盖。(允许在子类中定义同名静态方法,但是没有多态,严格的讲,方法间没有多态就不能称为覆盖)
回复 使用道具 举报
1,在静态成员和方法中是不能使用this预定义对象引用的,因为this代表的是调用这个函数的对象的引用,而静态方法是属于类的,不属于对象,
静态成员和方法成功加载后,对象还不一定存在。

2.super的用法跟this类似,this代表对本类对象的引用,指向本类已经创建的对象,而super代表对父类对象的引用,指向父类对象,
静态优先于对象存在。
因为静态优先于对象存在,所以成员和方法被静态修饰之后方法先存在,而方法里面要用到super指向的父类对象,但是所需的父类引用对象晚于该方法出现,
也就是super所指向的对象没有,当然就会出错。

所以说static修饰了成员和方法后,不能用this和super关键字。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马