黑马程序员技术交流社区

标题: 子类中调用父类静态变量的问题 [打印本页]

作者: 吴扬    时间: 2012-6-30 12:00
标题: 子类中调用父类静态变量的问题
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. }
复制代码

作者: 马林康    时间: 2012-6-30 12:01
静态不能使用this 和super关键字
作者: 黑马刘洋    时间: 2012-6-30 12:04
因为静态是“不属于”类的,它不在堆内存中,在一片独立的内存内,因而不能被继承。
因为不属于某个类,所以在静态方法中不能调用this   super因为它没有所属类,同样也不会有对应父类中的静态成员。
作者: 余清兰    时间: 2012-6-30 12:52
静态里是不能用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. }
复制代码

作者: 尹善波    时间: 2012-6-30 14:57
静态方法中不允许访问类的非静态成员,包括成员的变量和方法,因为此时是通过类调用的,没有对象的概念。This,super是不可用的。

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

覆盖不适用于静态方法。
静态方法不可被覆盖。(允许在子类中定义同名静态方法,但是没有多态,严格的讲,方法间没有多态就不能称为覆盖)
作者: 汪璨    时间: 2012-6-30 15:22
1,在静态成员和方法中是不能使用this预定义对象引用的,因为this代表的是调用这个函数的对象的引用,而静态方法是属于类的,不属于对象,
静态成员和方法成功加载后,对象还不一定存在。

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

所以说static修饰了成员和方法后,不能用this和super关键字。





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