Java 内部类

作者: 传奇内服号 | 来源:发表于2018-11-21 17:23 被阅读1次

内部类包括 成员内部类方法内部类、*静态内部类匿名内部类*。

内部类的作用

由于内部类的实现和外部类没有关系,内部类可自由继承其他类,所以在某一程度上实现了类的多重继承。

使得代码逻辑更紧凑,比如可以将一些相关性强的代码用内部类实现。

有些类往往只实例化一次,可以使用匿名内部类,这样也不会造成类的泛滥。

匿名内部类还能获取不在同一个包的 proteced 方法。

代码示例

成员内部类

IAnimal.java

publicinterfaceIAnimal{voidsleep(Stringname);voideat(Stringname);}

IProgrammer.java

publicinterfaceIProgrammer{voidcoding();}

Person.java

publicclassPersonimplementsIAnimal{privateintage;privateStringname;publicPerson(intage,Stringname){this.age=age;this.name=name;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}@Overridepublicvoidsleep(Stringname){System.out.println(name+"睡觉");}@Overridepublicvoideat(Stringname){System.out.println(name+"吃东西");}publicvoidcoding(){newXiaoMing().coding();}classXiaoMingimplementsIProgrammer{publicvoidxiaoMingSleep(){sleep(name);// 访问外部类的成员变量及方法}publicvoidxiaoMingEat(){eat(name);// 访问外部类的成员变量及方法}@Overridepublicvoidcoding(){System.out.println(age+"岁开始写代码");}}publicstaticvoidmain(String[]args){Personp=newPerson(12,"小明");Person.XiaoMingming=p.newXiaoMing();p.coding();ming.xiaoMingSleep();ming.xiaoMingEat();}}

运行 main() 方法,控制台打印出

可以看出内部类使用了外部类的成员变量及方法。

外部类也实现了 coding(),间接实现了多重继承。

静态内部类

静态内部类在实现单例模式时候经常使用到,示例:SingletonTest.java

publicclassSingletonTest{privateSingletonTest(){}privatestaticclassSingletonTestHolder{privatestaticSingletonTestsingletonTest=newSingletonTest();}publicstaticSingletonTestgetInstance(){returnSingletonTestHolder.singletonTest;}}

通过静态初始化类来实现单例模式,是线程安全的,利用 ClassLoader 来确保只有一个单例。

匿名内部类

一般作为接口和抽象的一种实现,通常只实例化一次。

比较常见的是我们实现 Runnable 接口和继承 Thread 类,都会用到匿名内部类。ThreadTest.java

publicclassThreadTest{publicstaticvoidmain(String[]args){newThread(){@Overridepublicvoidrun(){System.out.println("Thread ...");}}.start();Runnablerunnable=newRunnable(){@Overridepublicvoidrun(){System.out.println("runnable ...");}};newThread(runnable).start();}}

如果要实现 Runnable 接口,那么我们需要定义一个类,而在上述代码中,我们并没有去指明 class XXX implentments Runnable 这样一个类,我们创建了一个匿名类,来实现接口或者实现抽象方法。这在安卓中会大量用到,Java 中的话,用得其实并没有很多。

匿名类还有一个作用,就是可以访问跨包类中的 protected 方法。这个有点意思。比如在我们包 com.yhx.javabasic 中有个 HelloWorld.java

publicclassHelloWorld{protectedvoidsay(){System.out.println("Hello ...");}publicvoidsing(){System.out.println("sing ...");}}

在另一个包 com.yhx.com.yhx.anonymous 中有个类AnonymousTest.java,我们现在要想访问 HelloWorld.java 中的 say() 方法,怎么办呢?AnonymousTest.java

publicclassAnonymousTest{publicstaticvoidmain(String[]args){HelloWorldhelloWorld=newHelloWorld();helloWorld.sing();helloWorld.say();// 错误,不能调用不同包之间的 protected 方法}}

可以看到,由于 protected 关键字限制了作用域为同一个包内,所以在包外调用 protected方法时,就会出错。这个时候可以用匿名类来实现。更改上述方法,改之后的代码如下:

publicclassAnonymousTest{publicstaticvoidmain(String[]args){HelloWorldhelloWorld=newHelloWorld();helloWorld.sing();newHelloWorld(){voidcallHelloWorldSay(){super.say();}}.callHelloWorldSay();}}

控制台打印出:

这样就可以实现调用跨包之间的 protected 方法。

注意事项

非 static 内部类,不能用 static 修饰属性或方法。因为非静态类只有在实例化之后才能加载到 jvm 内存中。

相关文章

  • Java 中的方法内部类

    Java 中的方法内部类 方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内...

  • PHP转JAVA的记录

    Java 数组 内部类 内部类的创建:内部类可以对包内其他类隐藏想实现一个接口时, 不想新建类文件 内部类可以访问...

  • Java内部类

    Java内部类,简单来说就是将一个类定义在另一个类或者方法里面,主要分为成员内部类,局部内部类,匿名内部类和静态内...

  • Java内部类

    Java内部类 大纲: java内部类有什么特点?为什么需要内部类? 非静态内部类持有外部类的引用 内部类的分类。...

  • 内部类

    内部类可以分为:非静态内部类;静态内部类;匿名内部类。 一、内部类 首先要说,Java为什么要使用内部类?java...

  • Java静态内部类

    Java静态内部类 博客分类: java 两种内部类 Java的内部类有两种,一种是静态内部类,另一种是普通内部类...

  • Kotlin内联类、内部类、嵌套类

    Kotlin内联类、内部类、嵌套类 在开始介绍Kotlin内联类、内部类、嵌套类之前,先简要回顾一下java中的内...

  • JavaSE基础知识学习-----内部类

    内部类 类的五个成分:属性,方法,构造器,代码块,内部类。什么是内部类?在java中,允许一个类定义在另一个类的内...

  • Java 内部类和泛型的理解

    Java 内部类 Java非静态内部类持有对外部类的引用,可以访问外部类的状态使用方法 OuterClass.th...

  • kotlin之内部类,匿名内部类与伴生对象

    个人博客:haichenyi.com。感谢关注 内部类   kotlin的内部类与java的内部类有点不同java...

网友评论

    本文标题:Java 内部类

    本文链接:https://www.haomeiwen.com/subject/dgwcqqtx.html