成员外部类(类中的一个一般成员变量)


1、一个java文件中能够蕴含多个class,然而只能有一个public class
2、如果一个类定义在另一个类的外部,此时能够称之为外部类

应用

1、创立外部类的时候,跟之前的办法不一样,须要在内部类的后面增加外部类来进行润饰,如:InnerClassDemo.InnerClass innerClass = new InnerClassDemo().new InnerClass();

特点


1、外部类能够不便的拜访外部类的公有属性
2、外部类不能拜访外部类的公有属性(其余权限修饰符的属性也不行)、办法等等,只能将外部类的对象创立进去才能够办法属性和办法,如:System.out.println(new InnerClass().age);
3、一般的成员外部类中不能定义动态属性和静态方法(动态外部类中能够)
4、当外部类和外部类具备雷同的公有属性,在内部类中拜访的时候,间接拜访外部类的属性,如果须要拜访外部类的属性,如此:外部类的类名.this.属性名称
5、外部类能够嵌套多层,用法一样

示例

package com.msbline.innerclass;public class InnerClassDemo {    private int id;    private String name="zhangsan";    public void show(){        System.out.println("show");        //外部类拜访外部类的属性 System.out.println(new InnerClass().age);    }    class InnerClass{        private int age;        private String name="lisi";        public void test(){            System.out.println("test");            //能够拜访外部类的公有属性 System.out.println(id);            //同名属性默认拜访本人的外部属性 System.out.println(name);            //拜访外部类的同名属性 System.out.println(InnerClassDemo.this.name);        }    }    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}
package com.msbline.innerclass;public class TestInnerClass {    public static void main(String[] args) {        InnerClassDemo innerClassDemo = new InnerClassDemo();        innerClassDemo.show();        InnerClassDemo.InnerClass innerClass = new             InnerClassDemo().new InnerClass();        innerClass.test();    }}

匿名外部类

当定义了一个类,实现了某个接口,在应用过程中只须要应用一次,没有其余用处,其实思考到代码编写的简洁,能够思考不创立具体的类,而采纳new interface(){增加未实现的办法},就叫做匿名外部类

示例

package com.msbline.innerclass;public class NoNameInnerClassDemo {    public static void main(String[] args) {        //new Runnable看起来像是new了一个接口,实际上是new了一个Runnable的实现类 new Thread(new Runnable() {            @Override public void run() {            }        }).start();    }}

办法外部类

特色:
1、办法外部类不能定义成static
2、办法外部类外面也不能定义静态方法和属性
3、应用的时候只能在办法中创建对象,意外此class的作用域就是以后办法

示例

package com.msbline.innerclass;public class MethodInnerClass {    public void show(int b){        System.out.println("show");        class InnerClass{            private String name;            public void test(int a){                System.out.println("test");                System.out.println(a);                System.out.println(b);            }        }        new InnerClass().test(12);    }    public static void main(String[] args) {        new MethodInnerClass().show(11);    }}

动态外部类


特色:
1、动态外部类合乎static的属性,只能拜访static润饰的内容(无论是拜访外部类还是外部类本人,都只能拜访static润饰的内容)
2、外部类能够拜访外部类的动态属性和办法,如:外部类名.属性名,外部类名.办法名,然而不能拜访外部类的非动态属性,只能通过创立外部类对象来拜访

示例

package com.msbline.innerclass;public class StaticInnerClass {    private static int id;    private int gender;    public void test(){        //外部类拜访外部类的动态属性 System.out.println(InnerClass.name);        //外部类拜访外部类的一般属性 System.out.println(new InnerClass().age);        System.out.println("test");    }    static class InnerClass{        private static String name;        private String age;        public static void show(){            //拜访外部类的static属性和办法 System.out.println(id);            //不能拜访外部类的非static属性//            System.out.println(age); //也不能拜访本人的非static属性//            System.out.println(gender); System.out.println("show");        }        public void show1(){            //拜访外部类的static属性和办法 System.out.println(id);            //不能拜访外部类的非static属性//            System.out.println(age); //也不能拜访本人的非static属性//            System.out.println(gender); System.out.println("show");        }    }    public static void main(String[] args) {        InnerClass innerClass = new StaticInnerClass.InnerClass();        innerClass.show();        innerClass.show1();        //动态外部类的动态属性和静态方法跟一般类一样的拜访形式,能够不必new对象 System.out.println(InnerClass.name);        InnerClass.show();//        InnerClass.show1();//非法 }}

总结