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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程有愿 中级黑马   /  2012-7-3 15:52  /  2538 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我只知道内部类可以访问外部类的成员,包括被private修饰的成员,那么外部类外为什么可以访问被private修饰的内部类的成员呢?求解释啊!!!

11 个回复

倒序浏览
不可以,外部类要访问内部类成员,必须通过创建对象来实现,而创建的对象不可以访问类中的private成员。
回复 使用道具 举报
这个也很好理解,其实内部类相当于外部类中的一个成员,既然是外部类的成员,
外部类当然可以访问自己的成员啦,不管是用public修饰还是用private修饰都可以。
这就好比如成员变量被private修饰了,类是还是可以访问该变量的。
再举个具体点的例子:
class Person{
    private String name; //可以在这里把内部类看成一个整体,相当于成员变量:name
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return this.name;
    }


程序中类是可以访问私有成员的,不知道你的问题解决了没呢?


回复 使用道具 举报
不可以,你可以在内部类创建对外开放的方法 set跟get 方法
回复 使用道具 举报
本帖最后由 翁游龙 于 2012-7-3 16:29 编辑
刘建龙 发表于 2012-7-3 16:00
不可以,外部类要访问内部类成员,必须通过创建对象来实现,而创建的对象不可以访问类中的private成员。 ...

可能有些情况是不可以,但是有些情况是允许的。
只是情况不同,给你看看以下程序你应该就明白了:

public class InnerTest {


        public static void main(String[] args) {
                Outer out = new Outer(); //实例化外部类对象
                out.show();
                out.in.print();
        }


}


class Outer {  //外部类
        private int i = 10; //成员变量


        Inner in = new Inner(); //在外部类中实例化内部类


        public void show(){
                System.out.println("内部类的私有变量name=" + in.name);
        }


        class Inner {  //成员内部类
                private String name = "sam";
                public void print() {
                        System.out.print("外部类的私有属性i=" +i);
                }
        }
}

运行结果为:
内部类的私有变量name=sam
外部类的私有属性i=10

程序中,内部类既可以访问外部类的私有成员变量i,外部类也可以访问内部类的私有成员变量name
所以这种情况是允许的。



评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1 很给力!

查看全部评分

回复 使用道具 举报
翁游龙 发表于 2012-7-3 16:27
可能有些情况是不可以,但是有些情况是允许的。
只是情况不同,给你看看以下程序你应该就明白了:

嗯,明白了,我一直以为不可以呢,呵呵
回复 使用道具 举报
情况不同用法也会不同,要根据不同的环境用不同的方法:

对于成员内部类在外部类的内部可以直接使用inner s=new inner();
而在外部类的外部,要生成一个内部类对象,需要首先建立一个外部类对象,然后在生成一个内部类对象。
Outer.Inner in=Outer.new.Inner()。

局部内部类不仅可以访问外部类实例变量,还可以访问外部类的局部变量,前提是外部类的局部变量必须为final
在类外不能直接生成局部内部类。
要想使用局部内部类时需要生成对象,对象调用方法,在方法中才能调用其局部内部类。


静态内部类只能访问外部类的静态成员。
生成一个静态内部类不需要外部类成员,静态内部类的对象可以直接生成:
Outer.Inner in=new Outer.Inner();
静态内部类不可用private来进行定义。

匿名内部类 看名字就知道局部内部类的所有限制都对其生效,不再多说
回复 使用道具 举报
private的是不能访问的吧{:soso_e132:}
回复 使用道具 举报
外部类不能访问被private修饰的内部类成员

private修饰的任何成员,只在本类中可以访问
回复 使用道具 举报
翁游龙 发表于 2012-7-3 16:27
可能有些情况是不可以,但是有些情况是允许的。
只是情况不同,给你看看以下程序你应该就明白了:

你好,我还是不明白为什么name可以在外面访问,
回复 使用道具 举报
请楼主先别结贴,我不明白上面“地板”的那个程序,i可以在下面内部访问,因为i的作用域吧;但我不明白为什么name是可以在外面访问的。
回复 使用道具 举报
1、内部类分为成员内部类、静态嵌套类、方法内部类、匿名内部类
几种内部类的共性:
A、内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类命和$符号。
B、内部类不能用普通的方式访问,内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。

外部类不能访问被private修饰的内部类成员



回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马