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 stubOuter1 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 stubnew  Listener() {@Overridepublic void func1() {System.out.println("func1");}            @Overridepublic void func2() {System.out.println("func2");}        } ;}
    }

  

转载于:https://www.cnblogs.com/yidijimao/p/5232356.html

InnerClass内部类相关推荐

  1. Java03接口与内部类

    6 接口与内部类 接口 interface 对象克隆 内部类 inner class 代理 proxy 6.1 接口 public interface Comparable<T> {int ...

  2. (十)、java内部类与内部类的闭包和回调

    一.成员内部类 1.可以把一个内部类看做是一个成员.成员内部类可以无条件访问外部类的所有成员属性和成员方法. class OutterClass {//外部类private int in = 0;st ...

  3. JAVA入门级教学之(局部内部类)

    package com.lbj.javase21; /**  *     局部内部类等同于局部变量  *   *     重点:局部内部类在访问局部变量的时候,局部变量必须使用final修饰,据说在J ...

  4. fianl属性 java_java基础-类的高级属性(包、final、内部类)

    女神镇楼 类除了具有普通的特性之外,还有一些高级特性,比如包.内部类等.包在整个管理过程中起到非常积极的作用,使用包可以有效的管理繁杂的类文件,解决类重名的问题,当在类中配合包与权限修饰符使用时,可以 ...

  5. 【Java 面向对象】基础、Java程序的内存划分、嵌套类(内部类、静态嵌套类)、局部类、接口的升级问题(默认方法、静态方法)、instanceof

    面向对象 对象的内存 复杂对象的内存 对象数组的内存 思考:方法存储在哪里? Java程序的内存划分 this.super 注解(Annotation) 访问控制(Access Control) to ...

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

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

  7. 【Java】 第六章 接口、lambda 表达式与内部类 Java核心技术卷1基础知识原书第10版 读书笔记

    第六章 接口.lambda表达式与内部类 6. 接口.lambda 表达式与内部类 6.1 接口 6.1.1 接口概念 6.1.2 接口的特性 6.1.3 接口与抽象类 6.1.4 静态方法 6.1. ...

  8. Java 基础巩固:内部类的字节码学习和实战使用场景

    文章出自:安卓进阶学习指南 主要贡献者: Cloud9527 Alex_赵 Struggle shixinzhang 读完本文你将了解: 背景介绍 四种内部类介绍 成员内部类 静态内部类 局部内部类 ...

  9. 内部类和外部类的详解

    一*相关概念: 当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类.内部类也是封装的一种体现. 1.1.内部类 ...

最新文章

  1. AbpZero之企业微信---登录(拓展第三方auth授权登录)---第一步:查看AbpZero的auth第三方登录的底层机制...
  2. 研究生一年级,非计算机专业,自学机器学习现实吗?
  3. centos安装llvm_Linux CentOS上编译并安装Clang教程
  4. linux基础文件管理软硬链接
  5. C#多线程|匿名委托传参数|测试您的网站能承受的压力|附源代码
  6. 关于AdvancedDataGrid的header的数据传递
  7. 2060 super和5700xt哪个值得买?
  8. USD MID-160|全球最薄的MID!
  9. Migrations有两个文件迁移数据的方法
  10. Servlet各种接口和类
  11. http接口开发几种工具简单介绍
  12. dragonfly数据库
  13. 1050Ti 安装CUDA、cuDNN
  14. 《团队执行力》分享记录
  15. 论文阅读Construction of Refined Protein Interaction Network for Predicting Essential Proteins
  16. P2749 夜空繁星
  17. layui 表格数据源_「WPS办公助手」表格数据录入太慢?这个好用的技巧,轻松帮你搞定...
  18. flask中'bool' object has no attribute '__call__'问题
  19. nacos2.0服务提示注册成功,但是服务管理列表中没有注册到
  20. 云服务商将占据 80% CDN 市场份额,传统CDN或将终结

热门文章

  1. 输入参数的数目不足 matlab_哈工大被禁用MATLAB,工科学生慌了,论文至上间接导致软件依赖?...
  2. ASP正则表达式方面小笔记
  3. Python学习——02-Python基础——【9-面向对象进阶】——isinstance(obj,cls)、反射等...
  4. pandas学习笔记——阅读官方文档
  5. Java randomString
  6. 最简单的基于FFmpeg的移动端样例:IOS 视频转码器
  7. 使用PXE+VNC方式安装CentOS 7
  8. (原创)c#学习笔记06--函数02--变量的作用域01--其他结构中变量的作用域
  9. C# 格式化字符串 String.Format
  10. php守护进程热更新,服务器编程--守护进程