【JAVASE_学习笔记】内部类

来源:互联网 发布:高跟鞋推荐 知乎 编辑:程序博客网 时间:2024/06/05 17:40

【JAVASE_学习笔记】内部类

内部类:在一个类的内部定义另外一个类,另外一个类称为内部类
内部类的class文件名:外部类$内部类.class
内部类的类型:成员内部类:在外部类的成员位置
       局部内部类:在外部类的局部位置
内部类的好处:可以直接访问外部类的所有成员
应用场景:在描述A事物时,A事物内部还维护了另外一个B事物,且B事物必须要访问到A事物的成员,这时可以用内部类来描述B事物

成员内部类

访问方式:
     方式一:在外部类提供一个方法创建内部类的对象进行访问
     方式二:在其他类中直接创建内部类的对象进行访问
     Outer.Inner inner=new Outer().new Inner();
    格式:外部类.内部类 变量名=new 外部类().new  内部类();
举例:

//测试类public class Demo1 {    public static void main(String[] args) {        Outer o=new Outer();        o.useMethod();        //直接在测试类中创建内部的对象进行访问        Outer.Inner oi=new Outer().new Inner();        oi.method();    }}//外部类class Outer{    String name;    //内部类    class Inner{        public void method(){            System.out.println("今天是个学习Java的好日子!");        }    }    //外部类提供一个方法创建内部类的对象进行访问    public void useMethod(){        Inner i=new Inner();        i.method();    }}

注意:
   1.内部类可以访问外部类的所有成员(包括私有)
   2.内部类与外部类存在同名成员时,在内部类中默认是访问内部类的成员,可以通过“外部类.this.成员”进行指定访问外部类的成员
   3.私有的成员内部类只能通过在外部提供一个公共的方法进行访问,在其他类无法访问(private只是为了数据安全)
   4.如果一个成员内部类定义了静态的成员,则该类也必须使用static修饰,静态成员内部类只能访问外部类的static成员变量
   因为:静态成员变量是不依赖对象而存在的
   
静态成员内部类在其他类创建对象的格式:
  外部类.内部类 变量名=new 外部类.内部类();
举例:

//测试类public class Demo2 {    public static void main(String[] args) {        Outer2.Inner2 oi2=new Outer2.Inner2();        oi2.getStaticParm();//损伤        Outer2 o=new Outer2();        o.method();//心脏  人体    }}//外部类class Outer2{    String type="人体";    int age;    static String mod="损伤";    //私有的内部类    private class Inner{        String type="心脏";        public void getparm(){            System.out.println(type);            System.out.println(Outer2.this.type);//可以通过外部类.this.成员指定访问外部类的成员        }    }    //成员内部类定义了静态的成员,该类也必须用static修饰    static class Inner2{        private int weight;        static String color;        //静态成员内部类只能访问静态的成员变量        public void getStaticParm(){            System.out.println(mod);        }    }    //私有的成员内部类只能用外部类的方法进行访问    public void method(){        Inner i=new Inner();        i.getparm();    }}

局部内部类

如果局部内部类要访问局部变量,则局部变量必须用final修饰(jdk1.8不会报错——封装好了)
举例:

//测试类public class Demo3 {    public static void main(String[] args) {        Outer3 o=new Outer3();        o.method();//10    }}//外部类class Outer3{    String name;    public void method(){        final int a=10;//被局部内部类访问的局部变量必须用final修饰        //局部内部类        class Inner{            public void getParm(){                System.out.println(a);            }        }        //局部内部类可以在外部类的局部方法内,局部内部类外创建内部类的对象访问内部类的方法        Inner i=new Inner();        i.getParm();    }}

匿名内部类

没有类名的内部类
使用前提:必须存在继承或者实现关系
举例:

//测试类public class Demo4 {    public static void main(String[] args) {        Outer4 o=new Outer4();        o.print();    }}//抽象类abstract class Animal{    public abstract void eat(); } //接口interface Hibernation{    public abstract void hibernation();    public abstract void sleep();}class Outer4{    public void print(){        //创建的是Animal的子类对象        new Animal(){            public void eat() {                System.out.println("猫吃鱼");            }        }.eat();//猫吃鱼        //当接口中有多个方法时,运用多态可以调用多个方法        Hibernation h=new Hibernation(){            public void hibernation(){                System.out.println("有些动物会冬眠");            }            public void sleep() {                System.out.println("有些动物会进行深层睡眠");            }        };        h.hibernation();//有些动物会冬眠        h.sleep();//有些动物会进行深层睡眠    }}
原创粉丝点击