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

  能够在一个类的内部定义还有一个类。这样的类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用非常少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。嵌套类从JDK1.1開始引入。当中inner类又可分为三种:

  其一、在一个类(外部类)中直接定义的内部类。

  其二、在一个方法(外部类的方法)中定义的内部类;

  其三、匿名内部类。

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

二、静态嵌套类

  例如以下所看到的代码为定义一个静态嵌套类,

  1. public class StaticTest {
  2. private static String name = "javaJohn"; 
  3.   private String id = "X001";
  4.   static class Person{
  5.     private String address = "swjtu,chenDu,China";
  6.     public String mail = "josserchai@yahoo.com";//内部类公有成员
  7.     public void display(){
  8.       //System.out.println(id);//不能直接訪问外部类的非静态成员
  9.       System.out.println(name);//仅仅能直接訪问外部类的静态成员
  10.       System.out.println("Inner "+address);//訪问本内部类成员。

  11.     }
  12.   }
  13.   public void printInfo(){
  14.     Person person = new Person();
  15.     person.display();
  16.     //System.out.println(mail);//不可訪问
  17.     //System.out.println(address);//不可訪问
  18.     System.out.println(person.address);//能够訪问内部类的私有成员
  19.     System.out.println(person.mail);//能够訪问内部类的公有成员
  20.   }
  21.   public static void main(String[] args) {
  22.   StaticTest staticTest = new StaticTest();
  23.   staticTest.printInfo();
  24. }
  25. }

  在静态嵌套类内部,不能訪问外部类的非静态成员。这是由Java语法中"静态方法不能直接訪问非静态成员"所限定。

若想訪问外部类的变量,必须通过其他方法解决,由于这个原因,静态嵌套类使用非常少。注意,外部类訪问内部类的的成员有些特别,不能直接訪问。但能够通过内部类来訪问。这是由于静态嵌套内的全部成员和方法默觉得静态的了。

同一时候注意。内部静态类Person仅仅在类StaticTest 范围内可见,若在其他类中引用或初始化,均是错误的。

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

  例如以下所看到的代码为在外部类中定义两个内部类及它们的调用关系:

  

  1. public class Outer {
  2.   int outer_x = 100;
  3.     class Inner{
  4.       public int y = 10;
  5.       private int z = 9;
  6.       int m = 5;
  7.       public void display(){
  8.         System.out.println("display outer_x:"+ outer_x);
  9.       }
  10.       private void display2(){
  11.         System.out.println("display outer_x:"+ outer_x);
  12.       }
  13.     }
  14.     void test(){
  15.       Inner inner = new Inner();
  16.       inner.display();
  17.       inner.display2();
  18.       //System.out.println("Inner y:" + y);//不能訪问内部内变量
  19.       System.out.println("Inner y:" + inner.y);//能够訪问
  20.       System.out.println("Inner z:" + inner.z);//能够訪问
  21.       System.out.println("Inner m:" + inner.m);//能够訪问
  22.       InnerTwo innerTwo = new InnerTwo();
  23.       innerTwo.show();
  24.     }
  25.     class InnerTwo{
  26.       Inner innerx = new Inner();
  27.       public void show(){
  28.         //System.out.println(y);//不可訪问Innter的y成员
  29.         //System.out.println(Inner.y);//不可直接訪问Inner的不论什么成员和方法
  30.         innerx.display();//能够訪问
  31.         innerx.display2();//能够訪问
  32.         System.out.println(innerx.y);//能够訪问
  33.         System.out.println(innerx.z);//能够訪问
  34.         System.out.println(innerx.m);//能够訪问
  35.       }
  36.     }
  37.     public static void main(String args[]){
  38.       Outer outer = new Outer();
  39.       outer.test();
  40.     }
  41.   }

  以上代码须要说明有,对于内部类。通常在定义类的classkeyword前不加public 或 private等限制符,若加了没有不论什么影响,同一时候好像这些限定符对内部类的变量和方法也没有影响(?)。另外,就是要注意,内部类Inner及InnterTwo仅仅在类Outer的作用域内是可知的,假设类Outer外的不论什么代码尝试初始化类Inner或使用它,编译就不会通过。同一时候,内部类的变量成员仅仅在内部内内部可见,若外部类或同层次的内部类须要訪问。需採用演示样例程序中的方法,不可直接訪问内部类的变量。

深入理解java嵌套类和内部类的更多相关文章

  1. JAVA 嵌套类和内部类

    一.什么是嵌套类及内部类?  可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:  静态嵌套类和非静态嵌套类.静态嵌套类使用很少,最重要的是非静态嵌套类, ...

  2. 分析java 嵌套类与内部类

    一.什么是嵌套类及内部类?     可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类.静态嵌套类使用很少,最重要的是非静态嵌套类 ...

  3. (十二)java嵌套类和内部类

    嵌套类和内部类:在一个类里边定义的类叫做嵌套类,其中没有static修饰的嵌套类是我们通常说的内部类,而被static修饰的嵌套类不常用.有的地方没有嵌套类和内部类的区分,直接是嵌套类就称作内部类,没 ...

  4. Java 嵌套类和内部类演示样例<二>

    嵌套类(nested class)是一个在还有一个类或接口内部声明的类. 嵌套类分为两种:静态内部类(static inner class)和非静态嵌套类(non-static nested clas ...

  5. Java 嵌套类和内部类演示样例<三>

    <span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-s ...

  6. Java中的嵌套类和内部类

    以前看<Java编程思想>的时候,看到过嵌套类跟内部类的区别,不过后来就把它们的概念给忘了吧.昨天在看<数据结构与算法分析(Java语言版)>的时候,又遇到了这个概念,当时就很 ...

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

    嵌套类与内部类在java中使用的很广泛,为了避免难以理解,这里用了几个小例子,说明它的用法. 嵌套类与内部类的结构如下图 静态嵌套类 静态嵌套类,是一种在类之外声明的嵌套类,由于是静态的,所以不经过初 ...

  8. Java嵌套类,内部类和外部类

    1.嵌套类,内部类 嵌套类是指被定义在一个类内部的类: JAVA的嵌套类有很多种类:1.静态成员类:2.非静态成员类:3.匿名类:4.局部类:其中,除了静态成员类之外,其他的都是内部类,因为静态成员类 ...

  9. Java 嵌套类基础详解

    目录 1. 什么是嵌套类? 2. 为什么要使用嵌套类? 3. 嵌套类的类型 4. 静态嵌套类 5. 非静态嵌套类 5.1 成员内部类 5.2 局部内部类 5.3 匿名内部类 6. 嵌套接口 1. 什么 ...

随机推荐

  1. nginx gzip on

    # Gzip settings. gzip on; gzip_http_version 1.0;默认值是1.1 gzip_comp_level ; #压缩级别,1压缩比最小处理速度最快,9压缩比最大但 ...

  2. 一道Python练习题

    有关字符串与编码的,转自廖雪峰Python教程. 小明的成绩从去年的72分提升到了今年的85分,请计算小明成绩提升的百分点,并用字符串格式化显示出'xx.x%',只保留小数点后1位: # -*- co ...

  3. H3C交换配置PBR最佳实践

    简要说明 PBR算是比较常用的功能,需要我们去掌握一下 配置步骤简要 配置BFD 配置track 配置acl 配置policy-based-route 在接口上面应用policy-based-rout ...

  4. Making your first driver - complete walkthrough(使用VisualDDK)

    This article describes how to create, build and debug your first driver using Visual Studio and Visu ...

  5. js实现日期的相加减

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  6. App引导页面源代码的实现

    一.页面效果图

  7. ubuntu 中 ThinkPHP 上传文件无法得到文件名

    在 419-424 行.

  8. 大夏VIEW使用技巧

    HDXTextView *remark=[[HDXTextView alloc] initWithFrame:CGRectMake(leftmargin-5,labbackView.top, cell ...

  9. redis在java项目中的使用

    在上一篇文章中已经讲了redis的spring配置,这篇将会描述redis在java项目中的使用. redis存储形式都是key-value(键值对),按照存储的内容分为两种,一种是存简单数据,即数字 ...

  10. Last Defence (run time error)

    Last Defence时间限制:1000 ms | 内存限制:65535 KB描述Given two integers A and B. Sequence S is defined as follo ...