本帖最后由 心在左边跳 于 2015-7-6 01:02 编辑
内部类访问规则作用:内部类可以方便访问外部类成员,包括私有。外部类访问内部类,需要建立内部类对象。之所以可以直接访问外部类的成员,因为直接持有外部类引用,格式:Outer.this
访问格式: - 当内部类定义在外部类成员位置上,而非私有,可以在外部其他类忠,直接建立内部类对象
格式:
外部类名.内部类名 变量名= 外部类对象.内部类对象;
Outer.Inner i = new Outer().new Inner(); - 当内部类定义在外部类成员位置上,就可以被成员修饰符修饰。比如:private ,内部类在外部类中封装。
static ,内部类具有static特性。当内部类被static修饰后,只能访问外部类的静态成员。出现访问局限。
new Outer.Inner().function()(直接访问内部类的非静态成员)
Outer.Inner.function()(直接访问内部类的静态成员)
注意:当内部类定义了静态成员,内部类必须时静态的。当外部类的静态方法访问内部类时,内部类必须是静态的。
- /**
- * Created by root on 15-6-14.
- */
- public class Outer {
- int x;
- class Inner{
- int x;
- void function(){
- this.x;
- Outer.this.x;//外部类的变量
- }
- }
- void method(){
- Inner inner=new Inner();
- inner.function();
- }
- public static void main(String[]agrgs){
- //内部类全名
- Outer.Inner i = new Outer().new Inner();
- }
- }
复制代码
内部类定义规则什么时候使用内部类?
当描述事物时,事物中含有事物,该事物使用内部类描述。因为该事物使用外部事物。 - public class Outer {
- private class Inner{//封装内部类
- void function(){}
- }
- void method(){
- new Inner().function();
- }
复制代码 匿名内部类内部类定义在局部时,不能被成员修饰符访问。可以访问外部类的成员,因为持有外部类的引用。但是不可访问它所在局部的变量。只能访问被final修饰的成员变量。
- public class Outer {
- void method(final int x){
- class Inner{
- void function(){
- System.out.println(x);
- }
- }
- new Inner().function();
- }
- public static void main(String[]agrgs){
- //
- Outer i = new Outer();
- i.method(1);
- i.method(2);
- }
- }
复制代码
定义匿名内部类前提,内部类必须继承一个类,或者实现接口。
格式:new 父类或接口 {定义子类的内容}
其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。可以理解为带内容的对象。
匿名内部类中定义方法最好不要超过3个。
- public class Outer {
- int x;
- void method(){
- //
- new AbsDemo(){
- @Override
- void show(int x) {
- System.out.print("x="+x);
- }
- }.show(x);
- }
- public static void main(String []args){
- Outer o= new Outer();
- o.x=1;
- o.method();
- }
- }
- abstract class AbsDemo{
- abstract void show(int x);
- }
- //练习
- public class Outer {
- public static Inner function(){
- return new Inner() {
- @Override
- public void method() {
- System.out.print("返回匿名内部类");
- }
- };
- }
- public static void main(String[]args){
- //function()运算后是一个对象,而且是一个Inner类对象。所以才调用method()方法
- Outer.function().method();
- }
- }
- interface Inner{
- void method();
- }
复制代码
匿名内部类作为方法的参数 - public static void show(Inner inner){
- //
- }
- Outer.show(new Inner() {
- @Override
- public void method() {
- }
- });
复制代码匿名内部类父类为Object - new Object(){
- public void method(){}
- }.method();
复制代码
|