黑马程序员技术交流社区

标题: 静态和super的问题 [打印本页]

作者: yangfengxiao    时间: 2012-9-29 11:03
标题: 静态和super的问题
本帖最后由 yangfengxiao 于 2012-9-29 17:13 编辑
  1. class Fu {
  2.         public static void print(){
  3.                 System.out.println("hah");
  4.         }
  5. }

  6. class Zi extends Fu {
  7.         public static void show(){
  8.                 super.print();[color=Red]//为什么静态方法中不能出现super关键字[/color]
  9.         }
  10.         
  11. }
复制代码

作者: y510662669    时间: 2012-9-29 11:14
static是静态的,它在内存中应该是存在代码区,当一个类被加载时,若类内有静态方法,它会率先执行静态方法,后执行此类的构造方法new出对象,也就是说静态方法是属于此类的。既静态方法里面只能调用静态的方法和属性。不能调用实例方法和实例变量。
因为super这个关键字是操作当前此对象中的父类中的对象,既是针对于对象的,所以不能在静态方法里面使用!

作者: 王玉岩    时间: 2012-9-29 11:23
class Zi extends Fu {
        public static void show(){
                super.print();//静态是属于类的,,随着类的加载而加载,而且在内在中存放的位置也不一样,而this和super关键字是代表对象的,
                                    // 所以在静态方法中不能出现this和super这两个关键字
        }
作者: 孔肖    时间: 2012-9-29 11:23
首先,要弄清static、this和super的定义和作用。
被static修饰的成员(包括成员变量,成员方法等)都是随着类的加载而优先于对象存在的,也就是说类只要加载完成,它就已经存在了,而这时可能对象还没有建立。
this和super都代表的是对象的引用,this代表本类对象的引用,super代表父类对象的引用,而被static修饰是优先于对象存在,对象还没有呢,怎么可能去引用呢。
所以,在static修饰的方法中,是不能出现this和super这样的对象引用关键字的。
作者: 胡斌    时间: 2012-9-29 11:24
注意super使用的3种情况:1.使用super调用超类的构造方法,参见多层继承中的构造方法的调用顺序。2.使用super调用超类被子类覆盖的方法。3.使用super访问超类被子类隐藏的成员变量。
而关于你的题,你可以看看super的使用三种情况,你的方法没有被子类覆盖,故不能用super。而应该这样调用。
example:
class Fu {

        public static void print(){

               System.out.println("hah");

        }

}



class Zi extends Fu {

        public static void show(){

                print();//为什么静态方法中不能出现super关键字

       }



}
public class mele{
       
        public static void main(String[] args)
        {
                Zi z=new Zi();
                z.show();
        }
}

作者: 翁鹏    时间: 2012-9-29 11:52
本帖最后由 翁鹏 于 2012-9-29 13:01 编辑

this,super,static三关键字是互斥的。

前面有人说super是直接超类的引用,我发表一下自己的看法,和大家交流一下。

我认为super不是一个对象的引用,不能将super赋给另一个对象变量,它只是一个指示编译器调用超类方法的特有关键字。

所以,super和this还是有点区别的。
作者: 李润根    时间: 2012-9-29 12:20
super和this都是对象的关键字

静态方法不用new就已经存在了,所以在静态方法不能使用
作者: 陈虹旭    时间: 2012-9-29 12:54
static: 随着类的加载进方法区,而且是优先于对象而存在的
this、super:是当前类、超类的引用,主要是默认存在于栈内存中的引用变量,它会在new出对象的时候指向堆内存中的对象

在这个过程中,static的加载顺序是优先于this、和super的,也就是说static方法存在的时候对象还没有被加载,this、super又代表对象的引用,对象不存在,静态方法是根本不可以能调用对象的。

而且从存放共有数据和特有数据来说也不对:static方法中不能定义对象的特有数据,而this.成员和super.成员都是对象的特有数据,一个在方法区中,一个在堆内存中,这样是不符合的,static只能调用static,也就是静态方法只能调用静态成员。

这是我个人的见解,有不对的地方请谅解,希望对你有帮助!

作者: 刘进朝    时间: 2012-9-29 17:01
静态方法方法属于类里面只能调用静态方法
super调用的都是对象的普通方法,估不能出现在静态方法中

super是需要对象才可以调用的,静态方法是属于类的,没有实例化的对象
作者: 尤洋    时间: 2012-9-29 18:31
super 属于对象引用
静态 优先于对象而存在




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