`

请教一个相当基础的问题,Java中为什么拥有类可以访问内部类的私有成员?

阅读更多
public  class  Outer  { 
    public  class  Inner  { 
        private  int  i=0; 
        private  Inner()  { 
            this.i=1; 
        } 
    } 

    public  Inner  getInner()  { 
        return  new  Inner(); 
    } 

    public  static  void  main(String[]  args)  { 
        Outer  outer  =  new  Outer(); 
        Inner  inner  =  outer.getInner(); 
        System.out.println(inner.i); 

    } 


大家都知道非内部类的私有成员只能是类自有方法才能访问,其他类不管用什么方法都不能访问;而在上面代码中,为什么Outer类的main方法能通过Inner类的实例outer访问私有成员i??? 出发点在哪?
分享到:
评论
13 楼 dunjh 2006-09-15  
唉,终于找到了:

http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.6

这句:

Otherwise, if the member or constructor is declared private, then access is permitted if and only if it occurs within the body of the top level class (§7.6) that encloses the declaration of the member or constructor.

所以就算你把代码改成这样:

public class Outer {
    public class Inner {
        private int i=0;
        private Inner() {
            this.i=1;
        }
    }
    public class Inner2 {
        private void checkInner() {
            Inner inner = new Inner();
            System.out.println(inner.i);
        }
    }
    public Inner getInner() {
        return new Inner();
    }
    public static void main(String[] args) {
        Outer outer = new Outer();
        Inner inner = outer.getInner();
        System.out.println(inner.i);
        outer.new Inner2().checkInner();
    }
}


照样是可以通过的。并不是因为容器类可以访问内部类的private成员的原因。楼上的朋友说得应该是对的。
12 楼 bygoner 2006-09-15  
楼主你的main方法是和Inner在同一个类中的.所以可以通过Inner类访问到它的private方法了.你在别的类的main方法试试看就不行了.
11 楼 ddandyy 2006-09-15  
感觉你没看明白那句3  他的意思是  访问方式一样 不是可访问的资源一样
10 楼 ssos 2006-09-15  
gqdou 写道
你可以动手试一下,我直接告诉你答案不足让你完全信,实践出真知,你印象会非常深刻.


class Inner2 {
private int i=0;
private Inner2() {
this.i=1;
}
}

public class Outer2 {

public Inner2 getInner2() {
return new Inner2();
}

public static void main(String[] args) {
Outer2 outer2 = new Outer2();//根本就不能实例化
Inner2 inner2 = outer2.getInner2();
System.out.println(inner2.i);//不能访问i
}
}

而上面这段代码就肯定有问题了:
9 楼 ssos 2006-09-15  
gqdou 写道
你可以动手试一下,我直接告诉你答案不足让你完全信,实践出真知,你印象会非常深刻.

我知道这段代码运行没问题,可我想弄清楚,为什么会这样?
8 楼 gqdou 2006-09-15  
你可以动手试一下,我直接告诉你答案不足让你完全信,实践出真知,你印象会非常深刻.
7 楼 ssos 2006-09-15  
一直想不明白,为什么Java的private关键字到这儿就不灵了,是Java故意如此,还是有什么别的原因?
6 楼 ssos 2006-09-15  
gqdou 写道
明明是你用内部类的对象来访问的i这个私有属性的,怎么说是外部类来访问?
关于内部类我做个一个小的总结,你可以参考一下.
http://redhacker.blueidea.com/archives/2006/2923.shtml


谢谢你的总结,不过文章里的结论的第三条写的:
3、外部类对其内部类的属性和方法的访问和访问其他类一样,需要先构造一个对象然后进行访问,不过对于内部类的构造首先要构造一个外部类,进而进一步进行构造内部类。

即然,外部类对其内部类的属性和方法的访问和访问其他类一样,好了,外部类能通过访问其他类的实例访问其他类的私有属性吗?
5 楼 ssos 2006-09-15  
ddandyy 写道
同一楼  外部的out根本就没调用那个private
他调用的是public的get方法


public的get方法在哪?
4 楼 ddandyy 2006-09-15  
同一楼  外部的out根本就没调用那个private
他调用的是public的get方法
3 楼 ssos 2006-09-15  
adamzhao 写道
因为main是Outer本身的方法咯
确实是用内部类的对象来访问的i这个私有属性的,难道通过对象就能访问私有属性?换个非内部试试
2 楼 adamzhao 2006-09-15  
因为main是Outer本身的方法咯
1 楼 gqdou 2006-09-15  
明明是你用内部类的对象来访问的i这个私有属性的,怎么说是外部类来访问?
关于内部类我做个一个小的总结,你可以参考一下.
http://redhacker.blueidea.com/archives/2006/2923.shtml

相关推荐

    Java反射机制,通过对象访问调用类的私有成员或方法

    Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地获取类的信息并操作类的对象。这一机制的核心在于,Java程序可以获取到关于任何类的内部信息,包括类名、属性、方法、构造器等,并能在运行时...

    e语言-类的私有成员实现从外部访问

    资源介绍: 学习过其他语言的同学都知道,类都是有公共属性的,可以直接用赋值的方式来修改,但易语言只有私有成员,无法直接用赋值的方式来改动私有成员的数据值,这个例程演示了如何把内部私有成员的数据地址跟...

    java内部类总结(含概念和实例)

    2. 局部内部类:在方法中定义的内部类,局部内部类不能有访问说明符,因为它不是外围类的一部分,但是它可以访问当前代码块内的常量,和此外围类所有的成员。 3. 静态内部类:静态内部类是指在外部类的静态成员中...

    类的私有成员实现从外部访问

    学习过其他语言的同学都知道,类都是有公共属性的,可以直接用赋值的方式来修改,但易语言只有私有成员,无法直接用赋值的方式来改动私有成员的数据值,这个例程演示了如何把内部私有成员的数据地址跟外部变量的...

    Java 深入理解嵌套类和内部类

    在外部类中定义内部类可以使得内部类访问外部类的所有成员变量和方法。例如,在上面的代码中,内部类 Inner 可以访问外部类的成员变量 outer_x。 五、内部类的使用注意事项 在使用内部类时,需要注意以下几点: *...

    Java的内部类讲解案例代码(成员内部类、局部内部类、匿名内部类、静态内部类、外部类访问四种内部类、其他类访问四种内部类...)

    比如,你可以在一个类中定义一个私有的内部类,用于实现某种算法或者提供一个特定的服务。内部类的作用域仅限于其外部类,可以访问外部类的成员,同时又能保护类的封装性。 目标: 通过这个源码资源,你将学会以下...

    Java语法总结 - 内部类

    Java内部类是Java语言中的一种特殊类别,它是指定义在另外一个类内部的类。内部类可以访问外部类的所有成员变量和方法,包括私有的变量和方法。内部类可以分为四种:成员内部类、静态嵌套类、方法内部类和匿名内部...

    编写Student类,类中包含学生姓名,学号等私有数据成员。使用JAVA反射机制修改一个学生对象的私有数据成员

    编写Student类,类中包含学生姓名,学号等私有数据成员。 使用JAVA反射机制修改一个学生对象的私有数据成员(不允许调用setters)

    java 利用反射获取内部类静态成员变量的值操作.docx

    接下来,我们将通过一个具体的例子来演示如何使用Java反射获取内部类的静态成员变量的值。 ##### 示例代码分析 假设我们有如下的类结构: ```java public class Goods { static class Apple { // 内部类 public ...

    java基础java内部类

    内部类的最大优点在于它可以独立地继承一个接口的实现,不受外围类的限制,解决了Java中不支持多继承的问题。此外,内部类还有以下特性: (1) 每个内部类实例都有自己的状态信息,与其他外围对象的状态信息相互独立...

    java 匿名内部类的使用规范

    Java匿名内部类是Java语言中一个独特且强大的特性,它允许我们在不需要定义一个单独的类的情况下创建类的实例。这在处理回调、事件监听、单例模式以及其他需要短时间内定义一个简单类的情况时非常有用。本篇文章将...

    java内部类详解

    局部内部类不能声明为 static,也不能被外部类访问,除非通过方法返回。 4. 匿名内部类(Anonymous Inner Class) 匿名内部类没有名字,通常用于简短的、一次性的实现。它们常用于接口回调或简化创建继承自特定类...

    Java类中的私有成员的继承机制.pdf

    Java 类的私有成员(private members)在继承机制中的行为是一个关键的概念,它涉及到类的封装性和面向对象编程的基本原则。通常,私有成员(包括字段和方法)在其定义的类内部是可访问的,但在类的外部以及子类中是...

    java内部类的讲解

    - **减少命名冲突**:通过将类定义在另一个类的内部,可以避免全局命名空间中的命名冲突问题,每个内部类都有自己的作用域。 - **更精细的访问控制**:内部类可以访问外部类的私有成员,这提供了更精细的封装和数据...

    Java反射访问私有变量和私有方法.doc

    代理类是 Java 语言中的一种机制,使得我们可以在运行时创建一个代理类,继承自原始类,并且可以访问原始类的非公有成员变量或方法。 优点:这种方法可以在运行时创建一个代理类,继承自原始类,非常灵活。 缺点:...

    java 内部类使用(内部匿名类)

    Java内部类是Java语言提供的一种独特机制,它允许在一个类的内部定义另一个类。这种设计模式使得代码结构更紧凑,可以更好地封装和隐藏实现细节,同时也增强了代码的复用性。内部类分为几种类型,包括成员内部类、...

    java 成员内部类的使用规范

    Java成员内部类是一种在类内部定义的类,它可以访问外部类的所有成员,包括私有成员。成员内部类的使用在Java编程中具有独特的价值,它能够帮助我们更好地封装代码,提高代码的组织性和可读性。以下是关于Java成员...

    C#net反射实现访问类中的私有变量或者方法

    在上述代码中,我们定义了一个名为`ChangeValue`的类,该类包含一个私有字符串变量`myValue`和两个公共方法:构造函数和`WriteLine`方法。`Test`类中的`Main`方法则演示了如何使用反射来修改`ChangeValue`类实例中的...

    java 内部类应用

    Java内部类是Java语言的一个特色特性,它允许我们在一个类的内部定义另一个类。这种设计模式在处理一些特定情况时非常有用,例如实现匿名回调、封装特定逻辑或创建与外部类有紧密关系的类。本篇文章将深入探讨Java...

    Java内部类(DOC)

    Java内部类是Java语言中一个重要的概念,它指的是那些类定义被嵌套在其他类定义中的类。与之相对应的是顶层类,即那些类定义没有被嵌套在其他类中的类。内部类又可以进一步细分为几种类型:静态成员类、成员类、局部...

Global site tag (gtag.js) - Google Analytics