内部类是否可以访问外部类实例变量?

时间:2015-08-20 20:23:42

标签: java

说我有以下代码:

class Outer {
   int n;
   class Inner {
   }
}

Inner类型的对象是否可以访问其外部对象的实例变量n? (当我说它的时候,我的意思是它与之关联的外部对象。)我理解在内部类的方法中,你可以访问外部类实例变量,也可以访问体内(例如,Inner的实例变量可以初始化为外部的instnace变量的值,但是可以更直接地访问外部实例变量吗?例如,如果inner是Inner类型的对象,那么在给定上面的代码的情况下是否有类似inner.n的东西?

很抱歉文本块:基本上,如果inner是Inner类型的对象,是否有类似inner.n的内容给出上面的代码?

2 个答案:

答案 0 :(得分:2)

不确定。非静态内部类以允许它们访问相应外部类中的任何变量的方式生成(这是相当一些安全性问题的原因)。非静态内部类的实例只能在外部类的给定实例中生成,并且包含对外部类的引用,允许它们访问外部类的任何变量。

有关此主题的更多信息,请阅读java语言参考。

答案 1 :(得分:0)

  

Inner类型的对象是否可以访问其外部对象的实例变量n?

是的,您也可以访问该类的其他实例的字段,即使它们是私有的。

  

我理解在内部类的方法中,您可以访问外部类实例变量,也可以访问主体内部(例如,Inner的实例变量可以初始化为Outer的instnace变量的值),但它是否可能更直接访问外部实例变量?例如,如果inner是Inner类型的对象,那么在给定上面的代码的情况下是否有类似inner.n的东西?

您无法从另一个类访问Inner类可见的字段。除非字段是公共字段或可通过普通访问修饰符访问,否则只有内部和外部类可以访问它们。

  

基本上,如果inner是Inner类型的对象,那么在给定上面的代码的情况下是否有类似inner.n的内容?

Inner没有名为float dummy(ulong idx, float4 dir, float4 up, float fov) { return idx + length(dir - up) + fov; } kernel void vexcl_vector_kernel( ulong n, global float * prm_1, ulong prm_2, float4 prm_3, float4 prm_4, float prm_5 ) { for(ulong idx = get_global_id(0); idx < n; idx += get_global_size(0)) { prm_1[idx] = dummy( (prm_2 + idx), prm_3, prm_4, prm_5 ); } } 的字段,因此即使通过反射也无法使用该名称访问它。您可以做的是访问内部类中的n,并且您可以使用反射来获取Outer类的实例并获取它的Outer.this.n字段。