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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hyace 中级黑马   /  2014-3-28 22:28  /  1305 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看毕老师的内部类讲解,发现和我基础测试时候遇到的题一样,外部类中定义一个内部类,每层一个num变量,加上成员函数中的一个num,总共要设法输出三个num,自己敲了一遍,第一次把输出外部类num时的“System.out.println("Outer num"+Outer.this.num)”丢了this,报错是“无法从静态上下文中引用非静态 变量 num“,这个静态上下文指的是什么?不会是main方法吧,谢谢。

  1. /**
  2. 内部类
  3. */

  4. class Outer{
  5.         int num = 3;
  6.         class Inner{
  7.                 int num = 4;
  8.                 void show(){
  9.                         int num = 5;
  10.                         System.out.println("show num:"+num);
  11.                         System.out.println("Inner num:"+this.num);
  12.                         System.out.println("Outer num"+Outer.this.num);
  13.                 }
  14.         }
  15.         void method(){
  16.                 new Inner().show();
  17.         }
  18. }
  19. public class Test12{
  20.         public static void main(String[] args){
  21.                 new Outer().method();
  22.                 //new Outer() .Inner().show();
  23.         }
  24. }
复制代码




2014-03-28_222550.jpg (48.88 KB, 下载次数: 19)

2014-03-28_222550.jpg

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

5 个回复

倒序浏览
静态上下文,你可以通俗的理解为由外部的 static 变量与方法组成的上下文。
拿个例子来说吧,还是在你的代码基本修改:
你在Outer类中分别申明并初始化一个静态变量与一个静态方法:
private static int snum = 1;
private static int sMethod() {
      return 2;
}

然后在Inner类的show方法中,增加下面两句:
System.out.println("Outer static num: " + Outer.snum);
System.out.println("Outer static method: " + Outer.sMethod());

与你原来访问外部实例变量的代码作下对比。

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
这里所说的静态上下文不是指main方法,用类名.的形式去访问类中的成员的时候只能访问类中的静态成员。所以Outer.num会默认去找Outer类中的静态成员变量num,而找到的num确是非静态的,所以会报错。我个人理解这里的静态上下文可以理解成Outer类的静态区,即Outer类中静态成员存储的空间。
要想访问外部类中的非静态成员,只要记住一点,类中的非静态成员只能通过该类的对象访问。

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
冯鸿昌 发表于 2014-3-29 00:25
静态上下文,你可以通俗的理解为由外部的 static 变量与方法组成的上下文。
拿个例子来说吧,还是在你的代 ...

你说的我知道,加上static当然没问题,问题是我原来没有static上下文,不明白从哪报的错。。。谢谢~楼下说的你看下,我也不确定。
回复 使用道具 举报
刘望望 发表于 2014-3-29 00:34
这里所说的静态上下文不是指main方法,用类名.的形式去访问类中的成员的时候只能访问类中的静态成员。所以O ...

谢谢~好像是这样。
回复 使用道具 举报
  1. public class Test7{
  2.         public static void main(String[] args){
  3.         //调用内部类B
  4.                 A.B d=new A().new B();
  5.                 d.func();  
  6.         }
  7.                 static class A{
  8.                         int x = 1;
  9.                         class B{
  10.                                 int x = 2;
  11.                                 void func(){
  12.                                         int x = 3;
  13.                                         //this调用的是本类对象
  14.                                         System.out.println(A.this.x+","+this.x+","+x);
  15.                                 }
  16.                         }
  17.                 }
  18. }
复制代码

方法不是静态的,静态不能调用非静态

评分

参与人数 1技术分 +2 收起 理由
朱神必 + 2

查看全部评分

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