静态内部类、非静态内部类以及匿名类之间的区别

来源:互联网 发布:microsoft软件有哪些 编辑:程序博客网 时间:2024/06/13 18:25

每次被问到静态内部类和非静态内部类的区别时,我都不知道如何回答,所以特意花了一段时间来整理一下,有不对的地方也希望指正

首先我们知道一个类一旦被定义为静态的,那么这个类一定是内部类,所以我们如果想定义一个内部类,当然可以是静态的也可以是非静态的,

那么什么事匿名类呢,所谓匿名类是一种特殊的内部类,它是在一个表达式内部包含一个完整的类定义,常见的匿名类有监听器,并且匿名类只在该表达式内部有效

那么有什么区别呢,来看下面的一段代码,这段代码进行了详细的描述:

public class Test {public class NormInnerClass{/* * 非静态内部类可以定义实例变量,但静态变量一定要是常量(static final) * 非静态内部类一定不能定义静态方法 */private String a="normal inner class";private static final int b=10;public void getAB(){System.out.println("A"+a);System.out.println("B"+b);}}public static class StaticInnerClass{/* * 静态内部类可以定义实例变量,也可以定义静态变量 * 当然也可以定义静态方法和实例方法 * 同时可以肯定的是静态方法不能访问类中的非静态变量和方法 */private String a="static inner class";private static int b=9;public void getAB(){System.out.println("A"+a);System.out.println("B"+b);}public static void getB(){System.out.println(b);//System.out.println(a);//此处编译一定会报错}}public void getClassInfo(StaticInnerClass sc){//在Test类里可以使用这种定义来实例化内部类Test.NormInnerClass normClass=new Test.NormInnerClass();Test.StaticInnerClass staticClass=new Test.StaticInnerClass();normClass.getAB();//可以访问实例变量和方法,且static final变量不能改变值normClass.a="normal inner class variable";//在Test类中是可以使用内部类中的private变量System.out.println(normClass.a);staticClass.getAB();//可以访问内部类中的实例变量和方法staticClass.b=4;//能通过实例化的内部类对象访问静态变量和方法,但不推荐//当然也可以直接通过类名.变量名来访问类中的静态变量和方法StaticInnerClass.getB();System.out.println(NormInnerClass.b);sc.getAB();//也可以直接通过参数来访问内部类中的方法}public static void main(String[] args) {Test test=new Test();//在类外面比如main方法里,对于非静态内部类必须必须要实例化后再newTest.NormInnerClass normal=test.new NormInnerClass();normal.getAB();//对于静态内部类可以使用 “外部类名.内部类名” 来实例化,当然也可以使用非静态内部类的实例方法,同样也不推荐Test.StaticInnerClass stinc=new Test.StaticInnerClass();stinc.getAB();test.getClassInfo(new StaticInnerClass(){@Overridepublic void getAB(){System.out.println("我把StaticInnerClass中的getAB()方法重写了");}});}}
这段程序将内部类做了一个总的概括

0 0
原创粉丝点击