成员外部类(类中的一个一般成员变量)
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();//非法 }}