• 深入理解java嵌套类和内部类



    一、什么是嵌套类及内部类

      可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。嵌套类从JDK1.1开始引入。其中inner类又可分为三种:
      其一、在一个类(外部类)中直接定义的内部类;
      其二、在一个方法(外部类的方法)中定义的内部类;
      其三、匿名内部类。

      下面,我将说明这几种嵌套类的使用及注意事项。

    二、静态嵌套类

      如下所示代码为定义一个静态嵌套类,
      public class StaticTest { 
              private static String name = "javaJohn";         
        private String id = "X001";
        static class Person{
          private String address = "swjtu,chenDu,China";
          public String mail = "josserchai@yahoo.com";//内部类公有成员
          public void display(){
            //System.out.println(id);//不能直接访问外部类的非静态成员
            System.out.println(name);//只能直接访问外部类的静态成员
            System.out.println("Inner "+address);//访问本内部类成员。
          }
        }
      
        public void printInfo(){
          Person person = new Person();
          person.display();
          //System.out.println(mail);//不可访问
          //System.out.println(address);//不可访问
          System.out.println(person.address);//可以访问内部类的私有成员
          System.out.println(person.mail);//可以访问内部类的公有成员
      
        }
        public static void main(String[] args) {
        StaticTest staticTest = new StaticTest();
        staticTest.printInfo();
      }
      }


      在静态嵌套类内部,不能访问外部类的非静态成员,这是由Java语法中"静态方法不能直接访问非静态成员"所限定。若想访问外部类的变量,必须通过其它方法解决,由于这个原因,静态嵌套类使用很少。注意,外部类访问内部类的的成员有些特别,不能直接访问,但可以通过内部类来访问,这是因为静态嵌套内的所有成员和方法默认为静态的了。同时注意,内部静态类Person只在类StaticTest 范围内可见,若在其它类中引用或初始化,均是错误的。

    三、在外部类中定义内部类

      如下所示代码为在外部类中定义两个内部类及它们的调用关系:
      
    public class Outer { 
               int outer_x = 100;
        class Inner{
          public int y = 10;
          private int z = 9;
          int m = 5;
          public void display(){
            System.out.println("display outer_x:"+ outer_x);
          }
          private void display2(){
            System.out.println("display outer_x:"+ outer_x);
          }
        }
        void test(){
          Inner inner = new Inner();
          inner.display();
          inner.display2();
          //System.out.println("Inner y:" + y);//不能访问内部内变量
          System.out.println("Inner y:" + inner.y);//可以访问
          System.out.println("Inner z:" + inner.z);//可以访问
          System.out.println("Inner m:" + inner.m);//可以访问
          InnerTwo innerTwo = new InnerTwo();
          innerTwo.show();
        }
        class InnerTwo{
          Inner innerx = new Inner();
          public void show(){
            //System.out.println(y);//不可访问Innter的y成员
            //System.out.println(Inner.y);//不可直接访问Inner的任何成员和方法
            innerx.display();//可以访问
            innerx.display2();//可以访问
            System.out.println(innerx.y);//可以访问
            System.out.println(innerx.z);//可以访问
            System.out.println(innerx.m);//可以访问
          }
        }
        public static void main(String args[]){
          Outer outer = new Outer();
          outer.test();
        }
      }


      以上代码需要说明有,对于内部类,通常在定义类的class关键字前不加public 或 private等限制符,若加了没有任何影响,同时好像这些限定符对内部类的变量和方法也没有影响(?)。另外,就是要注意,内部类Inner及InnterTwo只在类Outer的作用域内是可知的,如果类Outer外的任何代码尝试初始化类Inner或使用它,编译就不会通过。同时,内部类的变量成员只在内部内内部可见,若外部类或同层次的内部类需要访问,需采用示例程序中的方法,不可直接访问内部类的变量。
    Meet so Meet. C plusplus I-PLUS....
  • 相关阅读:
    网站访问量大 怎样优化mysql数据库
    BootStrap 模态框禁用空白处点击关闭
    常用SQL语句
    诅咒JavaScript之----ArcGIS JavaScript 点聚合 ClusterLayer
    模态框与 天地图地图控件冲突
    FXK Javascript
    从列表中或数组中随机抽取固定数量的元素组成新的数组或列表
    wangEditor
    手把手教你用vue-cli构建一个简单的路由应用
    解决eclipse端口被占用的问题
  • 原文地址:https://www.cnblogs.com/iplus/p/4490199.html
Copyright © 2020-2023  润新知