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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑冬 中级黑马   /  2012-6-12 16:17  /  1835 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郑冬 于 2012-6-12 17:39 编辑

有这么一段程序,关于外部类访问非静态内部类成员的,找了很久,没有发现问题出现在了什么地方,运行出错
class Outer
{
       private int outp = 9;
       class Inner
      {
              private int inp = 5;
              public void Outp()
            {
                  System.out.println("外部类的outp属性值:" + outp);
            }
       }
              public void Inp()
           {
                   System.out.println("内部类的inp属性值:" + inp);
                   System.out.println("内部类的inp属性值:" + new Inner().inp);
            }
             public static void main(String[] args)
            {
                   Outer out = new Outer();
                   out.Inp();
             }
}

10 个回复

倒序浏览
public void Inp()
{
                   System.out.println("内部类的inp属性值:" + inp);  //此方法不可以访问内部类中的私有成员
                   System.out.println("内部类的inp属性值:" + new Inner().inp);
  }

评分

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

查看全部评分

回复 使用道具 举报
唐辉辉 发表于 2012-6-12 16:23
public void Inp()
{
                   System.out.println("内部类的inp属性值:" + inp);  //此方法不 ...

为什么呢?是因为此时内部类对象不存在吗?
回复 使用道具 举报
内部类可以直接访问外部类中的成员,包括私有。之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用。
但是外部类就不可以访问。

System.out.println("内部类的inp属性值:" + new Inner().inp);都知道要创建Inner对象才可以去访问内部类中的成员。
怎么上面那个System.out.println("内部类的inp属性值:" + inp);  就不明白了?

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 wyl530274554 于 2012-6-12 16:37 编辑

外部类要访问内部类,必须先建立内部类对象,你还没有建立
回复 使用道具 举报
本帖最后由 宋浩 于 2012-6-12 16:48 编辑

内部类(inner class),也称为嵌入类(nested class),它是定义在其他类的内部。
内部类作为其外部类的一个成员,与其他成员一样,可以直接访问其外部类的数据和方法。
只不过相比较外部类只有public和默认的修饰符不同,内部类作为一个成员,
可以被任意修饰符修饰。编译器在编译时,内部类的名称为OuterClass$InnerClass.class

利用new构造方法构造一个外部类对象时,并没有连带着构造一个内部类对象,故需要访问内部类方法时,
必须使用new操作符为这个外部类对象再构造一个内部类对象。

所以,外部类访问内部类的方法或者变量的时候必须new一个内部类的对象。由于你第一个没有new内部
类的对象,当然无法访问啦!

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 有必要弄个美女头像么?

查看全部评分

回复 使用道具 举报
楼上该说的都说了,内部类可以直接访问外部类的所有成员,但是外部类想要访问内部类的成员却不能直接访问,要通过内部类的对象或者内部类来访问
public void Inp()
            {
                    System.out.println("内部类的inp属性值:" + inp);// Java编译器不识别这样的写法,可以用类的对象来调用
                    System.out.println("内部类的inp属性值:" + new Inner().inp);
             }

评分

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

查看全部评分

回复 使用道具 举报
王超 中级黑马 2012-6-12 17:31:01
8#
内部类可以直接访问外部类的所有成员
外部类需要通过内部类的对象来访问内部类
所以:System.out.println("内部类的inp属性值:" + inp);// 编译出错

上面的回答都很对啊   很能给技术分吗?{:soso_e101:}
回复 使用道具 举报
郑冬 中级黑马 2012-6-12 17:38:52
9#
郑传庆 发表于 2012-6-12 17:06
楼上该说的都说了,内部类可以直接访问外部类的所有成员,但是外部类想要访问内部类的成员却不能直接访问, ...

终于搞懂了
回复 使用道具 举报
杨天皓 发表于 2012-6-12 16:29
内部类可以直接访问外部类中的成员,包括私有。之所以可以直接访问外部类中的成员,是因为内部类中持有了一 ...

终于弄懂了
回复 使用道具 举报
内部类的访问规则:

1,内部类可以直接访问外部类中的成员,包括私有。

       之所以可以直接访问外部类中的成员,是内部类中持有了一个外部类的引用。格式:外部类名.this

2,外部类要访问该内部类,必须建立内部类对象;

注意:当内部类中定义了静态成员,该内部类必须是静态的。

      当外部类中的静态为方法访问内部类时,内部类也必须是静态的。

你这段代码出现的问题楼上的说的很明白了,希望补充的能对你有帮助。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马