码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA学习笔记(四十六)- 内部类详解

时间:2015-04-01 09:32:46      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:成员内部类   匿名内部类   静态内部类   局部内部类   

成员内部类


/*
 * 内部类
 * 定义在另一个类中的类,称为内部类Inner Class
 * 包含内部类的类,称为外部类Outer Class
 * 
 * 应用场合:在窗体程序中进行事件处理
 * 
 * 分类:
 * 成员内部类
 * 局部内部类
 * 静态内部类
 * 匿名内部类
 * 
 * 成员内部类
 * 1.在外部类中访问内部类,可以访问内部类中的所有成员,包含private修饰的
 * 2.在外部类外访问内部类,不能访问内部类中的private修饰的成员
 * 3.在内部类中访问外部类,直接访问,如果内部类和外部类的变量名相同,可使用“外部类.this.变量”
 */
public class Test12 {
    public static void main(String[] args) {
        Outer out=new Outer();//创建外部类的对象
        /*out.print();//调用外部类的方法*/  

        //2.在外部类外访问内部类
        //在外部类的外部创建内部类的对象,语法:外部类.内部类  对象名=外部类对象.new 内部类();
        //Outer.Inner in=out.new Inner(); //必须先创建外部类的对象
        Inner in=out.new Inner();
        //System.out.println(in.age);//无法访问内部类的private成员
        in.show();
    }
}

/*
 * 外部类Outer,内部类Inner
 * 编译后,会生成三个字节码文件:Test12.class、Outer.class、Outer$Inner.class
 * 成员内部类名称:外部类名$内部类名.class
 */
class Outer{ //外部类
    private String name="tom";//外部类的成员变量
    static String address="南京";

    class Inner{ //内部类
        private int age=20;//内部类中的成员变量
        private String name="张三";
        String address="北京";

        public void show(){
            String address="天津";
            System.out.println("内部类中的show方法");
            //3.在内部类中访问外部类
            System.out.println("内部类中的name:"+this.name);
            System.out.println("外部类中的name:"+Outer.this.name);
            System.out.println("内部类中的age:"+age);
            System.out.println("内部类中的address:"+this.address);
            System.out.println("外部类中的address:"+Outer.address);
            System.out.println("内部类中的局部变量address:"+address);
        }
    }

    //1.在外部类中访问内部类
    public void print(){
        System.out.println("外部类中的print方法");
        Inner in=new Inner();//直接创建内部类的对象
        System.out.println(in.age);//访问内部类的属性,可以访问private成员
        in.show();
    }
}

局部内部类

/*
 * 局部内部类
 * 也称为方法内部类,即定义在外部类的方法中的类
 * 1.访问范围:只能在外部类的方法中使用,不能使用修饰符进行修饰
 * 2.在局部内部类中不能访问外部类的方法中非final修饰的成员
 */
public class Test01 {
    public static void main(String[] args) {
        MOuter out=new MOuter();
        out.show();
    }
}

class MOuter{
    String name="tom";

    public void show(){
        final int age=20;
        System.out.println("外部类中的show方法");

        class MInner{ //局部内部类
            String sex="male";
            private String address="南京";

            public void print(){
                System.out.println("局部内部类中的print方法");
                System.out.println("外部类中的成员变量name:"+name);
                System.out.println("外部类中局部变量age:"+age);
            }
        }

        //只能在外部类的方法中使用
        MInner in=new MInner();
        System.out.println(in.sex);
        System.out.println(in.address);
        in.print();
    }

}

静态内部类

/*
 * 静态内部类
 * 使用static修饰的成员内部类
 * 不能访问外部类中非static成员
 */
public class Test02 {
    public static void main(String[] args) {
        //创建静态内部类,无需创建外部类的对象
        SInner in=new SInner();
        in.show();
    }
}

class SOuter{
    static String name="tom";

    static class SInner{  //静态内部类
        String sex="male";

        public void show(){
            System.out.println("静态内部类中的show方法");
            System.out.println("外部类中的name:"+name);
        }
    }
}

匿名内部类

/*
 * 匿名内部类
 * 即没有名字的内部类,因为此类只需要使用一次,所以没有起名字的必要
 * 1.在创建匿名内部类时,必须作为new语句的一部分来声明,用法:
 *   接口|抽象类  对象名 =  new 接口|抽象类{
 *      //匿名内部类
 *   }
 * 2.在创建匿名内部类时,会自动创建一个匿名内部类的对象,并赋给变量
 */
public class Test03 {
    public static void main(String[] args) {
        Service s=new Service(){//匿名内部类
            //实现接口中的抽象方法
            public void show(){
                System.out.println("实现Service接口的匿名内部类");
            }
        };
        s.show();

        Animal pig=new Animal() {
            @Override
            public void play() {
                System.out.println("小猪快跑。。。。");
            }

            @Override
            public void show() {
                System.out.println("小猪快吃。。。。。");
            }
        };
        pig.show();
        pig.play();

        Student stu=new Student(){
            public void show(){
                System.out.println("俺是小学生,嘻嘻嘻嘻");
            }
        };
        stu.show();
    }
}

/*
 * 定义接口
 */
interface Service{
    //抽象方法
    void show();
}

/*
抽象类
*/
abstract class Animal{
    String name;

    public void show(){
        System.out.println("动物在吃。。。。");
    }

    public abstract void play();
}

class Student{
    public void show(){
        System.out.println("嘿嘿嘿嘿嘿嘿");
    }
}

JAVA学习笔记(四十六)- 内部类详解

标签:成员内部类   匿名内部类   静态内部类   局部内部类   

原文地址:http://blog.csdn.net/wangzi11322/article/details/44801815

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!