黑马程序员技术交流社区

标题: 关于内部类的一个问题<已解决> [打印本页]

作者: 郑冬    时间: 2012-6-12 16:17
标题: 关于内部类的一个问题<已解决>
本帖最后由 郑冬 于 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();
             }
}


作者: 唐辉辉    时间: 2012-6-12 16:23
public void Inp()
{
                   System.out.println("内部类的inp属性值:" + inp);  //此方法不可以访问内部类中的私有成员
                   System.out.println("内部类的inp属性值:" + new Inner().inp);
  }
作者: 郑冬    时间: 2012-6-12 16:28
唐辉辉 发表于 2012-6-12 16:23
public void Inp()
{
                   System.out.println("内部类的inp属性值:" + inp);  //此方法不 ...

为什么呢?是因为此时内部类对象不存在吗?
作者: 杨天皓    时间: 2012-6-12 16:29
内部类可以直接访问外部类中的成员,包括私有。之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用。
但是外部类就不可以访问。

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

作者: 黑马-王言龙    时间: 2012-6-12 16:36
本帖最后由 wyl530274554 于 2012-6-12 16:37 编辑

外部类要访问内部类,必须先建立内部类对象,你还没有建立
作者: 宋浩    时间: 2012-6-12 16:46
本帖最后由 宋浩 于 2012-6-12 16:48 编辑

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

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

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


作者: 郑传庆    时间: 2012-6-12 17:06
楼上该说的都说了,内部类可以直接访问外部类的所有成员,但是外部类想要访问内部类的成员却不能直接访问,要通过内部类的对象或者内部类来访问
public void Inp()
            {
                    System.out.println("内部类的inp属性值:" + inp);// Java编译器不识别这样的写法,可以用类的对象来调用
                    System.out.println("内部类的inp属性值:" + new Inner().inp);
             }

作者: 王超    时间: 2012-6-12 17:31
内部类可以直接访问外部类的所有成员
外部类需要通过内部类的对象来访问内部类
所以:System.out.println("内部类的inp属性值:" + inp);// 编译出错

上面的回答都很对啊   很能给技术分吗?{:soso_e101:}
作者: 郑冬    时间: 2012-6-12 17:38
郑传庆 发表于 2012-6-12 17:06
楼上该说的都说了,内部类可以直接访问外部类的所有成员,但是外部类想要访问内部类的成员却不能直接访问, ...

终于搞懂了

作者: 郑冬    时间: 2012-6-12 17:39
杨天皓 发表于 2012-6-12 16:29
内部类可以直接访问外部类中的成员,包括私有。之所以可以直接访问外部类中的成员,是因为内部类中持有了一 ...

终于弄懂了

作者: 逝去的记忆ヽ    时间: 2012-6-12 17:39
内部类的访问规则:

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

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

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

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

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

你这段代码出现的问题楼上的说的很明白了,希望补充的能对你有帮助。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2