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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhanghuxin 中级黑马   /  2013-11-19 09:27  /  1565 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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 构造函数()是一种特殊的函数调用?

评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
狼王 + 1 + 3 继续努力哈,黑马就在前方

查看全部评分

5 个回复

倒序浏览
不太会啊 帮顶  {:soso_e179:} 我对内部类这方面也比较头疼,看看楼下的怎么说

评分

参与人数 1黑马币 +12 收起 理由
狼王 + 12 下面有答案。。。

查看全部评分

回复 使用道具 举报
有new的一句是建立了一个类实例,new Inner();等价于Inner in = new Inner();等号右面的语句。创建了一个Inner类,自动调用其构造方法Inner()。
而你没有new的语句是调用本类的方法Inner(),因为没有该方法所以报错。
Outer.java:4: 找不到符号
符号: 方法 Inner()
位置: 类 Outer
            Inner();
            ^
1 错误

提示你在类Outer中找不到方法Inner(),已经很明确了啊。你在看看。

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 加分了,查收。。。哈哈哈。。。。.

查看全部评分

回复 使用道具 举报 1 0
本帖最后由 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






评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
狼王 + 1 + 3 不错不错,继续努力哈

查看全部评分

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

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 多到论坛活跃哈。。

查看全部评分

回复 使用道具 举报
FFF 金牌黑马 2013-11-19 19:08:46
地板
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
如果没有解决,可能你的问题问得不够清楚。可以重新发问的哦~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马