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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yangfengxiao 中级黑马   /  2012-9-29 11:03  /  2547 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

9 个回复

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

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
class Zi extends Fu {
        public static void show(){
                super.print();//静态是属于类的,,随着类的加载而加载,而且在内在中存放的位置也不一样,而this和super关键字是代表对象的,
                                    // 所以在静态方法中不能出现this和super这两个关键字
        }

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
首先,要弄清static、this和super的定义和作用。
被static修饰的成员(包括成员变量,成员方法等)都是随着类的加载而优先于对象存在的,也就是说类只要加载完成,它就已经存在了,而这时可能对象还没有建立。
this和super都代表的是对象的引用,this代表本类对象的引用,super代表父类对象的引用,而被static修饰是优先于对象存在,对象还没有呢,怎么可能去引用呢。
所以,在static修饰的方法中,是不能出现this和super这样的对象引用关键字的。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
注意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();
        }
}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 翁鹏 于 2012-9-29 13:01 编辑

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

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

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

所以,super和this还是有点区别的。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
super和this都是对象的关键字

静态方法不用new就已经存在了,所以在静态方法不能使用

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
static: 随着类的加载进方法区,而且是优先于对象而存在的
this、super:是当前类、超类的引用,主要是默认存在于栈内存中的引用变量,它会在new出对象的时候指向堆内存中的对象

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

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

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

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
静态方法方法属于类里面只能调用静态方法
super调用的都是对象的普通方法,估不能出现在静态方法中

super是需要对象才可以调用的,静态方法是属于类的,没有实例化的对象

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
super 属于对象引用
静态 优先于对象而存在
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马