黑马程序员技术交流社区

标题: 外部访问内部类 [打印本页]

作者: 王川    时间: 2013-4-8 02:59
标题: 外部访问内部类
  1. class Outer {
  2.         class Inner {
  3.                 private void innerMethod(String str) {
  4.                         System.out.println(str);
  5.                 }
  6.         }
  7. }
复制代码
怎么在Outer类外部能执行内部类的私有方法。欢迎大神讨论!

{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}{:soso_e141:}

作者: 曹宇    时间: 2013-4-8 03:28
...难倒我了,等大神.,..


我个人想法是,内部类中提供 访问方式,外部类调用,
外部类提供这个调用的访问方式  其他类调用这个然后才能调用到内部类....


好像很费事啊
作者: Friendy89    时间: 2013-4-8 05:51
内部类的访问规则:
  1,内部类可以直接访问外部类中的成员,包括私有。之所以可以直接访问外部类中成员,是因为内部类中持有了一个外部类的引用,格式:外部类名.this ( 如:Outer.this)
  2,外部类要访问内部类,必须建立内部对象。
直接访问内部类中成员的格式:
    外部类名.内部类名 变量名称=new 外部类对象.new 内部类对象,如:Outer.Inner in=new Outer().new Inner();
  3,当内部类在成员位置上,就可以被成员修饰符所修饰。比如,
        private:将内部类在外部类中进行修饰。
        static:内部类就具备static特性。当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限。

注意:当内部类中定义了静态成员,该内部类必须是static的。
      当外部类中的静态方法访问内部类时,内部类也必须是静态的。
作者: lcjasas    时间: 2013-4-8 08:19
内部类就相当于一个外部类的成员变量,所以可以直接访问外部变量,外部类不能直接访问内部类变量,必须通过创建内部类实例的方法访问,new InnerClass().
就是创建内部类实例访问内部类成员变量。
按常规,私有变量只能在InnerClass里被访问,但要注意,内部类就相当于一个外部类的成员变量,举个例子.
class Outer{
        private int m;
        private class Inner
        {
           private int n;private int k;
        }
    }
m和类Inner都是成员变量,他们之间是平等的,唯一不同的就是Inner它是包装了几个成员变量比如n,k,也就是说m n k是平等的,区别在于访问n k要通过Inner,就是要建立Inner实例访问nk。
作者: 谢达    时间: 2013-4-8 08:24
用暴力反射吧,下面是我的代码
  Outer.Inner inner = new Outer().new Inner();
   Class clazz= inner.getClass();
   Method [] methods = clazz.getDeclaredMethods();
   for(Method method : methods){
        method.setAccessible(true);
        if("innerMethod".equals(method.getName())){
        method.invoke(inner, "hello");
         }
     }
作者: 刘胜寒    时间: 2013-4-8 08:39
谢达 发表于 2013-4-8 08:24
用暴力反射吧,下面是我的代码
  Outer.Inner inner = new Outer().new Inner();
   Class clazz= inner.get ...

对哦...可以用发射暴力访问内部类的私有成员哦....
作者: 杨玉辉    时间: 2013-4-8 08:57
本帖最后由 杨玉辉 于 2013-4-8 09:01 编辑
  1. class Outer {

  2.         class Inner {

  3.                 private void innerMethod(String str) {

  4.                         System.out.println(str);

  5.                 }            

  6.         }
  7.         public void function (){
  8.                new Inner().innerMethod(" 要干嘛 用");
  9.         }

  10. }
  11. public ClassDemo{
  12.         public static void main(String[] args){
  13.         new Outer().function();
复制代码
个人觉得,要访问内部类私有方法,必须要建立内部类引用。
内部类在外部类成员位置上,可以被外部类直接访问,内部类也可以访问它自己私有的方法

如果你不对外提供public修饰的访问方式,而且,又不它所在的外部类中,也不创建内部类的实例对象,那么这个内部类的方法就是多余的,没有实际意义

作者: 王川    时间: 2013-4-8 11:33
嗯。不错,学到了很多




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