今天温习一下 Java 中的内部类,内部类一般有如下几种:静态内部类、成员内部类、匿名内部类和方法内部类,下文中将主要介绍静态内部类和成员内部类,主要内容如下:
- 概述
- 静态内部类
- 成员内部类
- 匿名内部类和方法内部类
- 总结
概述
顾名思义内部类就是在一个类内部定义的类,它是内部类是一个独立的类,编译之后会生成独立的 .class 文件,其名称前面会有外部类的类名称以及 $ 符号,内部类同样可以使用 private 、default、protected、public 修饰,下面是内部类的写法,具体参考如下:
public class OutterClass {
private static class StaticInnerClass{
}
private class FieldInnerClass{
}
Runnable runnable = new Runnable() {
@Override
public void run() {
}
};
private void method() {
class InnerClass{
}
}
}
静态内部类
- 静态内部类可以有静态成员和非静态成员;
- 静态内部类可以直接调用外部类的静态成员和静态方法,但不能调用外部类的非静态成员和非静态方法;
- 在不相关类中,可以直接创建静态内部类的对象;
- 静态内部类与其外部类联系很少,其创建基本不依赖与外部类。
public class StaticInnerClassDemo {
public static void main(String[] args) {
OutterClass1.InnerClass innerClassB = new OutterClass1.InnerClass();
InnerClass innerClassA = new InnerClass();
innerClassA.testStaticInnerClass();
}
}
class OutterClass1{
int ageA = 18;
public void methodA() {
}
static int ageB = 18;
public static void methodB() {
}
private void methodC() {
InnerClass innerClass = new InnerClass();
innerClass.testStaticInnerClass();
}
static class InnerClass{
public void testStaticInnerClass(){
System.out.println(ageB);
methodB();
}
}
}
成员内部类
- 成员内部类可以访问所有外部类的成员;
- 成员内部类对象的创建必须依赖于外部类对象,先有外部类才会有内部类;
- 成员内部类就是外部类的一个成员变量;
- 成员内部类不能有静态成员,但允许常量存在。
public class FieldInnerClassDemo {
public static void main(String[] args) {
OutterClass2 outterClass2 = new OutterClass2();
OutterClass2.InnerClass innerClass = outterClass2.new InnerClass();
innerClass.testFieldInnerClassMethod();
}
}
class OutterClass2{
int ageA = 18;
public void methodA() {
}
static int ageB = 18;
public static void methodB() {
}
private void methodC() {
InnerClass innerClass = new InnerClass();
innerClass.testFieldInnerClassMethod();
}
class InnerClass{
static final int b = 10;
public void testFieldInnerClassMethod(){
System.out.println(ageA);
methodA();
System.out.println(ageB);
methodB();
}
}
}
匿名内部类和方法内部类
匿名内部类当然是没有确定的名称,其实现都是在类体中具体实现,最终返回相关类的一个匿名对象,由于最终返回的是一个匿名的实例,所以必须在匿名内部类之后添加分号。方法内部类就是局部内部类,一般定义在类的局部位置,它可以访问当前代码块及外部类的所有变量。
总结
类之间的成员变量的互相调用实际上还是访问对象的成员变量,如成员内部类能够访问外部类的成员变量或方法是因为内部类持有外部类的引用,一般通过 OutterClass.this 获取外部类的对象,如果外部类想要访问内部类的成员变量或方法当然也需要持有内部类的引用,所以外部类访问内部类的成员变量或方法时,必须先创建内部类的对象,然后通过对象来方位相应的成员变量或方法。
可以选择关注微信公众号:jzman-blog 获取最新更新,一起交流学习!
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|