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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

如题,静态方法中为什么不能写this和super?这两者之间的区别是什么呢?

11 个回复

倒序浏览
静态方法是对象无关的,也就是没有类的实例对象也能调用类的静态方法,而this和super指向的是对象的引用,但在调用静态方法的时候可能还没创建这个类的实例对象,这时this就没有意义了,

评分

参与人数 1黑马币 +3 收起 理由
itpower + 3

查看全部评分

回复 使用道具 举报
1.      在静态方法中是不能使用this预定义对象引用的,即使其后边所操作的也是静态成员也不行.
因为this代表的是调用这个函数的对象的引用,而静态方法是属于类的,不属于对象,静态方法成功加载后,对象还不一定存在

2.      在问题之前先讲super的用法:
1.super的用法跟this类似,this代表对本类对象的引用,指向本类已经创建的对象;而super代表对父类对象的引用,指向父类对象;
2.静态优先于对象存在;
3.由上面的1.和2.知:
因为静态优先于对象存在,所以方法被静态修饰之后方法先存在,而方法里面要用到super指向的父类对象,但是所需的父类引用对象晚于该方法出现,也就是super所指向的对象没有,当然就会出错。
综上,静态方法中不可以出现super关键字。

3.  首先你要明白对象和类的区别。
this和super是属于对象范畴的东西,而静态方法是属于类范畴的东西
所有的成员方法,都有一个默认的的参数this(即使是无参的方法),只要是成员方法,编译器就会给你加上this这个参数如:
Class A中
void method1(){}实际上是这样的--------> void method1(A this)
void method2(int x){}实际上是这样的--------> void method2(A this, int x)
而静态方法与对象无关,根本不能把对象的引用传到方法中,所以不能用this


4.      在一个类中定义一个方法为static,则为静态方法,那就是说,无需本类的对象即可调用此方法,调用一个静态方法就是“类名.方法名”

既然"无需本类的对象即可调用静态方法",而this和super关键字都是用于本类对象的-----调用静态方法无需本类的对象这句话很清楚表明:静态方法中不能用this和super关键字

5.      静态方法是存放在内存中的数据段里,this和super调用的是堆空间里的应用对象不能调用数据段区域里的数据,因此静态方法中不能用this和super关键字

6.      静态方法和静态类不属于单个对象,而是类的所有对象共享使用
而this代表当前对象

7.    东西只属于类,不属于任何对象,所以不能用this和super。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
静态方法中为什么不能写this和super?

静态优先于对象存在,this 和 super 是针对对象来说的,对象都没加载呢怎么会有this 和super 呢?因此在静态中不可能存在 this 和super。


这两者之间的区别是什么呢?

this :  1.指当前对象.
         2.如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名。
         3.调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)

super: 1.调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。
          2.它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时)。

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
静态方法只和有关,和对象没有关系
静态方法方法属于类里面只能调用静态方法
this和super调用的都是对象的普通方法,都不能出现在静态方法中
this和super是需要对象才可以调用的,
this:是操作当前此类对象
super:是操作当前父类中的对象;这个例子是我从网上找的可以看看挺清楚的            class  父亲 {
              int i =1;
              public 父亲(){
                  System.out.println("我是父亲!");
              }
              public void nb() {
                     System.out.println("我是父亲的方法!");
             }
          }

class 儿子 extends 父亲 {
         int i =3 ; //  父类中的 i  ,被 子类的 i 引藏了, 要怎样得到父类的 i 呢?
         public 儿子() {
          super();  //    调用父类的构造 ,输出啥???
      System.out.println("我没参数哦");
         System.out.println("父类的 i 是 " + super.i); // super.i 调用父类 i
        }
       public 儿子(int i) {
         this(); //     调用 子类上面的 无参数的 构造
       System.out.println("我是宝宝!")
           this.i = i ;  //    "="号右面的 i  是您传近来的 值 , this.i  表示当前子类的i ,"3";
        
      }
     
    public void nb() {
     super.nb(); //调用父类的 nb方法. 输出啥???
    System.out.println("子类方法");
    System.out.println(i + " i  等于您传近来的值了")  
  }
   public static void main(String[] args) {
       new 儿子(10000)  //您看看子类bn方法 输出的 i 是 3 还是 10000;
  }


}



评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
Sniper_qiu 发表于 2014-4-13 09:40
1.      在静态方法中是不能使用this预定义对象引用的,即使其后边所操作的也是静态成员也不行.
因为this代 ...

这是你写的吗
回复 使用道具 举报
1静态方法只能调用静态修饰的方法或者常量,而非静态则没有这个限制
2.既然你的方法已经是静态的了所以里面调用其他的方法则必须也是静态的,而静态的在本类中可以直接使用而在其他类中必须是类名调用,而this和super这里指的实际是对象,所以不符合

评分

参与人数 1黑马币 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
静态修饰的类是不能够被实例化对象的,没有对象,所以没有this和super
this和super的区别:this代表当前类对象的引用,super代表父类对象的引用
回复 使用道具 举报
因为静态方法是不需要创建实例对象的,直接可以调用的方法
this是引用当前对象
super是引用父类对象
既然静态方法无需创建对象就可调用,而this和super的前提是对象存在,当然是不能在静态方法中出现的

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
Sniper_qiu 发表于 2014-4-13 09:40
1.      在静态方法中是不能使用this预定义对象引用的,即使其后边所操作的也是静态成员也不行.
因为this代 ...

回答的真好{:3_66:}受教了
回复 使用道具 举报
this是对象的引用,super可以调用父类方法,也可以视作为引用(虽然不是),static方法,是随着类的加载而加载的,与对象无关,所以static方法中不能出现this和super关键字
回复 使用道具 举报
1.因为this代表的是调用这个函数的对象的引用,super是对父类对象的引用,而静态方法是属于类的,不属于对象,静态方法成功加载后,对象还不一定存在.所以在先存在的静态方法里调用未存在的对象是不对的.
2.静态方法是存放在内存中的数据段里,this和super调用的是堆空间里的应用对象,不能调用数据段区域里的数据,因此静态方法中不能用this和super关键字.
3.this和super是属于对象范畴的东西,而静态方法是属于类范畴的东西,所有的成员方法,都有一个默认的的参数this,只要是成员方法,编译器就会给你加上this这个参数如:
Class A中的
void print(){};   ----->其实是void print(A this);
而静态方法是和类相关的,它不是成员方法,所以不能引用this对象.

综上可得!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马