黑马程序员技术交流社区
标题:
内部类的访问规则
[打印本页]
作者:
马晓平
时间:
2013-10-21 23:20
标题:
内部类的访问规则
本帖最后由 马晓平 于 2013-10-27 11:26 编辑
内部类的访问规则是什么?
作者:
wenbaoxing
时间:
2013-10-22 08:51
本帖最后由 wenbaoxing 于 2013-10-22 08:53 编辑
内部类
—
在类中直接定义的内部类
在一个类内部定义类这就是嵌套类,也叫内部类、内置类。
嵌套类可以直接访问嵌套它的类的成员,包括private成员,但是嵌套类的成员却不能被嵌套它的类直接访问。
在内部类对象保存了一个对外部类对象的引用,当内部类的成员方法中访问某一变量时,如果在该方法和内部类中都没有定义过这个变量,内部类中对this的引用会被传递给那个外部类对象的引用。
package com.itheima;
class Outer {
int outer_i = 100;
void test() {
Inner in = new Inner();
in.display();
}
class Inner {
void display() {
System.out.println("display: outer_i = " + outer_i);
}
}
}
class InnerClassDemo {
public static void main(String[] args) {
Outer outer = new Outer();
outer.test();
}
}
//打印结果:display: outer_i = 100
复制代码
在程序中,内部类Inner定义在Outer类的范围之内。因此,在Inner类之内的display()方法可以直接访问Outer类的变量outer_i。其实,在内部类对象保存了一个对外部类对象的引用,当内部类的成员方法中访问某一变量时,如果在该方法和内部类中都没有定义过这个变量,内部类中对this的引用会被传递给那个外部类对象的引用,通过那个外部类对象的引用去调用这个变量,在内部类中调用外部类的方法也是一样的道理。上面程序代码在内存布局如图:
图片1.jpg
(49.92 KB, 下载次数: 2)
下载附件
2013-10-22 08:49 上传
作者:
wenbaoxing
时间:
2013-10-22 09:05
内部类使程序代码代码更加紧凑、程序更具模块化。如果我们将上面的Inner类改写成Outer类的外部去实现,会非常棘手。这样我们就明白了这个结论:当一个类的代码要用到另外一个类的实例对象,而另外一个类中的代码要访问第一个类中的成员,将另一个类(第二个类)写成第一个类的内部类,程序代码就要容易编写的多,这样的情况在实际应用中非常之多!!
作者:
wenbaoxing
时间:
2013-10-22 09:12
一个内部类可以访问他的外部类的成员,但是反过来是不成立的。内部类的成员只有在内部类的范围之内是可知的,并不能被外部类使用。
如果用
static
修饰一个内部类,这个类就相当于是一个外部定义的类,所以
static
的内部类中可声明
static
成员,但是,
非
static
的内部类中的成员是不能声明为
static
的。
static
的内部类不能再使用外层封装类的非
static
的成员变量,这个
道理不难想象!所以
static
嵌套类很少使用。
如果函数的局部变量(函数的形参也是局部变量),内部类的成员变量,外部类的
成员变量重名,我们应该按下面的程序代码所使用的方式来明确指定我们真正要
访问的变量。
public class Outer
{ private int size; public class Inner
{ private int size; public void doStuff( int size)
{ size++; // 引用的是doStuff函数的形参
this.size++; //引用的是Inner类中的成员变量
Outer.this.size++; // 引用的Outer类中的成员变量
}
}
}
复制代码
作者:
王松松
时间:
2013-10-22 09:13
1,内部类的定义位置,分为成员位置和局部位置。
在外部类成员位置上叫做一般内部类,这种情况下外部类访问内部类需要创建内部类对象,内部类可以直接访问外部类的成员变量,包括私有,形如 外部类.this.成员属性。
在外部类局部位置上叫做局部内部类,这种情况下内部类可以直接访问外部类中的成员变量和被final修饰的局部变量。
2,静态内部类。定义在外部类成员变量位置上,被static修饰,这种情况下内部类只能访问外部类的静态成员变量。
3,匿名内部类。这是内部类的简写形式,需要有父类和接口,局部内部类作用限制 对他有效。建议定义较少的方法。
纯手打,希望对你有帮助!与你一同进步!{:soso_e141:}
作者:
wenbaoxing
时间:
2013-10-22 09:14
嵌套类并非只能在类里定义,也可以在几个
程序块的范围之内定义内部类。例如,在方
法中,或甚至在
for
循环体内部,都可以定义
嵌套类
。
在方法中定义的内部类只能访问方法中的
final
类型的局部变量,用
final
定义的局部变量相当
于是一个常量,它的生命周期超出方法运行
的生命周期。
作者:
Simple_love
时间:
2013-10-22 10:18
这里我要说一点就是局部内部类的访问局部变量,该局部变量必须用final修饰符所修饰,
原因: 内部类的生命周期比局部变量长,局部变量加final之后,将变量设置为最终的值主要是将所有的局部内部类对象要访问的final型局部变量,变成该内部类对象中的一个数据成员。这样,即使栈中局部变量(含final)已死亡,但由于它是final,其值永不变, 因而局部内部类对象在变量死亡后,照样可以访问final型局部变量。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2