CoreJava学习第九课-4种内部类和JVM内存组成 发布时间:2023/10/11 一:4种内部类 内部类是编译时语法,编译后,会生成两个独立的类 内部类可以访问外部类的私有成员复制代码 1.成员内部类 可以访问外部类的私有成员 创建方式:先创建外部类对象,再通过外部类对象创建内部类对象 特别注意:由于成员内部类必须与外部类某一个对象相关联,因此成员内部类中不能定义静态方法 复制代码 public class TestInnerClass { public static void main(String[] args) { //创建MemberInner类的对象 Outer out = new Outer(); Outer.MemberInner in1 = out.new MemberInner(); in1.print(); } } class Outer{ private int a = 10; private static int b = 20; public class MemberInner{ public void print(){ System.out.println(a); System.out.println(b); } ? ? ? ?//public static void print2(){} 成员内部类中不能定义静态方法 } }复制代码 2.静态内部类 只能访问外部类的静态成员 创建方式:直接创建内部类对象 复制代码 public class TestInnerClass { ? public static void main(String[] args) { // 创建StaticInner对象 Outer.StaticInner in2 = new Outer.StaticInner(); in2.print(); } } class Outer{ private int a = 10; private static int b = 20; public static class StaticInner{ public void print(){ ? ? ? ? ? ? System.out.println(b);//error 只能访问外部类的静态成员 ? ? System.out.println(b); } } }复制代码 3.局部内部类 定义在外部类方法中 ?作用范围: 从定义开始,到所在的代码块结束 ?局部内部类不仅可以访问外部类的成员,还能访问外部类的局部变量,但是必须加上final (局部常量) 复制代码 public class TestInnerClass { public static void main(String[] args) { Outer out = new Outer(); out.method(30); } } class Outer{ private int a = 10; private static int b = 20; public void method(final int m){ final int n = 40; class LocalInner{ public void print(){ System.out.println(a);//10 System.out.println(b);//20 System.out.println(m);//30 System.out.println(n);//40 } } LocalInner in = new LocalInner(); in.print(); } }复制代码 4.匿名内部类 特殊的局部内部类,当局部内部类满足下面两个条件时,即是匿名内部类: ?1) 实现一个接口或是继承一个类 ?2) 只会创建这个类的一个对象 ·匿名内部类无法定义构造方法 , 只有默认无参构造方法 复制代码 二.JVM的内存组成(*) 1.堆空间 ? ? ?存对象 2.栈空间 ? ? ?存局部变量 3.方法空间 ? ?存静态属性复制代码 局部内部类访问外部类的局部变量时,局部变量为什么加 final ? 有两种理解: 1.java的JVM中的常量有单独的存储空间,如果加上final,就会把m,n存到变量的地方 2.见下图:复制代码