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

成员内部类


/*
 * 内部类
 * 定义在另一个类中的类,称为内部类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("嘿嘿嘿嘿嘿嘿");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值