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

  能够在一个类的内部定义还有一个类。这样的类称为嵌套类(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. MySQL 二进制日志过滤

    binlog_do_db; binlog_ignore_db; 这个两个参数是用来控制对哪个数据库的更改要记录日志:下面以binlog_ignore_db为例子. 假如binlog_ignore_db ...

  2. JAVA并发,CountDownLatch使用

    该文章转自:http://www.itzhai.com/the-introduction-and-use-of-a-countdownlatch.html CountDownLatch 1.类介绍 一 ...

  3. Developing your first FNC custom control

    Friday, May 13, 2016 Some weeks ago, we released the TMS FNC UI Pack, a set of Framework Neutral Com ...

  4. pyqt开发教程-搭建环境和开发示例

    搭建环境和开发示例 * 安装 安装包 要对应python的版本 32位安装包(我PC上) http://jaist.dl.sourceforge.net/project/pyqt/PyQt4/PyQt ...

  5. delphi datasnap 心跳包

    为了能让我们的服务程序更加稳定,有些细节问题必须解决.就如上一讲中提到的客户端拔掉网线,造成服务器上TCP变成死连接,如果死连接数量过多,对服务器能长期稳定运行是一个巨大的威胁.另外,经过测试,如果服 ...

  6. nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException

    You should autowire interface AbstractManager instead of class MailManager. If you have different im ...

  7. HDU 5735 Born Slippy(拆值DP+位运算)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5735 [题目大意] 给出一棵树,树上每个节点都有一个权值w,w不超过216,树的根为1,从一个点往 ...

  8. result 相关

    1.dispatcher 2.redirect 3.chain 4.redirectAction 5.freemarker 6.httpheader 7.stream 8.velocity 9.xsl ...

  9. 一些ASP.NET的小知识点

    DataFormatString="{0:格式字符串}" 我们知道在DataFormatString 中的 {0}表示数据本身,而在冒号后面的格式字符串代表所们希望数据显示的格式; ...

  10. 【转载】设备坐标(窗口/window)和逻辑坐标(视口/viewport)

    一.预备知识 1.窗口是基于逻辑坐标的. 2.视口是基于设备坐标. 3.设备坐标是以像素为单位的,逻辑坐标是以.cm,m,mm,..... 4.系统最后一定要把逻辑坐标变为设备坐标. 5.设备坐标有3 ...