Java内部类
内部类
1.什么是内部类
如果一个类定义在另外一个类的内部,那么这个类就会被称为内部类。一个内部类和普通类一样,可以有自己的实例变量,构造方法,实例方法等等,只是被嵌套在了其他类里面而已。举个栗子,我们设计了一个A类只想让B类使用,如果设计成外部类,其他类就可以随意使用了,这个时候就可以把A类设计成B类的内部类。如下:
2.内部类分类
内部类有实例内部类 和静态内部类 两类。内部类有static关键字修饰就称为静态内部类。
3.实例内部类
设计一个实例内部类如下:
public class OutClass {
private int a;
class InnerClass {
private int b;
void fun() {
a = 10;
b = 20;
}
}
}
在实例内部类中定义一个函数fun,毫无疑问,函数中可以访问变量b,因为b是自己的实例变量,有当前类隐含的this,当然可以随便访问。同时也观察到,在该函数中也可以访问外部类的变量a,那么也是因为有当前类隐含的this吗?我们先把this关键字加上试试。
发现出现无法解析符号“a”的错误。这是因为当实例内部类访问外部类成员时提供的是外部类对象的this。
4.静态内部类
设计一个静态内部类如下:
public class OutClass {
private int a;
static class InnerClass {
private int b;
void fun() {
this.b = 20;
}
}
}
InnerClass被设计成了OutClass的一个静态内部类,在fun函数中可以访问自己的成员变量b,因为会提供默认的this。那么还可以像实例内部类一样可以访问外部类的成员吗?显然是不可以的,因为静态内部类只可以提供当前类的this,不可以提供外部类的this了。
因此,当我们设计内部类的时候,如果想内部类可以随意访问外部类成员的时候,就把内部类定义为实例内部类;如果不想内部类可以随意访问外部类成员的时候,就把内部类定义为静态内部类。
5.生成内部类对象
5.1生成实例内部类对象
OutClass类:
public class OutClass {
private int a;
class InnerClass {
private int b;
void fun() {
OutClass.this.a = 10;
this.b = 20;
}
}
}
TestDemo类:
public class TestDemo {
public static void main(String[] args) {
OutClass outClass = new OutClass();//生成外部类对象
OutClass.InnerClass innerClass = outClass.new InnerClass();
}
}
实例内部类对象的生成,需要先生成外部类对象,然后借助外部类对象再去new对象。还需要指定生成哪一个内部类的引用变量去接受它,为什么需要指定是哪一个内部类的呢?因为它有可能是张三家的,也有可能是李四家的,在这里是OutClass类家的。
5.2生成静态内部类对象
OutClass类:
public class OutClass {
private int a;
static class InnerClass {
private int b;
void fun() {
this.b = 20;
}
}
}
TestDemo类:
public class TestDemo {
public static void main(String[] args) {
OutClass.InnerClass innerClass = new OutClass.InnerClass();
}
}
静态内部类对象的生成,不需要借助外部类的对象,但需要指明是哪一个外部类的,用外部类.调用静态内部类的构造方法,同时也需要指定生成哪一个内部类的引用变量去接受它。
相关文章
- JAVA内部线程1
- [Java基础] java的守护线程与非守护线程
- java中,剩下的这两个内部类不太好理解!
- JAVA学习(三):Java基础语法(变量、常量、数据类型、运算符与数据类型转换)
- Java实现 LeetCode 491递增子序列
- Java实现 蓝桥杯VIP 算法提高 产生数
- java 11 标准Java异步HTTP客户端
- Java虚拟机内部体系结构(摘记,待完善):)
- [Linux] Install java and add JAVA_HOME, PATH
- Java基础--内部类及匿名内部类
- 反转单链表(Java实现)滴滴面试题
- Atitit 搜索蓝牙设备 powershell的实现 java noede.js python 先用脚本语言python nodejs,不好实现。。Java 也不好实现。。 Netcore可以,
- 华为OD机试 - 日志限流(Java & JS & Python)
- How to improve Java's I/O performance( 提升 java i/o 性能)
- java无依赖读取Excel文件
- JAVA运行java程序
- JAVA获取随机数
- mysql-connector-java与Mysql、Java的对应版本
- 基于JAVA实现的WEB端UI自动化 - WebDriver框架篇 - 内部框架及UI自动化测试框架思维导图