网站首页 > 精选教程 正文
什么是内部类
1. 概念
在Java中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。
Inner class一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。
Inner class的名字不能与包含它的类名相同;
Inner class可以使用外部类的私有数据,因为它是外部类的成员,同一个类的成员之间可相互访问。而外部类要访问内部类中的成员需要:内部类.成员或者内部类对象.成员。
分类:成员内部类(static成员内部类嵌套类和成员内部类)
局部内部类(不含修饰符)、匿名内部类
成员内部类
1. 普通内部类
class A {
private int s;
public class B {
public void mb() {
s = 100; // 在普通内部类的方法中, 可以直接外部类的私有成员.
System.out.println("在内部类B中s=" + s);
}
}
public void ma() {
B i = new B();
i.mb();
}
}
public class Test {
public static void main(String args[]){
A o = new A();
o.ma(); // 调用外部类的方法, 间接创建了内部类对象并调用了内部类对象的方法
}
}
public class A {
private int s = 111;
public class B {
private int s = 222;
public void mb(int s) {
System.out.println(s); // 访问最近的形参值:333
System.out.println(this.s); // 访问本类当前对象的属性:222
System.out.println(A.this.s); // 访问外部类的当前对象的属性:111
}
}
}
public class Test {
public static void main(String args[]){
A a = new A();
A.B b = a.new B(); // 在测试类中创建普通内部类的对象需要使用外部类对象
b.mb(333);
}
}
2. 嵌套类
被static修饰的成员内部类就称为嵌套类.
class A {
private int s;
public static class B {
public void mb() {
//s = 100; // 在嵌套类的方法中, 不可以直接外部类的非静态成员.
//System.out.println("在内部类B中s=" + s);
}
}
public void ma() {
B i = new B();
i.mb();
}
}
public class Test {
public static void main(String args[]){
A.B b = new A.B(); // 创建嵌套类对象, 不需要外部类的对象
}
}
局部内部类
1. 概念
在方法体中声明的内部类就是局部内部类, 局部内部类的范围和局部变量类似.
2. 普通局部内部类
在方法中声明的内部类, 有类名, 使用和普通类类似.
public class Test {
public static void main(String args[]){
class A {
public void test();
};
A a = new A();
a.test();
}
}
3. 匿名内部类
在方法中声明的内部类, 但是没有class关键字和具体类名, 称为匿名内部类, 因为没有类名, 所以必须在声明内部类的同时创建对象, 否则无法创建对象了.
所以匿名内部类的语法是 :
父类 引用 = new 父类(实参列表) {类体};
匿名内部类最常用用法是new 后面的类名是已经存在的类, 或抽象类, 或接口. 如果是抽象类或接口, 则匿名内部类类体中必须实现全部的抽象方法, 由此可见, 匿名内部类只能作为new后面的类或抽象或接口的子类存在, 但是没有类名, 所以通常在声明的时候就创建对象.
public interface A {
public void a();
}
public class Test {
public static void main(String args[]){
new A() {
@Override
public void a() {
System.out.println(“匿名内部类实现接口方法”);
}
}.a(); // 打印输出内容…
}
}
更多精彩内容:
- 上一篇: Java局部内部类
- 下一篇: 68、下面的内部类在哪里new不会编译出错
猜你喜欢
- 2024-11-24 永远不要使用双花括号初始化实例,除非你想OOM
- 2024-11-24 java中的匿名内部类总结
- 2024-11-24 Java Nested Classes(内部类~英文技术文档翻译)
- 2024-11-24 带你深入学习java内部类_匿名类,细到不能再细
- 2024-11-24 为何要在Java中使用静态类?
- 2024-11-24 68、下面的内部类在哪里new不会编译出错
- 2024-11-24 Java局部内部类
- 2024-11-24 Java 内部类和异常类(详细版)
- 2024-11-24 IntelliJ IDEA 2022.2.1 beta 发布,新增支持 Java 18
- 2024-11-24 Java静态
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)