专栏首页xingoo, 一个梦想做发明家的程序员【java开发系列】—— 嵌套类与内部类

【java开发系列】—— 嵌套类与内部类

嵌套类与内部类在java中使用的很广泛,为了避免难以理解,这里用了几个小例子,说明它的用法。

  嵌套类与内部类的结构如下图

  静态嵌套类  

  静态嵌套类,是一种在类之外声明的嵌套类,由于是静态的,所以不经过初始化,就可以通过类名,直接调用。

1 class out1{
2     private static String name = "xingoo";
3     static class info{
4         void print(){
5             System.out.println("name:"+name);
6         }
7     }
8 }

使用样例

package testClass;
class out1{
    private static String name = "xingoo";
    static class info{
        void print(){
            System.out.println("name:"+name);
        }
    }
}
class out2{
    private static String name = "xingoo test 2";
    static class info{
        String name = "inner infomation!";
        void printInner(){
            System.out.println("name:"+name);
        }
        void printOuter(){
            System.out.println("name:"+out2.name);
        }
    }
}
/**
 * 静态嵌套类
 * @author xingoo
 *
 */
public class test1 {
    public static void main(String[] args){
        //创建对象时,以xxx.yyy这种格式创建
        out1.info oi = new out1.info();
        oi.print();
        
        out2.info oi2 = new out2.info();
        oi2.printInner();
        oi2.printOuter();
    }
}

  成员内部类

  成员内部类,即该类作为另一个类的成员,因此只有引用另一个类,才能创建这个类。

1 class outer{
2     private String name = "xingoo";
3     class inner{
4         void print(){
5             System.out.println(name);
6         }
7     }
8 }

  通常也用于隐藏的实现某个接口,如下面所示,第一种是传统的实现方式,第二种是隐藏了实现接口的实现方式。

 1 interface Printer{
 2     void print(String name);
 3 }
 4 class outerImpl1 implements Printer{
 5     @Override
 6     public void print(String name) {
 7         System.out.println(name);
 8     }
 9 }
10 class outerImpl2{
11     private class inner implements Printer{
12         @Override
13         public void print(String name) {
14             System.out.println(name);
15         }
16     }
17     public Printer getPrinter(){
18         return new inner();
19     }
20 }

  使用样例

package testClass;
/**
 * 简单测试成员内部类
 * @author xingoo
 *
 */
class outer{
    private String name = "xingoo";
    class inner{
        void print(){
            System.out.println(name);
        }
    }
}
interface Printer{
    void print(String name);
}
class outerImpl1 implements Printer{
    @Override
    public void print(String name) {
        System.out.println(name);
    }
}
class outerImpl2{
    private class inner implements Printer{
        @Override
        public void print(String name) {
            System.out.println(name);
        }
    }
    public Printer getPrinter(){
        return new inner();
    }
}
/**
 * 成员内部类
 * @author xingoo
 *
 */
public class test2 {
    public static void main(String[] args){
        //创建一个外部类的对象,通过调用这个对象的new方法创建其内部类的对象
        outer o = new outer();
        outer.inner i = o.new inner();
        i.print();
        
        
        //内部类实现接口隐藏
        Printer out1 = new outerImpl1();
        out1.print("xingoo test1");
        outerImpl1 out1trans = (outerImpl1)out1;//支持向下转换
        
        Printer out2 = (new outerImpl2()).getPrinter();
        out2.print("xingoo test2");
        //无法向下转换,因为inner是private类型的,这样就实现了接口的隐藏
    }
}

  局部内部类

  局部类的声明之作用与某个代码块内,因此如果某个声明的类仅仅被一段程序所使用,其他地方再也用不到,就可以用这种实现方式。·

 1 interface Logger{
 2     public void log(String message);
 3 }
 4 public class test3 {
 5     
 6     String startTime = (new Date()).toString();
 7     /**
 8      * 局部内部类,从定义上来讲,不属于任何其他的类,因为是声明在这个类内部的。与匿名内部类不同的就是它有名字。
 9      * @return
10      */
11     public Logger getLogger(){
12         //由于LoggerImpl只在 getLogger内部使用,因此把它定义在函数内部,相对来说更安全一些
13         class LoggerImpl implements Logger{
14             @Override
15             public void log(String message) {
16                 System.out.println(startTime + ":" + message);
17             }
18         }
19         return new LoggerImpl();
20     }
21     
22     public static void main(String[] args){
23         test3 test = new test3();
24         Logger logger = test.getLogger();
25         logger.log("hello xingoo!");
26     }
27 }

  匿名内部类

  在使用new创建对象时,直接在后面创建它的实现类。

 1 abstract class Printable{
 2     public void print(String name){
 3         
 4     }
 5 }
 6 /**
 7  * 就是跟在new创建对象之后,直接定义它的类实现
 8  * @author Administrator
 9  */
10 public class test4 {
11     public static void main(String[] args){
12         Printable printer = new Printable(){
13             public void print(String name){
14                 System.out.println(name);
15             }
16         };//注意因为这其实是一个new语法,因此要加上分号;
17         printer.print("hello!xingoo!");
18     }
19 }

参考资料:《JAVA 7程序设计》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【设计模式】—— 创建者模式Builder

      模式意图   一个对象的创建十分复杂,为了区分构建过程和使用过程,因此分开。使用一个Director类进行对象的创建,Builder规定了这个创建过程。 ...

    用户1154259
  • Java程序员的日常 —— 注册工厂的妙用

    注册工厂是一种很常用的框架书写方法,它适合于快速创建相同类型的对象。 举个栗子 比如一个家具工厂,有沙发、椅子、茶几等等,正常的编程模式是这样的: //创...

    用户1154259
  • 【设计模式】—— 适配器模式Adapter

      模式意图   如果已经有了一种类,而需要调用的接口却并不能通过这个类实现。因此,把这个现有的类,经过适配,转换成支持接口的类。   换句话说,就是把一种现有...

    用户1154259
  • Java描述设计模式(02):简单工厂模式

    1)、OCP原则:软件实体,如类、模块和函数,应当对扩展开放,但对修改关闭。 2)、违反设计模式的OCP原则,新增食品类不方便扩展,代码改动较大。

    知了一笑
  • java学习之第五章编程题示例(初学篇)

    1 /* 2 Animal.java 3 */ 4 package animal; 5 6 public abstract class Animal { ...

    Gxjun
  • 九、委派模式与模板模式详解

    委派模式(Delegate Pattern ) 又叫委托模式, 是一种面向对象的设计模式, 允许对象组合实现与 继承相同的代码重用。它的基本作用就是负责任务的...

    编程之心
  • 《SpringMVC从入门到放肆》十二、SpringMVC自定义类型转换器

    之前的教程,我们都已经学会了如何使用Spring MVC来进行开发,掌握了基本的开发方法,返回不同类型的结果也有了一定的了解,包括返回ModelAndView、...

    I Tech You_我教你
  • 自定义参数解析器

    开发中,app端给服务端会传基础参数、其他参数,一般基础参数app端都会传给服务端,其他参数则是根据不同接口传不同参数。若以表单的形式提交的数据:

    LiosWong
  • java反射详解(3)

    1)Bootstrap ClassLoader 此加载器采用c++编写,一般开发中很少见。

    py3study
  • Android/Java 混淆中使用-assumenosideeffects删除日志代码遇到的问题

    今天发包给客户,发现混淆后的库时序有点问题。再三调试,发现锁失效了。wait()没有任何阻塞就跳过了。

    sickworm

扫码关注云+社区

领取腾讯云代金券