zoukankan      html  css  js  c++  java
  • 第11章 类的高级特性--内部类

    在类中再定义一个类,则将在类中再定义的那个类称为内部类;

    内部类可分为成员内部类、局部内部类、匿名类

    1、成员内部类

    在内部类中可以随意使用外部类的成员方法以及成员变量,尽管这些类成员被修饰为private;

    但内部类的成员只有在内部类的范围之内是可知的,不能被外部类使用

    内部类的对象实例化操作必须在外部类

    使用this关键字获取内部类与外部类的引用

    public class TheSameName{
        private int x;
        private class Inner{
            private int x=9;
            public void doit(int_x){
                x++;  //调用的是形参x
                this.x++;   //调用内部类的变量x
                TheSameName.this.x++;    //调用外部类的变量x
            }
       }
    }

    2、局部内部类

    interface OutInterface2{
    }
    class OuterClass3{
        public OutInterface2  doit(final String x){
            class InnerClass2 implements OutInterface2{
                InnerClass2(String s){
                    s=x;
                    System.out.println(s);
                }
            }
            return new InnerClass2("doit");
        }
    }

    内部类被定义在了doit()方法内部,内部类InnerClass2是doit()方法的一部分,并非OuterClass3类中的一部分,所以在doit()方法的外部不能访问该内部类,但是该内部类可以访问当前代码快的常量以及外部类的所有成员。

    3、匿名内部类

    匿名类的所有实现代码都需要在大括号之间进行编写

    return new A(){
        ...//内部类体
    };

    匿名内部类没有名称,实质上这种内部类的作用就是创建一个实现于OutInterface2接口的匿名类的对象:

    class OuterClass4{
        public OutInterface2 doit(){
            return new OutInterface2(){
                private int i=0;
                public int getValue(){
                    return i;
                }
            };  //这个分号并不是代表定义内部类结束的标识,而是代表创建OuterInterface2引用表达式的标识
        }
    }

    4、静态内部类

    在内部类前添加修饰符static,这个内部类就变成静态内部类了;

    一个静态内部类中可以声明static成员,但是在非静态内部类中不可以声明静态成员;

    静态内部类不可以使用外部类的非静态成员;

    5、内部类的继承

    public class OutputInnerClass extends ClassA.ClassB{ //继承内部类ClassB
        public OutputInnerClass(ClassA a){
            a.super();
        }
    }
    class ClassA{
        class ClassB{
        }
    }

    在某个类继承内部类时,必须硬性给予这个类一个带参数的构造方法,并且该构造方法的参数为需要继承内部类的外部类的引用,同时在构造方法中使用a.super()语句,这样才能为继承提供了必要的对象引用。

  • 相关阅读:
    ADO.NET 中的数据并发
    net中前台javascript与后台c#函数相互调用
    js正则函数match、exec、test、search、replace、split使用介绍集合
    jQuery遍历Table tr td td中包含标签
    SQL你必须知道的-查询聚合分组排序
    haut-1280 诡异的迷宫
    int、long long等的取值范围
    codeforce 855B
    nyoj-2357
    codeforces 858A
  • 原文地址:https://www.cnblogs.com/chamie/p/4700538.html
Copyright © 2011-2022 走看看