黑马程序员技术交流社区

标题: 关于外部类访问内部类成员的问题 [打印本页]

作者: zhanghuxin    时间: 2013-11-19 09:27
标题: 关于外部类访问内部类成员的问题
class Outer {
        private int i = 10;
        public void makeInner(){
            Inner in = new Inner();
            in.seeOuter();
        }
        class Inner{
            public void seeOuter(){
                System.out.print(i);
            }
        }
}

外部类并不能访问内部类中的成员变量和方法,那外部类中的方法makeInner()怎么能访问内部类的构造函数Inner()来创建内部类的对象呢?求解class Outer {//写成这种形式就不报错
        private int i = 10;
        public void makeInner(){
            new Inner();
        }
        class Inner{
            Inner(){};
        }
}
class Outer {//把new去掉就报错了
        private int i = 10;
        public void makeInner(){
            Inner();
        }
        class Inner{
            Inner(){};
        }
}
为什么呢?难道new 构造函数()是一种特殊的函数调用?
作者: Misaeじ    时间: 2013-11-19 09:51
不太会啊 帮顶  {:soso_e179:} 我对内部类这方面也比较头疼,看看楼下的怎么说
作者: qq379264347    时间: 2013-11-19 11:08
有new的一句是建立了一个类实例,new Inner();等价于Inner in = new Inner();等号右面的语句。创建了一个Inner类,自动调用其构造方法Inner()。
而你没有new的语句是调用本类的方法Inner(),因为没有该方法所以报错。
Outer.java:4: 找不到符号
符号: 方法 Inner()
位置: 类 Outer
            Inner();
            ^
1 错误

提示你在类Outer中找不到方法Inner(),已经很明确了啊。你在看看。
作者: ReFly    时间: 2013-11-19 11:42
本帖最后由 ReFly 于 2013-11-19 11:43 编辑

糊涂呀。构造函数是创建对象时,JVM调用的。只受权限修饰符影响。

你在主函数还可以这样创建内部类对象呢:
Outer.Inner  in= new Outer.Inner();

构造函数是特殊的函数,如果构造函数为私有函数,则不能直接实例化对象。

对象  都可以通过   new +类构造函数   新建出来,只要构造函数权限足够,存在相应参数的构造函数。

你第二个问题中的new Inner();

new Inner();  是一个匿名对象,表示新建了一个对象,但没有名字。

构造函数必须new 对象的时候被自动调用,直接写当然是错的。

你有看到过平时写对象的时候写成 Student();这样的吗?  不都是Student s= new Student();

新建对象,必须new







作者: 雨过丶天已晴    时间: 2013-11-19 11:56
楼主这个问题问的很纠结。
首先,看一看非内部类,如ArrayList,不new对象,你也无法直接访问ArrayList的非静态成员变量或者成员函数,你必须通过new对象,才可以。
外部类无法直接访问外部类中的非静态成员变量或者成员函数,这与前面的ArrayList是相似的。
其实在内部类编译的后,会变成一份单独的字节码文件,只是这个字节码的类名有归属而已,其他性质应与一般字节码相同(个人见解),当然可以用new来创建对象。
希望对楼主有用,错误之处,大家多多指正

作者: FFF    时间: 2013-11-19 19:08
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
如果没有解决,可能你的问题问得不够清楚。可以重新发问的哦~




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