7.10
九、内部类详解
9.1 实例内部类
当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务(内部类就相当于公司的每一个部门,少了哪一个部门,就去定义那一个部门,而外部类就相当于整个公司)。在 Java 中, 可以将一个类定义在另一个类或者一个方法的内部, 前者称为内部类,后者称为外部类 。内部类也是封装的一种体现。
代码如下:
//外部类
class OutClass{
public int age = 3;
public static final String sex = "男";
//实例内部类
class InnerClass{
public static final String sex = "女";//必须加final才行
public int age = 6;//与外部类的变量名相同
public String name = "小明";
public void func(){
//与外部类的变量名相同如何访问呢
System.out.println(this.age);//打印6;这里的this表示当前对象InnerClass对象的引用
System.out.println(OutClass.this.age);//打印3
System.out.println(sex);//打印女
System.out.println(OutClass.sex);//打印男 访问外部类的静态的成员变量
}
public InnerClass(){
}
//不能定义静态的方法
}
}
public class Test {
public static void main(String[] args) {
OutClass outClass = new OutClass();//需要拿到外部类的对象才行
OutClass.InnerClass innerClass = outClass.new InnerClass();//产生了两个对象
//OutClass.InnerClass innerClass1 = new OutClass().new InnerClass();//合二为一
innerClass.func();
}
}
如何访问外部类与内部类同名的变量呢?访问的顺序是什么?
通过外部类名.this.变量名访问外部类的成员变量(访问同名的时候优先访问自己内部的,再去看外部类的)
如何实例化内部类的对象?通过 :
OutClass outClass = new OutClass();
OutClass.InnerClass innerClass = outClass.new InnerClass();
注意事项:
外部类中的任何成员都可以被在实例内部类方法中直接访问
实例内部类所处的位置与外部类成员位置相同,因此也受 public 、 private 等访问限定符的约束。
实例内部类对象必须在先有外部类对象前提下才能创建
实例内部类的非静态方法中包含了一个指向外部类对象的引用(OuterClass.this)
外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。
9.2 静态内部类
被static 修饰的内部成员类称为静态内部类。
在静态内部类中只能访问外部类中的静态成员
创建静态内部类对象时,不需要先创建外部类对象
与上面详解static结合。
类是最先被加载的
//外部类
class OutClass{
public int age = 3;
public static final String sex = "男";
//静态内部类
static class InnerStaticClass{
public static final String sex = "女";//必须加final才行
public int age = 6;//与外部类的变量名相同
public String name = "小明";
public OutClass outClass;
public InnerStaticClass(){
System.out.println("不带参数的");
}
public InnerStaticClass(OutClass outClass){
this.outClass = outClass;//set get
}
public static void func(){
System.out.println(sex);
//不能直接访问非静态的成员,需要一个对象来引用
OutClass outClass = new OutClass();
System.out.println(outClass.sex);
System.out.println(outClass.age);
}
}
}
public class Test1 {
public static void main(String[] args) {
//访问外部类的对象需要外部类的对象来引用才行
OutClass.InnerStaticClass innerStaticClass = new OutClass.InnerStaticClass(new OutClass());
//通过下面的代码来创建静态内部类的引用,因为静态不需要对象,所以不用先创建外部类的对象
//OutClass.InnerStaticClass innerStaticClass = new OutClass.InnerStaticClass();
innerStaticClass.func();
}
}
9.3 局部内部类
局部内部类有点鸡肋,用处不多,他是定义局部方法里面的,只能在所定义的方法内部使用。
代码如下:
public class Test2 {
public static void func(){
class LocalClass{ //不能被public、static等修饰符修
public LocalClass(){
System.out.println("构造方法");
}
}
LocalClass localClass = new LocalClass();//打印构造方法
}
public static void main(String[] args) {
func();
}
}
9.4 匿名内部类
下面简单说明,后面的接口会详细介绍:
代码如下:
class Student{
public String name;
public int age;
public void func(){
System.out.println("匿名对象");
}
}
public class Test3 {
public static void main(String[] args) {
new Student().func();//匿名对象,只能用一次,需要的时候还要匿名一次
new Student().func();
new Student(){//匿名内部类
public void test(){
System.out.println("匿名内部类");
}
}.test();
//Student student = new Student();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)