1,内部类概述

  • 定义:把A类定义在B类内部,则A类是内部类。如下所示:
  • class Outer1{外部类
    String name1;
    public void show(){
    System.out.println("Outer1.show()"+new Inner1().name);
    }
    class Inner1{//内部类
    String name;
    public void fun(){
    System.out.println("Outer1.Inner1.fun()"+name1);
    }
    }
    }
  • 内部类的访问特点
    • 内部类可以直接访问外部类的成员,包括私有。
    • 外部类要访问内部类的成员或功能,则必须创建内部类的对象。
  • 按照内部类在类中定义的位置不同,可以分为如下两种格式:
    • 成员位置(成员内部类)
    • 局部位置(局部内部类)

2,成员内部类

  • 一般内部类就是不让外部访问的,但并不是不可以被访问(但你非得。。。)
  • 被静态修饰的成员内部类只能访问外部类的静态成员
  • 内部类被静态修饰后的方法
    • 非静态方法:外部类名.内部类名 对象名 = new 外部类名.内部类名();
    • 静态方法  :上面创建的对象访问,或者 外部类名.内部类名.方法名();(类比,被静态修饰的类既可以直接通过类名访问其成员变量,也可以通过new出对象来访问)
  • //成员内部类的以上所有情况
    class Outer1{
    private String name1;
    static String string;
    class Inner2{
    public void show(){
    //内部类可以直接访问外部类的所有成员
    System.out.println("Outer1.show()"+name1);
    }
    } static class Inner1{
    String name;
    public void fun(){//被静态修饰的内部类,只能访问外部类的静态成员
    //因为静态修饰的类,一开始就会被加载进来,所以如果内部有外部成员,则必须是静态的
    System.out.println("Outer1.Inner1.fun()"+name1);//访问外部非静态成员出错
    System.out.println("Outer1.Inner1.fun()"+string);//访问外部静态成员正确
    }
    }
    }
  • 面试的例子,如下
  • class Outer1 {
    public int num = 10;
    class Inner {
    public int num = 20;
    public void show() {
    int num = 30;
    System.out.println(num);
    System.out.println(this.num);
    System.out.println(Outer1.this.num );
    }
    }
    }
    //在控制分别输出:30,20,10
    public class TestMain2 { public static void main(String[] args) {
    // TODO Auto-generated method stub Outer1.Inner inner = new Outer1().new Inner();
    inner.show(); } }

3,局部内部类 

  • 局部内部类访问局部变量时,局部变量必须被final修饰(JDK1.8中局部变量可以不被final显式修饰,但还是有final属性的亲测正确。)
  • 原因:因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有立马从堆内存中消失,还要使用那个变量。为了让数据还能继续被使用,就用fianl修饰,这样,在堆内存里面存储的其实是一个常量值。
  • 局部内部类只能在局部方法内部使用。详细代码如下
    • class Outer1{
      private String name1;
      static String string; public void show(){
      int imkk=0;//局部变量
      String string = "OK?";
      class Inner2{//局部内部类
      public void show(){
      System.out.println("Outer1.show()"+string);//
      System.out.println("Outer1.show()"+imkk);//编译失败是因为i不是final修饰的,JDK1.8可以通过
           i=3;//会提示错误,说明还是有final属性的。
      }
      }
      new Inner2().show();
      }
      } public class TestMain1 {
      String name;
      public static void main(String[] args) {
      // TODO Auto-generated method stub
      Outer1 outer1 = new Outer1();
      outer1.show();
      }
      }

4,匿名内部类

  • 就是内部类的简化写法(在安卓开发中常用匿名内部类,节省内存空间)
  • 前提:存在一个类或者接口(这里的类可以是具体类也可以是抽象类。)
  • 格式:new 类名或者接口名() {重写方法;}
  • 本质:是一个继承了类或者实现了接口的子类匿名对象
  • 例子如下所示:
  • //匿名内部类
    interface Listener{//接口 public void func1();
    public void func2(); } public class TestMain3_niming { public static void main(String[] args) {
    // TODO Auto-generated method stub
    new Listener() {
    @Override
    public void func1() {
    System.out.println("func1");
    }
    @Override
    public void func2() {
    System.out.println("func2");
    }
    } ;
    }
    }

  

InnerClass内部类的更多相关文章

  1. 【Java】InnerClass 内部类

    Java 允许一个类的定义位于另一个类的内部,前者为内部类,后者称为外部类 InnerClass一般定义它的类或语句块之中外部类引用时必须给出完整的名称 成员内部类 & 局部内部类 - 静态成 ...

  2. Java基础_内部类、静态内部类、成员内部类、局部内部类、匿名内部类 (转)

    From: http://www.itzhai.com/java-based-notebook-a-static-inner-class-within-a-class-member-within-th ...

  3. Java:内部类(静态内部类、成员内部类、局部内部类、匿名内部类)

    Java基础_内部类:在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类. 内部类的主要作用:使用内部类可以减少命名冲突. 定义位置:一个内部类可以定义在一个类中,也可以 ...

  4. Java内部类——成员内部类

    成员内部类的意思就是,一个外层类里面包含着一个非static的class,举例如下: class OuterClass { //变量,函数定义... class InnerClass { //变量,函 ...

  5. java —— 内部类

    _ 普通内部类 静态内部类 局部内部类 匿名内部类 内部类 内部类是定义在另一个类中的类,定义内部类会起到的作用有以下三点: 1.内部类方法访问该类定义所在的作用域中的数据,包括私有的数据. 2.内部 ...

  6. Java进阶篇(二)——抽象类、内部类

    之前在类和对象中我们说到了类的普通特性,本篇将介绍类的一些高级特性. 一.抽象类 抽象类:抽象类是只声明方法的存在而不去具体实现它的类.抽象类不能被实例化,也就是不能创建其对象.使用abstract关 ...

  7. Java Nested Classes(内部类~第一篇英文技术文档翻译)

    鄙人最近尝试着翻译了自己的第一篇英文技术文档.Java Nested Classes Reference From Oracle Documentation 目录 嵌套类-Nested Classes ...

  8. Java核心技术-接口、lambda表达式与内部类

    本章将主要介绍: 接口技术:主要用来描述类具有什么功能,而并不给出每个功能的具体实现.一个类可以实现一个或多个接口. lambda表达式:这是一种表示可以在将来的某个时间点执行的代码块的简洁方法. 内 ...

  9. JAVA普通内部类的用法

    内部类顾名思义就是定义在一个类的内部 内部类又有普通内部类.方法和域内的内部类.匿名内部类.嵌套内部类 普通内部类的基础用法 class MyClass{ class InnerClass1{ pub ...

随机推荐

  1. 【bzoj2245】 SDOI2011—工作安排

    http://www.lydsy.com/JudgeOnline/problem.php?id=2245 (题目链接) 题意 n个产品,每个需要造C[i]件:m个员工,每个员工可以制造一些产品:每个员 ...

  2. 前端打包/自动化构建工具:fis3

    据说这个可以进行打包,并且可以实现类似/script/test-adsf123.js或者/script/test.js?v=asdf123 先做个记号 参考:http://fis.baidu.com/

  3. 微软注册dll在dotnet开发时起到缓存的作用

    经过试验,我发觉只要是注册了dll之后,会在全局的环境中得到很好的体现,比如无需指定具体物理路径的dll引用,搜索即可引用等,同时也得到一点: 1.会缓存起这个dll先,在不重启电脑的情况,本地物理路 ...

  4. SQLServer自动备份和自动删除过期文件

    以下为转载的文章: 点击下一步: 自定义名称和说明,点击更改: 点击确定,下一步 1.备份: 选择备份,下一步,再下一步,选择需要备份的数据库: 选择备份文件存放的路径: 点击下一步,选择系统产生的报 ...

  5. Android数据存储-通过SharedPreferences实现记住密码的操作

    在Android中登陆中,为了实现用户的方便,往往需要根据用户的需要进行记住密码的操作,所以,在Android数据存储中SharedPreferences恰恰可以实现这一点 下面,小编将带领大家通过S ...

  6. poj3484 Showstopper 二分

    题目地址 二分用的很是巧妙!关键是抽象出问题本质. #include <cstdio> #include <string> #include <cstring> ; ...

  7. [iOS 图像处理相关]

    //使用CGImage获取并修改图片像素 #define Mask8(x) ( (x) & 0xFF ) #define R(x) ( Mask8(x) ) #define G(x) ( Ma ...

  8. 记一次rsync增量同步远程服务器文件

    rsync remote shell 增量方式同步数据 rsync同步文件有两种方式,一种是daemon的方式(rsync daemon)另一种方式是通过远程shell方式(rsync remote ...

  9. HTML中<meta>标签如何正确使用

    HTML中<meta>标签如何正确使用 如果我们在浏览器中按下F12或者Ctrl+shift+J,便可以打开开发者工具,在element中即可看到<head>元素中有不少< ...

  10. CSS3的transition动画功能

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...