Java学习笔记Java学习笔记首页投稿(暂停使用,暂停投稿)

Java 内部类基础知识梳理

2016-11-27  本文已影响81人  Android那些事儿

文章摘要
1、内部类按照类别可以分为:非静态成员内部类、局部内部类、静态成员内部类、匿名内部类。
2、非静态内部类相当于外部类的非静态成员属性以及方法,含有外部对象的引用。
3、非静态内部类不允许定义静态成员变量,但是可以存在静态常量。


一、内部类综述

1、内部类按照类别可以分为:非静态成员内部类、局部内部类、静态成员内部类、匿名内部类。
2、内部类编译结束后的class文件,以“外部类$内部类内部类.class”的形式出现。

内部类

3、内部类对象会保留一个外部对象的引用,即:Out.this。

二、非静态成员内部类。

1、非静态成员内部类:不带有关键字static,相当于外部类的内部属性以及方法的集合。
代码形式:

public class 外部类{

 class 内部类{//非静态内部类

 }

}

2、实例化方式:

public class 外部类 {
    class 内部类{
        public void display(){
            System.out.println("这是内部类。。");
        }
    }
    public static void main(String args[]){
        //1、非静态成员内部类的实例化方式
        外部类 Outer = new 外部类();
        内部类 Inner = Outer.new 内部类();//等同于:new 外部类().new 内部类();
        
        Inner.display();
    }
}

3、常见用法及其注意事项:
非静态内部类相当于外部类的非静态成员属性以及方法,含有外部对象的引用。
访问自己内部的成员属性。可以直接访问,也可以通过【内部类.this】或者【this】来代表内部类。

【外部类.this】可以代表外部类对象的引用。

public class 外部类 {
    private String name="外部类";//外部类name声明并实例化
    class 内部类{
        private String name="内部类";//内部类name声明并实例化
        public void display(){
            //直接访问内部类内部成员变量
            System.out.println("内部类描述1:"+name);
            //内部类.this或者this.name代表内部类自身
            System.out.println("内部类描述2:"+内部类.this.name);
            //外部类.this代表外部类的引用
            System.out.println("外部类描述:"+外部类.this.name);
        }
    }
    public static void main(String args[]){
        //1、非静态成员内部类的实例化方式
        外部类 Outer = new 外部类();
        内部类 Inner = Outer.new 内部类();
        
        Inner.display();
    }
}

输出:

内部类描述1:内部类
内部类描述2:内部类
外部类描述:外部类

c、外部类方法引用内部类对象以及方法

public class 外部类 {
    private String name="外部类";//外部类name声明并实例化
    
    public void display(){
        System.out.println("外部类描述:"+name);
        //
        内部类 inner = new 内部类();
        inner.display();
        System.out.println("内部类成员属性:"+inner.name);
    }

    class 内部类{
        private String name="内部类";//内部类name声明并实例化
        public void display(){
            //直接访问内部类内部成员变量
            System.out.println("内部类描述1:"+name);
            //内部类.this或者this.name代表内部类自身
            System.out.println("内部类描述2:"+内部类.this.name);
            //外部类.this代表外部类的引用
            System.out.println("外部类描述:"+外部类.this.name);
        }
    }
}

三、局部内部类

1、代码形式:

public class 外部类 {
    
    public void demoPartialClass(){
        class 局部内部类{
        }
    }
}

2、局部内部类的实例化:

public class 外部类 {
    public void demoPartialClass(final String name){
 class 局部内部类{
 }
 //1、局部内部类的实例化
 局部内部类 partialInnerClass = new 局部内部类();
    }
}

3、常见用法及注意事项
局部内部类中访问外部局部变量,变量必须是final的。

public void demoPartialClass(final String name){//必须是final修饰的
        final String discription = "这里演示局部内部类";
        class 局部内部类{
            public void display(){
                System.out.println("局部内部类描述:"+name);
            }
            public void work(){
                System.out.println("局部内部类工作:"+discription);
            }
 }
}

四、静态内部类

静态内部类相当于外部定义的类,类名前可以使用public、protected以及private等修饰。
1、代码形式:

public class 外部类 {
    
    /*public*/ static class 静态内部类{
        
    }

}

2、静态内部类的实例化

public class 外部类 {
    
    /*public*/ static class 静态内部类{
        
    }

}

静态内部类 static_ = new 静态内部类();

3、常见用法及注意事项
可以访问局部内部类中的非静态方法和属性,不能访问外部类的非静态成员方法和属性。

public class 外部类 {

    /*public*/ static class 静态内部类{
        private static String name="静态内部类";
        public void display() {
            System.out.println("静态内部类描述:" + name);
            //2、无法调用外部类的非静态属性、方法
//            System.out.println("外部类的非静态属性:"+外部类.this.name);//报错
//            System.out.println("外部类的非静态方法:"+外部类.this.display());//报错
        }
    }

}

五、匿名内部类

1、代码形式:

new 接口/类{
//add unimplemented methods
};

ps:不要忘记大括号最好的分号。

二、实例化:
匿名内部类只能实例化一个对象

public class 外部类 {
    public void demoAnnonymos() {
        new Object(){
            public String toString() {
                return super.toString();
            }
        };
    }
}

代码下载:http://download.csdn.net/detail/hailushijie/9688012

上一篇下一篇

猜你喜欢

热点阅读