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. Nginx | CentOS 8 安装Nginx详细教程

    Nginx是一个web服务器也可以用来做负载均衡及反向代理使用, 目前使用最多的就是负载均衡,这篇文章主要介绍了centos8 安装 nginx Nginx是一种开源的高性能HTTP和反向代理服务器, ...

  2. Cesium 源码笔记[1] Viewer模块实例化的大致过程

    我原本想写日记的,但是不太现实. 源码下载 源码可以从源码包和发行包中的Source目录中获取. Cesium的模块化机制从1.63版本开始,由原来的RequireJs变为ES6.但有可能是原先设计耦 ...

  3. [离散化+树状数组]CodeForces - 652D Nested Segments

    Nested Segments time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  4. 刷oj之类的题时java Scanner读取太慢解决之道

    1.转载自一个 https://www.cpe.ku.ac.th/~jim/java-io.html 2.工具代码 class Reader { static BufferedReader reade ...

  5. 搭建SQL server AwaysOn集群

    1.环境 系统:windows server 2012 R2 数据库版本:SQL server 2012 三台服务器,IP分别是:10.10.10.111,10.10.10.112,10.10.10. ...

  6. POJ旅行商问题——解题报告

    旅行商问题 总时间限制: 1000ms 内存限制: 65536kB 描述 某国家有n(1<=n<=10)座城市,给定任意两座城市间距离(不超过1000的非负整数).一个旅行商人希望访问每座 ...

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

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

  8. MySQL count知多少

    统计一个表的数据量是经常遇到的需求,但是不同的表设计及不同的写法,统计性能差别会有较大的差异,下面就简单通过实验进行测试(大家测试的时候注意缓存的情况,否则影响测试结果). 1. 准备工作 为了后续测 ...

  9. [noip模拟]种花<快速幂+结论>

    描述: OI太可怕了,我决定回家种田.我在后院里开辟了一块圆形的花圃,准备种花.种花是一种艺术,通过一定技术手法,花材的排列组合会让花变得更加的赏心悦目,这就是花艺.当然你知道,我在种田之前是OIer ...

  10. vulnhub~incllusiveness

    这个机子相对简单一点,但是也是从中发现了自己不少问题 技能一:  nmap 扫描发现了21,22 ,80三个端口,并且ftp服务允许匿名登录,在pub目录下面有writeable权限,这就好办了.我以 ...