Java 允许一个类的定义位于另一个类的内部,前者为内部类,后者称为外部类

InnerClass一般定义它的类或语句块之中外部类引用时必须给出完整的名称

成员内部类  &  局部内部类

- 静态成员 内部类

- 非静态成员 内部类

- 匿名内部类

静态内部类  成员内部类  局部内部类

// 相对于内部类而言,这是一个外部类
public class OuterClass {
public int a;
int b;
protected int c;
private int d; static int e; public void memberMethod(){
System.out.println("外部类的成员方法!"); // 成员内部类可以创建实例
InnerClass innerClass = new InnerClass();
// 静态内部类可以创建实例
StaticInnerClass staticInnerClass = new StaticInnerClass();
} public static void staticMethod(){
System.out.println("外部类的静态方法!");
} // 成员内部类和静态内部类 都可以abstract抽象 或者final,都可以被4种权限访问修饰 // 成员内部类 不允许任何静态存在
class InnerClass{
// 成员内部类可以修饰所有访问权限
public int a;
int b;
protected int c;
private int d; // 成员内部类不能写静态方法
// static void staticMethod(){} // 成员内部类可以声明成员方法
void memberMethod(){
// 成员内部类可以调用外部类的成员方法
OuterClass.this.memberMethod(); // 成员内部类外部类的静态方法也能被调用
OuterClass.staticMethod();
} // 成员内部类可以构造器
InnerClass(){} // 各个字段的访问
public void checkField(int a){
// 形参的a
a = 50;
// 本成员内部类的字段a
this.a = 100;
// 外部类的字段a
OuterClass.this.a = 150;
}
} // 静态内部类
static class StaticInnerClass{
// 静态内部类可以修饰所有访问权限
public int a;
int b;
protected int c;
private int d; // 静态内部类可以声明成员方法
void memberMethod(){
// 可以调用外部类的静态方法
OuterClass.staticMethod(); // 外部类的成员方法不行
// OuterClass.this.memberMethod();
} // 静态内部类可以声明静态方法
static void staticMethod(){
// 可以调用外部类的静态方法
OuterClass.staticMethod(); // 外部类的成员方法不行
// OuterClass.this.memberMethod();
} public void fieldCheck(int a){
// 形参字段
a = 100; // 静态内部类的字段
this.a = 150; // 外部类字段 只能访问静态方法和静态字段
OuterClass.e = 300;
} // 静态内部类也可以构造器
StaticInnerClass(){}
} public void classMethod(){
// 局部内部类 没有权限访问修饰,只做用在这个方法之内 ,可以设置final修饰局部内部类 // 被内部类所访问的局部变量必须是Final的
// x的作用域之存活于这个方法中
// 当方法调用结束,方法出栈,x变量即被销毁掉
final int x = 123; // 局部内部类
class LocalInnerClass{ // 但是局部内部类的实例依然才在,依然保持这个x变量的引用指向
// 如果在局部方法被销毁后调用这个方法,就无法再访问这个x变量,这就是BUG问题
// 但是在JDK8已经默认隐式的表示这个x变量是final修饰的,x必须是一个常量的存在
// 即表示如果x被销毁,但其值不发生变化,依然是可以被访问赋予的 // 这个原因在于 局部内部类的实例的作用域大于了这个变量的作用域
public int returnX(){
// x += 100; x变量不能被修改
return x;
}
}
} // 局部内部类的用法,可以用于返回一个实现某接口的实例出来
public Comparable getComparable(){
class LocalInnerClass implements Comparable{
// 局部内部类重写接口方法
@Override
public int compareTo(Object o) {
return 0;
}
}
// 返回给外部调用
return new LocalInnerClass();
}
}

三个内部类

静态内部类 和 成员内部类在外部的实例创建与访问

public class ClassTest {
public static void main(String[] args) {
// 实例化静态内部类
OuterClass.StaticInnerClass staticInnerClass = new OuterClass.StaticInnerClass();
// 静态内部类的成员方法
staticInnerClass.memberMethod();
// 静态内部类的静态方法
OuterClass.StaticInnerClass.staticMethod(); // 实例化成员内部类,必须要有外部类的实例才可以
OuterClass outerClass = new OuterClass(); //先创建外部实例
OuterClass.InnerClass innerClass = outerClass.new InnerClass(); //再通过外部实例调用内部初始化
// 也可以直接匿名外部类对象,调用内部类初始化
OuterClass.InnerClass innerClass2 = new OuterClass().new InnerClass(); // 成员内部类调用成员方法
innerClass.memberMethod();
}
}

实例化与访问

匿名内部类

public class ClassTest {
public static void main(String[] args) { AnonymousInnerClass anonymousInnerClass = new AnonymousInnerClass() {
// 这就是匿名内部类的类体,匿名,顾名思义,没有类的名字 // 重写接口的方法
@Override
public void aicMethod() {
System.out.println("这就是匿名内部类");
} // 匿名内部类只能声明这一次,不能像显示的类一样保存下来
// 用于创建去实现一个接口或者继承一个抽象类,或者继承普通类也可以
// 适用于实现只有一个方法的接口,例如多线程的Runnable // 注意线程还有一个Callable可以使用
};
}
} // 声明一个接口和一个抽象方法
interface AnonymousInnerClass{
void aicMethod();
}

匿名内部类

【Java】InnerClass 内部类的更多相关文章

  1. Java基础-内部类-为什么成员内部类可以无条件访问外部类

    在此之前,我们已经讨论过了成员内部类可以无条件访问外部类的成员,那具体究竟是如何实现的呢?下面通过反编译字节码文件看看究竟.事实上,编译器在进行编译的时候,会将成员内部类单独编译成一个字节码文件,下面 ...

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

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

  3. JAVA基础——内部类详解

    JAVA内部类详解 在我的另一篇java三大特性的封装中讲到java内部类的简单概要,这里将详细深入了解java内部类的使用和应用. 我们知道内部类可分为以下几种: 成员内部类 静态内部类 方法内部类 ...

  4. 【Java】 内部类

    [Java]内部类 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 使用内部类的的原因主要有三点: 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据. 内部类可以对同一个包中的 ...

  5. java中内部类的积累

    放在一个类的内部的类我们就叫内部类. 二. 作用 1.内部类可以很好的实现隐藏 一般的非内部类,是不允许有 private 与protected权限的,但内部类可以 2.内部类拥有外围类的所有元素的访 ...

  6. java中内部类的讲解

    java中有一个内部类的概念,由于之前一直比较忙,没有单独拿出时间总结一下,今天我就把内部类的相关知识进行一下汇总,如果有不足之处,欢迎批评指正. 1)java内部类的概念.       在一个类的的 ...

  7. Java学习--内部类(一)

    Java学习--内部类(一) 一. 内部类的定义和特点 class Outer{ privite int num = 5; class Inner{ public void Display(){ Sy ...

  8. Java的内部类

    Java的内部类 首先我们来了解一下什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类可以是静态static的,也可用public,default,protected和private修饰 ...

  9. java使用内部类的好处及其初始化

    java使用内部类的原因 每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响          java内部类初始化 ForeCatal ...

  10. JAVA面向对象-----内部类的概述

    JAVA面向对象-–内部类的概述s 将类定义在另一个类的内部则成为内部类.其实就是类定义的位置发生了变化. 在一个类中,定义在类中的叫成员变量,定义在函数中的叫成员函数,那么根据类定义的位置也可以分为 ...

随机推荐

  1. Python中常见的报错名称

    Python中常见的报错名称 1.SyntaxError 语法错误.看看是否用Python关键字命名变量,有没有使用中文符号,运算符.逻辑运算符等符号是不是使用不规范. 2.IndentationEr ...

  2. iOS包重签名工具,ipa文件重签名,快速签名,SignTool签名工具,好用的签名工具,App重签名

    新工具 ProjectTool 已上线 这是一款快速写白包工具,秒级别写H5游戏壳包,可视化操作,极易使用,支持Swift.Objecive-C双语言 QQ交流群:811715780 进入 Proje ...

  3. Integration of Metabolomics and Transcriptomics To Reveal Metabolic Characteristics and Key Targets Associated with Cisplatin Resistance in Nonsmall Cell Lung Cancer(解读人:林山云)

    期刊名:J. Proteome Res 发表时间:(2019年8月) IF:3.78 单位: 上海第九人民医院药学系,上海交通大学药学院 上海交通大学药物与生物化学系   物种:人源A549细胞系 技 ...

  4. 原来rollup这么简单之 rollup.watch篇

    大家好,我是小雨小雨,致力于分享有趣的.实用的技术文章. 内容分为翻译和原创,如果有问题,欢迎随时评论或私信,希望和大家一起进步. 大家的支持是我创作的动力. 计划 rollup系列打算一章一章的放出 ...

  5. vue one one

    目录 Vue 渐进式 JavaScript 框架 一.走进Vue 1.what -- 什么是Vue 2.why -- 为什么要学习Vue 3.special -- 特点 4.how -- 如何使用Vu ...

  6. Longest subarray of target sum

    2018-07-08 13:24:31 一.525. Contiguous Array 问题描述: 问题求解: 我们都知道对于subarray的问题,暴力求解的时间复杂度为O(n ^ 2),问题规模已 ...

  7. 写爬虫爬了3w条职位数据,看看当前招聘形势 | 开源

    最近有不少程序员又开始找工作了,为了了解目前技术类各职位的数量.薪资.招聘公司.岗位职责及要求,我爬取了拉勾网北上广深4个城市的招聘数据,共3w条.职位包括:人工智能(AI).大数据.数据分析.后端( ...

  8. Ubuntu 18.04 将gcc版本降级为5.5版本

    Remark: Polynomial algebra 程序由于版本问题只能在gcc 5.0 版本运行, 而ubuntu更新会将gcc 更新到7.0版本,出现冲突(报错:如下) collect2: er ...

  9. mongodb_2

    一.游标 在mongodb中,底层使用js引擎进行各种操作,所以我们在命令行窗口,可直接执行js代码. #使用for循环,插入1000条数据. > for (var i=0;i<1000; ...

  10. 安装arcgis server时提示“应用程序无法启动,因为应用程序......或使用命令行sxstrace.exe”

    说一下这个原因:有几个条件不满足会产生这样的问题: 1.软件的发布是不需要安装的,直接在vs里编译好release版就发布了,而发布的时候如果缺少一些库文件,就会产生这样的问题.      一版都是目 ...