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. 基于Docker搭建Nginx图片服务器

    前言 一般开发中,都会把图片上传到一个目录,然后将目录和文件名拼接存储在数据库中,但是,这种方法如果没弄好的话可能有一定的缺陷. 若项目搬迁,即时这台服务器本身还在用,存放在服务器的跟项目相关的图片也 ...

  2. webpack打包es6代码

    1.简单描述一下es6的模块导入和导出的语法: //导出:export var aa = 10;export function demo(){} //不能写成:var aa = 10;export a ...

  3. 阿里云服务器Ubuntu系统搭建LNMP环境

    目录 一.Nginx 安装 二.MySQL安装 三.PHP安装 四.配置Nginx 五.环境测试 六.服务器常用路径 一.Nginx 安装 更新软件源 sudo apt-get update 安装 N ...

  4. Building Applications with Force.com and VisualForce(六):Designing Applications for Multiple users: Accommodating Multiple Users in your App

    Dev 401-006 Designing Applications for Multiple users: Accommodating Multiple Users in your App. Cou ...

  5. Mayor's posters POJ - 2528 线段树(离散化处理大数?)

    题意:输入t组数据,输入n代表有n块广告牌,按照顺序贴上去,输入左边和右边到达的地方,问贴完以后还有多少块广告牌可以看到(因为有的被完全覆盖了). 思路:很明显就是线段树更改区间,不过这个区间的跨度有 ...

  6. 开发一个健壮的npm包

    项目地址:loan-calculate-utils npm包的发布.更新查看上一篇文章 开发一个基础的npm包 目前我们的目录是这个样子: . ├── source 源代码目录 │   └── ind ...

  7. Selenium系列(十二) - 自动化必备知识之CSS选择器的详细使用

    如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...

  8. redis++:Redis持久化 rdb & aof 工作原理及流程图 (三)

    RDB的原理: 在Redis中RDB持久化的触发分为两种:自己手动触发与Redis定时触发. 针对RDB方式的持久化,手动触发可以使用: 1):save:会阻塞当前Redis服务器,直到持久化完成,线 ...

  9. pycharm工程包导入问题

    当我们将外部的python项目导入pycharm工程中时,会出现同一个包的python文件无法在另一个文件引用的问题: 解决方法如下: 在此设置中,将需要导入的文件或包变为蓝色 步骤:1.点击需要导入 ...

  10. CentOS7通过wget下载文件到指定目录

    查看自己的CentOS7系统有没有安装wget: [duanyongchun@192 3DUnetCNN]$ rpm -qa|grep wget 已安装提示: #已安装提示:wget-1.14-18. ...