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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yllw258 初级黑马   /  2012-6-15 09:35  /  1547 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Outer
{
      private int x = 3;
      
      class Inner
      {
             int x = 4;
   
            void function()
            {
                 int = 6;
                 System.out.println(x);//按照老师说的内部类中持有了一个外部类的引用,格式为:Outer.this.x,且此应用默认省略,因此输出是不是6?
            }
      }
      void method()
      {
                 Inner in = new Inner();
                 in.function();
        }
}

6 个回复

倒序浏览
你的代码肯定没有运行过!int = 6;这种错误让人情何以堪?当然,我知道这是int x = 6;的简写形式{:soso_e113:}
内部类的确有一个外部类的引用,但在访问同名变量时,总是有一个规律,那就是,先在近处找,找不到再到远处找。
内部类内部又x,外部类也有,先在内部类找,找到了,就不去外部类找了,输出的是内部类的x。如果内部类没有,此处输出的才是外部类的x。
当你在内部类中可以直接访问到外部类的x,也就证明内部类持有外部类的引用。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
class Outer
{
      private int x = 3;
      
      static class Inner
      {
             int x = 4;
   
            void function()
            {
                 int x= 6;
                 System.out.println(x);// 这种情况下输出 6, 调用的就是本函数的局部变量
                                                   //println(this.x)时输出4,  这里this 是指 Inner
                                                    // println(new Outer().x)时输出 3.    因为Inner是静态的,所以先建立外部类对象:new Outer(),然后调用它的x.
            }
      }
     static void method()
      {
                 Inner in = new Inner();
                 in.function();
        }
  public static void main(String[] args)
{
   method();
}
}

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
你的这个程序是肯定没法运行,外部类调用内部类的方法应该是Outer inner in=new Outer().Inner()。那个输出结果应该是6,内部类持有外部类的引用,可以直接调用外部类的对象,但是如果变量同名时,它会先调用自身的变量,如果在x前面加一个Outer就调用外边的。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
如果按楼主写的程序,则必须使用Outer.Inner in=new Outer().new Inner()来创建内部类实例,如果外部类属性,内部类属性与内部类里方法的局部变量同名,则可通过使用this,外部类类名.this作为限定来区分。
回复 使用道具 举报
典型的对知识点一知半解。代码也没有执行过。
“内部类中持有了一个外部类的引用,格式为:Outer.this.x,且此应用默认省略”是有条件的:外部类和内部类未定义过名字相同的变量
如以下程序就是内部类持有一个对外部类的引用:
  1. class Outer{
  2.     private int x=3;
  3.     class Inner{
  4.           void show(){
  5.            System.out.println("x="+x);
  6.           }
  7.         }
  8.         void method(){
  9.          Inner in=new Inner();
  10.           in.show();
  11.         }
  12. }
  13. class InnerDemo4{
  14.   public static void main(String[] args){
  15.         Outer outer=new Outer();
  16.         outer.method();
  17.   }
  18. }
复制代码
若是你写的这个程序,输出x值为function()中定义的6.这个可以用就近原则解释:对象最终调用的function(),而int x=6存在于function()里,一旦找到,就没必要向上抽取同名的变量。

希望对你有帮助,还有我的建议是:不要一个知识点看了一半,就抛出问题。不管结果如何,有个好的过程,能实实在在的学到东西才是最终目标。何况技术是层出不穷的,更多的是靠自己的自学和思考能力。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报

已解决

本帖最后由 yllw258 于 2012-6-15 13:26 编辑

我明白了,谢谢大家{:soso_e100:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马