java内部类和匿名内部类的作用是什么?

Java内部类\x0d\分为四种类型:成员内部类、局部内部类、静态内部类和匿名内部类。\x0d\1。成员内部类:即作为外部类的成员存在,与外部类的属性和方法并列。\x0d\注意:不能在成员的内部类中定义静态变量,但是可以访问外部类的所有成员。\ x0d \ public class Outer { \ x0d \ private static int I = 1;\ x0d \ private int j = 10;\ x0d \ private int k = 20\ x0d \ public static void outer _ f 1(){ \ x0d \//do more something \ x0d \ } \ x0d \//do more something \ x0d \ } \ x0d \ \ x0d \//成员内部类\ x0d \ class inner { \ x0d \//static intainer _ I = 100;//不允许在内部类中定义静态变量\ x0d \ int j = 100;//内部类中外部类的实例变量可以* * *存放在\x0d\int inner_i=1中;\ x0d \ void inner _ f 1(){ \ x0d \ system . out . println(I);//如果外部类的变量与内部类的变量没有重名,可以直接用变量名访问外部类的变量\ x0d \ system . out . println(j);//直接用变量名\x0d\ System.out.println(this.j)在内部类中访问内部类自己的变量;//也可以用“这个。变量名称"在内部类中访问内部类变量\x0d\ //可以使用"外部类名。这个。变量名”来访问外部类中同名的实例变量。\ x0d \ system . out . println(k);//如果外部类的变量与内部类的变量没有重名,可以直接用变量名\x0d\ outer_f1()访问外部类的变量;\ x0d \ outer _ F2();\x0d\}\x0d\}\x0d\//外部类的非静态方法访问成员内部类\ x0d \ public ovoid outer _ F3(){ \ x0d \ inner inner = new inner();\ x0d \ inner . inner _ f 1();\ x0d \ } \ x0d \ \ x0d \/外部类的静态方法访问成员的内部类,就像访问外部类之外的成员的内部类一样\ x0d \ public static void outer _ F4(){ \ x0d \/step 1建立外部类对象\ x0d \ outer out = new。\ x0d \/* *步骤2根据外部类对象建立内部类对象* * \ x0d \ inner inner = out . new inner();\ x0d \/step3访问内部类的方法\ x0d \ inner . inner _ f 1();\ x0d \ } \ x0d \ \ x0d \ public static void main(String[]args){ \ x0d \ outer _ F4();\x0d\}\x0d\}\x0d\成员内部类的优点:\ x0d \ (1)作为外部类的成员,内部类可以访问外部类的私有成员或属性。(即使外部类被声明为私有,它对内部类仍然是可见的。)\ x0d \ 2使用内部类定义在外部类中不可访问的属性。这样,外部类中的访问权限就小于外部类的私有。\x0d\注意:内部类是一个编译时概念。一旦编译成功,它们将成为两个完全不同的类。对于名为outer的外部类及其内部定义的名为inner的内部类。编译后有两类:outer.class和outer$inner.class \x0d\2。局部内部类:在方法中定义的内部类,类似于局部变量,局部内部类前没有修饰符public或private,其作用域是定义它的代码块。\x0d\注意:静态变量不能在局部内部类中定义。可以访问外部类的局部变量(即方法中的变量),但这些变量必须是final。\ x0d \ public class Outer { \ x0d \ private int s = 100;\ x0d \ private int out _ I = 1;\ x0d \ public void f(final int k){ \ x0d \ final int s = 200;\ x0d \ int I = 1;\ x0d \ final int j = 10;\x0d\ class Inner{ //在方法中定义\ x0d \ int s = 300//可以定义一个与外部类同名的变量\ x0d \//static int m = 20;//无法定义静态变量\ x0d \ inner(int k){ \ x0d \ inner _ f(k);\ x0d \ } \ x0d \ int inner _ I = 100;\ x0d \ void inner _ f(int k){ \ x0d \ system . out . println(out _ I);//如果内部类没有与外部类同名的变量,可以直接在内部类中访问外部类的实例变量\ x0d \ system . out . println(k);//* * * *可以访问外部类的局部变量(即方法内的变量),但变量必须是* * * * \ x0d \//system。out . println(I)of final;\ x0d \ system . out . println(s);//如果内部类中存在与外部类同名的变量,则直接用变量名访问内部类\x0d\ System.out.println(this.s)的变量;//内部类变量\ x0d \ system。out.println (outer.this.s)也是用“this。变量名";//外部类变量\x0d\ }\x0d\ }\x0d\ new Inner(k)用外部“外部类名. this .变量名”访问;\ x0d \ } \ x0d \ \ public static void main(string[]args){ \ x0d \//在访问本地内部类之前,必须存在外部类对象\ x0d \ outer oout = new outer();\ x0d \ out . f(3);\x0d\} \x0d\} \ x0d \ \ x0d \注意:\ x0d \不能在类外部直接生成局部内部类(以确保局部内部类对外部不可见)。如果要使用局部内部类,需要生成一个对象,对象调用方法,然后可以在方法中调用它的局部内部类。内部类和接口之间实现强制弱耦合,接口由局部内部类实现,方法中返回接口类型,使得局部内部类不可见,实现类的可见性被屏蔽。\x0d\\x0d\3。静态内部类:静态内部类是在类中定义的,除了任何方法,都是由static定义的。\x0d\注意:静态或非静态成员可以在静态内部类\ x0d \ public class outer { \ x0d \ private static int I = 1中定义;\ x0d \ private int j = 10;\ x0d \ public Static void outer _ f 1(){ \ x0d \ \ x0d } \ x0d \ public void outer _ F2(){ \ x0d \ \ x0d \ } \ x0d \/静态内部类可以是公共的和受保护的。//静态或非静态成员可以在静态内部类\ x0d \ Static Class Inner { \ x0d \ Static in tinner _ I = 100中定义;\ x0d \ int inner _ j = 200\ x0d \ static void inner _ f 1(){ \ x0d \ system . out . println(" outer . I "+I);//静态内部类只能访问外部类的静态成员\ x0d \ outer _ f 1();//包括静态变量和静态方法\ x0d \ } \ x0d \ Void inner _ F2(){ \ x0d \//system。out . println(" outer . I "+j);//静态内部类不能访问外部类的非静态成员\ x0d \//outer _ F2();//包含非静态变量和非静态方法\ x0d \ } \ x0d \ } \ x0d \ \ public void outer _ F3(){ \ x0d \//外部类访问内部类的静态成员:内部类。静态成员\ x0d \ system。出去。\ x0d \ inner . inner _ f 1();\x0d\//外部类访问内部类的非静态成员:只需实例化内部类\ x0d \ Inner Inner = new Inner();\ x0d \ inner . inner _ F2();\ x0d \ \ x0d \ } \ x0d \ public static void main(String[]args){ \ x0d \ new Outer()。outer _ F3();\ x0d \} \ x0d \} \ x0d \ \ x0d \注意:* * * * * *生成(新建)一个静态内部类不需要外部类成员:这就是静态内部类和成员内部类的区别。可以直接生成静态内部类的对象:\ x0d \ outer . inner in = new outer . inner();\x0d\不生成外部类对象。这实际上使静态内部类成为了顶级类。静态内部类不能由private定义。* * * * * \x0d\ \例:\x0d\对于两个类,有相同的方法:\ x0d \ class People \ x0d \ { \ x0d \ run();\ x0d \ } \ x0d \ class Machine { \ x0d \ run();\x0d\}\x0d\此时有一个机器人类:\ x0d \ class robot extensions people implementation machine。\ x0d \ run()此时不能直接实现。\x0d\注意:当类和接口之间(或者接口和接口之间)发生方法命名冲突时,必须使用内部类来实现。多重继承不能完全用接口实现,但是用接口和内部类,可以实现真正的多重继承。\x0d\\x0d\4。匿名内部类\x0d\匿名内部类是一个特殊的局部内部类,通过匿名类实现接口。\x0d\IA被定义为接口。\ x0d \ IA I = new IA(){ };\x0d\\x0d\匿名内部类的特点:\ x0d \ x0d \ 1,一个类用来继承其他类或者实现接口,不需要添加额外的方法,只需要预覆盖继承的方法。\x0d\2,只是获取一个对象实例,不需要知道它的实际类型。\x0d\3,类名没有意义,就是不需要使用。\ x0d \ \ x0d \ public class Outer { \ x0d \ private static int I = 1;\ x0d \ private int j = 10;\ x0d \ public Static void outer _ f 1(){ \ x0d \ \ x0d } \ x0d \ public void outer _ F2(){ \ x0d \ \ x0d \ } \ x0d \/静态内部类可以是公共的和受保护的。//静态或非静态成员可以在静态内部类\ x0d \ Static Class Inner { \ x0d \ Static in tinner _ I = 100中定义;\ x0d \ int inner _ j = 200\ x0d \ static void inner _ f 1(){ \ x0d \ system . out . println(" outer . I "+I);//静态内部类只能访问外部类的静态成员\ x0d \ outer _ f 1();//包括静态变量和静态方法\ x0d \ } \ x0d \ Void inner _ F2(){ \ x0d \//system。out . println(" outer . I "+j);//静态内部类不能访问外部类的非静态成员\ x0d \//outer _ F2();//包含非静态变量和非静态方法\ x0d \ } \ x0d \ } \ x0d \ public void outer _ F3(){ \ x0d \//外部类访问内部类的静态成员:内部类。静态成员\ x0d \ system . out . println(inner \ x0d \ inner . inner _ f 1();\x0d\//外部类访问内部类的非静态成员:只需实例化内部类\ x0d \ Inner Inner = new Inner();\ x0d \ inner . inner _ F2();\ x0d \ \ x0d \ } \ x0d \ public static void main(String[]args){ \ x0d \ new Outer()。outer _ F3();\ x0d \} \ x0d \} \ x0d \ \ x0d \注意:匿名内部类必须在new后面,new用于隐式实现没有类名的接口或类。根据多态性,我们使用它的父类名。因为是局部内部类,所以局部内部类的所有限制都会对其生效。匿名内部类是唯一没有构造函数的类。大多数匿名内部类用于接口回调。匿名内部类在编译时被系统自动命名为$1.class。如果一个对象被编译成一个接口,那么它就作为一个实现这个接口的类来运行。因为匿名内部类没有构造函数,所以用途非常有限。需要多个对象时使用局部内部类,所以局部内部类的应用相对更多。构造函数不能在匿名内部类中定义。如果一个对象被编译成一个接口,那么它就作为一个实现这个接口的类来运行。\ x0d \ \ x0d \ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _因此,它具有类成员的封闭级别:private、protected、friendly)、public\x0d\ x0d \它具有类成员的修饰符:static、final、abstract\x0d\ 2。非静态内部类嵌套内部类,内部类隐含指向外部类this的指针,所以可以访问外部类的所有资源(当然也包括private)\ x0d \外部类必须先获取内部类的对象,并且依赖于内部类成员的封装级别。\x0d\非静态内部类不能包含任何静态成员。\x0d\3。静态内部类:静态内部类,不再包含外部类的这个指针,在外部类加载时初始化。\x0d\ Static内部类可以包含静态或非静态成员。\x0d\静态内部类只能访问外部类的静态成员。\x0d\外部类访问。对于静态成员,可以通过类名访问它们。成员,对于非静态成员,它们只能由对象访问。成员\x0d\ \ x0d \ 4。对于方法或块中的内部类,它们只能访问块或方法中的最终变量。\ x0d \ x0d \类成员有静态和非静态两种,内部类也有这两种\ x0d \非静态内部类的实例。您必须在外部类的方法中或通过外部类的实例(outerclassinsistancename)来创建它。新的内部类名(构造函数参数)),并且可以直接访问外部类的信息。外部类对象可以通过OuterClassName.this引用\x0d\static内部类的实例,你可以直接创建它而不用引用外部类的实例。\x0d\内部类无论静态还是非静态都有对外部类的引用\x0d\非静态内部类不允许有静态成员\x0d\\x0d\方法中的内部类只允许访问方法中的最终局部变量和方法的最终参数列表,所以内部类和方法中的内部类没有区别。但是,不能在方法外部访问方法中的内部类,并且在方法\x0d\匿名内部类中不能有静态内部类。如果它从接口继承,它必须实现指定接口的方法,并且没有参数\x0d\匿名内部类。如果它从类继承,则参数必须作为父类的构造函数的参数传递。