【Java】InnerClass 内部类
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 内部类的更多相关文章
- Java基础-内部类-为什么成员内部类可以无条件访问外部类
在此之前,我们已经讨论过了成员内部类可以无条件访问外部类的成员,那具体究竟是如何实现的呢?下面通过反编译字节码文件看看究竟.事实上,编译器在进行编译的时候,会将成员内部类单独编译成一个字节码文件,下面 ...
- Java:内部类(静态内部类、成员内部类、局部内部类、匿名内部类)
Java基础_内部类:在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类. 内部类的主要作用:使用内部类可以减少命名冲突. 定义位置:一个内部类可以定义在一个类中,也可以 ...
- JAVA基础——内部类详解
JAVA内部类详解 在我的另一篇java三大特性的封装中讲到java内部类的简单概要,这里将详细深入了解java内部类的使用和应用. 我们知道内部类可分为以下几种: 成员内部类 静态内部类 方法内部类 ...
- 【Java】 内部类
[Java]内部类 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 使用内部类的的原因主要有三点: 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据. 内部类可以对同一个包中的 ...
- java中内部类的积累
放在一个类的内部的类我们就叫内部类. 二. 作用 1.内部类可以很好的实现隐藏 一般的非内部类,是不允许有 private 与protected权限的,但内部类可以 2.内部类拥有外围类的所有元素的访 ...
- java中内部类的讲解
java中有一个内部类的概念,由于之前一直比较忙,没有单独拿出时间总结一下,今天我就把内部类的相关知识进行一下汇总,如果有不足之处,欢迎批评指正. 1)java内部类的概念. 在一个类的的 ...
- Java学习--内部类(一)
Java学习--内部类(一) 一. 内部类的定义和特点 class Outer{ privite int num = 5; class Inner{ public void Display(){ Sy ...
- Java的内部类
Java的内部类 首先我们来了解一下什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类可以是静态static的,也可用public,default,protected和private修饰 ...
- java使用内部类的好处及其初始化
java使用内部类的原因 每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响 java内部类初始化 ForeCatal ...
- JAVA面向对象-----内部类的概述
JAVA面向对象-–内部类的概述s 将类定义在另一个类的内部则成为内部类.其实就是类定义的位置发生了变化. 在一个类中,定义在类中的叫成员变量,定义在函数中的叫成员函数,那么根据类定义的位置也可以分为 ...
随机推荐
- C# 通过反射访问类库DLL的路径打开窗体功能
//通过访问目录下的DLL Assembly ass = Assembly.LoadFile(Application.StartupPath + "\\Design.dll"); ...
- 欢乐水杯(happy glass)中流体的一种实现!图文视频讲解 ! Cocos Creator!
使用cocos creator v2.2.2 实现流体效果 ! 图文+视频讲解! 效果预览 实现原理 整体思路是参考论坛中的一个帖子 这款游戏中水的粘连效果在Construct3中利用图层很容易实现, ...
- vue 指令,成员,组件
目录 复习 v-once指令 v-cloak指令(了解) 条件指令 v-pre指令(了解) 循环指令 todolist留言板案例 实例成员 - 插值表达式符号(了解) 计算属性 属性监听 组件 局部组 ...
- leetcode 876. 链表的中间结点 签到
题目: 给定一个带有头结点 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点. 示例 1: 输入:[1,2,3,4,5] 输出:此列表中的结点 3 (序列化形式: ...
- leetcode 945. 使数组唯一的最小增量
题目 给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1. 返回使 A 中的每个值都是唯一的最少操作次数. 示例 1: 输入:[1,2,2] 输出:1 解释:经过一次 mov ...
- Numpy和OpenCV中的图像几何变换
介绍 上面的图像使它不言而喻什么是几何变换.它是一种应用广泛的图像处理技术.例如,在计算机图形学中有一个简单的用例,用于在较小或较大的屏幕上显示图形内容时简单地重新缩放图形内容. 它也可以应用于扭曲一 ...
- Colab笔记本能用英伟达Tesla T4了,谷歌的羊毛薅到酸爽
谷歌出品的Colab笔记本,机器学习界薅羊毛神器,如今又有了新福利: 连英伟达最新一代机器学习GPU:Tesla T4都能免费蹭,穷苦羊毛党也顿时高端了起来. 英伟达的Tesla T4,是去年秋天才发 ...
- SpringBoot系列之缓存使用教程
介绍SpringBoot项目中使用缓存,之前先介绍一下Spring的缓存抽象和JSR107,本博客是我在学习尚硅谷视频和参考其它博客之后做的笔记,仅供学习参考 @ 目录 一.Spring的缓存抽象 1 ...
- python框架-Django创建项目
创建项目 django-admin startproject douban//创建project cd douban python manage.py startapp books//创建app项目 ...
- centos7中提升用户权限
提升用户权限我看网上资源有两种方法,一种是修改/etc/sudoers/文件将新增的用户权限提升为和root一样的权限,这种方法不知道怎么回事我没用应用成功,这里我介绍第二种方法,第二种方法是更改/e ...