JAVA 中外部类可以访问非静态内部类的私有属性???

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA 中外部类可以访问非静态内部类的私有属性???相关的知识,希望对你有一定的参考价值。

代码如下:return new InnerClass(32).m;竟然编译通过?
public class OuterClass
private class InnerClass
private int m;
InnerClass(int m)
this.m=m;


public OuterClass()


public int outPut()
return new InnerClass(32).m;

1、创建一个Bean1类,并建好两个私有变量和构造方法。

2、创建一个Bean2类,引入对应包,创建好main 方法。

3、创建 Class<?> clazz = Class.forName("test.Bean1")。

4、创建Bean1 bean = (Bean1) clazz.newInstance();Field[] fs = clazz.getDeclaredFields()。

5、创建for (Field field : fs)   // 要设置属性可达,不然会抛出IllegalAccessException异常   field.setAccessible(true);// 打印初始值 System.out.println(field.getName() + "===" + field.get(bean));。

6、执行main方法查看结果。

参考技术A 你没好好看书,书上说的很明白了,内部类就相当于一个外部类的成员变量,所以可以直接访问外部变量,外部类不能直接访问内部类变量,必须通过创建内部类实例的方法访问,
new InnerClass(32).m就是创建内部类实例访问内部类成员变量。
你想不通的肯定是指内部类的私有变量怎么可以被外部类访问吧,按常规,私有变量m只能在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,这样解释够明白了吧本回答被提问者采纳
参考技术B 晕!大哥 本质还是没有搞懂呀。
这个程序的本质是这样的:
外部类: OuterClass 内部类:InnerClass内部似有属性:m

其实private 意思就是:这个属性只有自己这个类的对象可以调用。其他所有类。包括自己的外部类
OuterClass也不可以直接调用 innerClass的的私有属性(所以 一楼的那位不要误导楼主还不好。)。

所以这个题之所以有结果本身只是这样的:new InnerClass(32)以后 然后用这个类的对象 自己调用自己的私有属性。不是楼主想的那样。
要是还不明白的话。楼主还可以嗨我。追问

return new InnerClass(32).m;
这句代码指的是外部类的成员函数通过内部类的引用调用内部类的私有成员啊。。。。所以说外部类的成员函数可以访问内部类的私有成员?

参考技术C Java规范里确实规定了外部类可以访问内部类的private/protected变量,就像访问自己的private/protected变量一样.........实际上,编译器实现的时候是这样的:
Outer类和Inner类不再是嵌套结构,而是变为一个包中的两个类,然后,对于private变量的访问,编译器会生成一个accessor函数.......
嗯,反正这条记住就好。
参考技术D new InnerClass(32)
你已经用了new 所以这个innerClass已经实例化了 这个时候当然可以直接用了
毕竟InnerClass也是OuterClass的一部分

java 内部类

内部类
内部类不用建立对象就可以访问外部类的成员变量和函数,包括私有
外部类要访问内部类,必须建立内部类对象
内部类可以私有
当内部类中定义了静态成员,则内部类也应该是静态的
当外部类中的静态方法访问内部类时,内部类也应该是静态的
//main(){
// 在外部类中实例化内部类
//Inner in =new Inner();
// in.i();
//}

局部内部类
    内部类定义在局部时,不可以被成员修饰符修饰,可以直接访问外部类中的成员,不能访问所在局部中的变量,只能访问被final修饰的局部变量
class Outer{
    int i=10;
public void m(){
    syso("-------------");      
    }
public void f(){
    class Inner{
        int j=10;
        public void t(){
            syso("  "+i+"  "+j);
            }           
        }
    Inner in=new Inner();
        in.t();
    }
main(){
    Outer out =new Outer();
        out.f();
}
}//10  10  

静态内部类
静态内部类调用变量   可以使用内部类的变量  可以使用外部类中静态的变量
class Outer{
    int i=10;
    public void f(){syso("f()...");}
    static class Inner{
        int i=20;
    public void i(){syso(i+"  "+this.i+"                    "+Outer.i);}        
            }   
    }
public class kk{
    main(){
    Outer.Inner in=new Outer.Inner();
    in.i(); 
    }       
    }//20  20  10

 成员内部类
    作为类成员存在于类内部,可以访问外部类所有成员方法
    建立在非所属类中时,需要先建立外部类,Outer.Inner in=new Outer().new Inner();
    内部类访问外部类成员变量 Outer.this.x
    class Outer{
        int i=10;
        class Inner{
        int i=20;
        public void v(){syso(i+" "+this.i+" "+Outer.this.i);}       
        }       
    }
public class kk{

// Outer out =new Outer();
// Outer.Inner in =out.new Inner();
// in.v()
Outer.Inner in=new Outer().new Inner();
in.v();
}//20 20 10
匿名内部类
内部类必须是继承一个类或者实现接口。匿名内部类是一个匿名子类对象,而且这个对象是以一个类的形式展现的。
interface Email{
public void Send();
}
public class kk{
//接口不能实例化对象,匿名内部类实现了接口,系统实例化匿名内部类对象传给email
Email email=new Email(){
public void Send(){
syso("send email");
}
};
email.Send();
}//send email

以上是关于JAVA 中外部类可以访问非静态内部类的私有属性???的主要内容,如果未能解决你的问题,请参考以下文章

Java内部类的四种分类以及作用

内部类和静态内部类有什么区别?

java学习之内部类

java 内部类

Java面试题|静态内部类和非静态内部类有什么区别?

解惑领略Java内部类的“内部”