• 【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();
        }
    }
    View Code

      成员内部类

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

    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类型的,这样就实现了接口的隐藏
        }
    }
    View Code

      局部内部类

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

     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程序设计》

  • 相关阅读:
    教你用笔记本充当无线路由,wifi上网了!!!
    SQL重复记录查询
    ==、object.Equals()、object.ReferenceEquals()
    SeriesChartType
    容易被忽视的装箱问题
    [转]Anonymous type and implicit type
    as、is、GetType()
    [转]dataGridView控件DateTime列插入DateTimePicker
    .NET(C#):理解值类型/引用类型,装箱/拆箱,Object类
    通过其轴标签沿 X 轴对齐不同系列中的数据点
  • 原文地址:https://www.cnblogs.com/xing901022/p/3966609.html
Copyright © 2020-2023  润新知