详解Java 中的嵌套类与内部类

详解Java 中的嵌套类与内部类

在Java中,可以在一个类内部定义另一个类,这种类称为嵌套类(nested class)。嵌套类有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类较少使用,非静态嵌套类使用较多,也就是常说的内部类。其中内部类又分为三种类型:

1、在外部类中直接定义的内部类。
2、在函数中定义的内部类。
3、匿名内部类。

对于这几种类型的访问规则,

示例程序如下:

package lxg;
//定义外部类
public class OuterClass {
  //外部类静态成员变量
  private static String outer_static_string = "outer_static_string";
  //外部类非静态成员变量
  private String outer_string = "outer_string";
   //定义静态嵌套类
  private static class inner_static_class {
    //静态嵌套类的静态成员变量
    private static String inner_static_string = "inner_static_string";
    //静态嵌套类的非静态成员变量
    private String inner_string = "inner_string";

    public void display( ) {
      System.out.println( outer_static_string ); //静态嵌套类可以直接访问外部类的静态成员变量
      // System.out.println(outer_string); //静态嵌套类不能直接访问外部类的非静态成员变量
      System.out.println( inner_static_string ); //可以访问自己的静态成员变量
      System.out.println( inner_string ); //可以访问自己的非静态成员变量
    }
  }

  public void printInnerStatic( ) {
    inner_static_class innStatic_class = new inner_static_class( );
    innStatic_class.display( );
//    System.out.println( inner_static_string ); //外部类不能直接访问静态嵌套类的成员变量
//    System.out.println( inner_string ); //外部类不能直接访问静态嵌套类的成员变量
    System.out.println( innStatic_class.inner_static_string ); //外部类可以通过类对象来访问静态嵌套类的成员变量
    System.out.println( innStatic_class.inner_string ); //外部类可以通过嵌套类的类对象来直接访问静态嵌套类的私有成员变量
  }

  //外部类直接定义内部类
  private class inner_class {
    private String inner_string = "inner_string";

    public void display(){
      System.out.println(outer_static_string); //内部类可以直接访问外部类的静态成员变量
      System.out.println(outer_string); //内部类可以直接访问外部类的静态成员变量
    }
  }

  public void printInner(){
    inner_class innClass = new inner_class( );

    System.out.println(innClass.inner_string); //外部类可以通过内部类的类对象来直接访问内部类类的私有成员变量
  }

  public void inner_function(){
    //函数中定义内部类
    class inner_function_class {
      private String inner_function_string = "inner_function_string";
      public void printInnerFunction(){
        System.out.println(outer_static_string); //内部类可以直接访问外部类的静态成员变量
        System.out.println(outer_string); //内部类可以直接访问外部类的静态成员变量
        System.out.println(inner_function_string); //可以直接访问自己的成员变量
      }
    }

    inner_function_class inner = new inner_function_class( );
    System.out.println(inner.inner_function_string);//外部类可以通过内部类的类对象来直接访问内部类的私有成员变量
  }

  public void printinnerfunction(){
//    inner_function_class inner = new inner_function_class( ); //函数中定义的内部类,只在所属的函数内可见
  }
}

通过示例程序可以看出:

1、对于静态嵌套类,其访问规则与静态成员变量相似,即静态方法不能直接访问非静态成员
2、对于内部类,可以直接访问外部类的成员变量
3、对于外部类,可以通过内部类的对象来访问内部类的私有成员变量,这一点与通常认为的访问规则差别较大
4、匿名内部类与在函数中定义的内部类相似,只在该函数内部可见。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2017-09-08

Java嵌套类和内部类详解

一.什么是嵌套类及内部类? 可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型: 静态嵌套类和非静态嵌套类.静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为 内部类(inner).嵌套类从JDK1.1开始引入.其中inner类又可分为三种: 其一.在一个类(外部类)中直接定义的内部类:     其二.在一个方法(外部类的方法)中定义的内部类;     其三.匿名内部类. 下面,我将说明这几种嵌套类的使用及注意事项. 二.静态嵌套类 如下所示代

深入理解Java嵌套类和内部类

 一.什么是嵌套类及内部类 可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类.静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner).嵌套类从JDK1.1开始引入.其中inner类又可分为三种: 其一.在一个类(外部类)中直接定义的内部类: 其二.在一个方法(外部类的方法)中定义的内部类: 其三.匿名内部类. 下面,我将说明这几种嵌套类的使用及注意事项. 二.静态嵌套类 如下所示代码为定义一个静态嵌套

java 嵌套类的详解及实例代码

java 嵌套类 到现在为止,我们都是在Java文件中直接定义类.这样的类出现在包(package)的级别上.Java允许类的嵌套定义. 这里将讲解如何在一个类中嵌套定义另一个类. 内部类 Java允许我们在类的内部定义一个类.如果这个类是没有static修饰符,那么这样一个嵌套在内部的类称为内部类(inner class). 内部类被认为是外部对象的一个成员.在定义内部类时,我们同样有访问权限控制(public, private, protected). 在使用内部类时,我们要先创建外部对象.

java开发中嵌套类的详解及实例

 java开发中嵌套类的详解 在java语言规范里面,嵌套类(Nested Classes)定义是: A nested class is any class whose declaration occurs within the body of another class or interface. A top level class is a class that is not a nested class. 说的简单一点,就是定义在类里面的类.一般把定义内部类的外围类成为包装类(enclos

深入理解Java 对象和类

Java作为一种面向对象语言.支持以下基本概念: •多态 •继承 •封装 •抽象 •类 •对象 •实例 •方法 •消息解析 本节我们重点研究对象和类的概念. •对象:对象是类的一个实例,有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行为有:摇尾巴.叫.吃等. •类:类是一个模板,它描述一类对象的行为和状态. Java中的对象 现在让我们深入了解什么是对象.看看周围真实的世界,会发现身边有很多对象,车,狗,人等等.所有这些对象都有自己的状态和行为. 拿一条狗来举例,它的状态有

全面理解Java类和对象

面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分.在面向对象程序设计(OOP)中,不必关心对象的具体实现.在传统的结构化程序设计中,算法是第一位的,数据结构是第二位的,即首先确定如何操作数,再考虑如何组织数据,以方便操作.而OOP则颠倒了这种次序,将数据放在第一位,然后再考虑操作数据的算法. 一.类 类是构造对象的模板和蓝图.通俗地说,类相当于建筑的图纸,而对象相当于建筑物.由类构造对象的过程称为创建对象的实例. Java中通过关键字class定义"类"

透彻理解Java中Synchronized(对象锁)和Static Synchronized(类锁)的区别

本文讲述了Java中Synchronized(对象锁)和Static Synchronized(类锁)的区别.分享给大家供大家参考,具体如下: Synchronized和Static Synchronized区别 通过分析这两个用法的分析,我们可以理解java中锁的概念.一个是实例锁(锁在某一个实例对象上,如果该类是单例,那么该锁也具有全局锁的概念),一个是全局锁(该锁针对的是类,无论实例多少个对象,那么线程都共享该锁).实例锁对应的就是synchronized关键字,而类锁(全局锁)对应的就是

Java TreeSet类的简单理解和使用

这篇文章主要介绍了Java TreeSet类的简单理解和使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 TreeSet类是Set接口的一个实现类,主要作用是用于对对象的排序以及确定存入对象的唯一性.给对象排序的方式有很多,比如一些基本类型int.String等类型就已经提供了很多排序的方法了,但是这并不说明TreeSet类就没有什么用了.在一些时候我们需要自定义一些类,同时需要对这个类的对象进行排序,那么这个时候我们就可以通过这个TreeS

深入理解java异常处理机制及应用

1. 引子 try-catch-finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的"教训"告诉我,这个东西可不是想象中的那么简单.听话.不信?那你看看下面的代码,"猜猜"它执行后的结果会是什么?不要往后看答案.也不许执行代码看真正答案哦.如果你的答案是正确,那么这篇文章你就不用浪费时间看啦. package Test; public class TestException { public TestEx