概念:在一个类的内部再定义一个完整的类。
1.特点:
编译之后可分别生成独立的字节码文件
内部类可以直接访问外部类的私有成员,而不破坏封装。
2.内部类在java中的类型:
成员内部类,静态内部类,局部内部类,匿名内部类。
3.成员内部类:(在类的内部定义和成员变量、成员方法同级别的类,
package day13; public class TestStaticClass { public static void main(String[] args) { // Outer2.StaticInner in3 =new Outer2.StaticInner(); // in3.method(); } } class Outer2 { private int a = 10;// 成员属性 private static int b = 20; public Outer2(int a) { this.a = a; } public void m() { final int x = 20; class LocalInner { private int o = 30; // private static int p = 40;error! public void method() { System.out.println(o);// 30 // System.out.println(p); System.out.println(a);// 0 System.out.println(b);// 20 System.out.println(x);// 50 } }// 内部类的定义不算是该Outer2类的代码,因为他在编译时,单独形成一个.class文件 LocalInner in = new LocalInner(); in.method(); } static class StaticInner { private int x = 10; public void method() { System.out.println(x); // System.out.println(a); System.out.println(b); } } }
即是成员内部类)
创建对象:先创建外部类对象,再通过外部类对象.new内部类类名() 创建内部类对象
成员内部类依托于外部类而存在的。如Outer1.MemberInner in1=o1.new MemberInner();
内部类可以直接访问外部类的私有属性,从而不破坏类的封装性。
内部类访问私有属性例子:
package day13; public class demo { public static void main(String[] args) { Outer1 o1 = new Outer1(10); Outer1.MemberInner in1 = o1.new MemberInner(); in1.method();//30 Outer1 o2 = new Outer1(20); Outer1.MemberInner in2 = o2.new MemberInner(); in2.method();//30 } } class Outer1 { private int a; public Outer1(int a) { this.a = a; } public void m() { } class MemberInner { private int a=30; public void method() { int a=40; System.out.println(a);//40 System.out.println(this.a);//30 System.out.println(Outer1.this.a);//10 20 } } }
4.静态内部类
静态内部类只能访问外部类的静态成员。它不依赖与外部类(更独立),用的时候比较方便。
代码例子:
package day13; public class TestStaticClass { public static void main(String[] args) { Outer2.StaticInner in3 =new Outer2.StaticInner(); in3.method(); } } class Outer2 { private int a = 10;// 成员属性 private static int b=20; public Outer2(int a) { this.a = a; } public void m() { int x = 20; } static class StaticInner{ private int x=10; public void method() { System.out.println(x); // System.out.println(a); System.out.println(b); } } }
5.局部内部类:定义在方法的内部(出了生命期就无法使用)
局部变量:在方法范围之内定义的变量。
局部类:在方法里定义的类。在方法里定义后才能使用,出了该方法就无法使用。
作用范围:从定义开始。到代码块结束。
局部内部类不能定义静态成员
局部内部类可以访问外部类的私有成员,还能访问外部类的局部变量,但是要加上final
代码例子
package day13; public class TestTeacher { public static void main(String[] args) { Student1 t = new Student1(); t.study(); } } class School { public static Teacher getTeacher(int n) { class TeacherA implements Teacher { public void teach() { System.out.println("TeacherA 讲课"); } } class TeacherB implements Teacher { public void teach() { System.out.println("TeacherB 讲课"); } } if (n % 2 == 0) return new TeacherA(); else return new TeacherB(); } } class Student1 { public void study() { // TeacherA t = new TeacherA(); // Teacher t =School.getTeacher(); // t.teach(); // Teacher t =new TeacherA(); Teacher t = School.getTeacher(1); // Teacher t =new TeacherA(); t.teach(); } } interface Teacher { void teach(); }
6.局部内部类访问外部类局部变量
package day13; public class TestLocalInnerClass { public static void main(String[] args) { } } class A{ public void method() { final int x=10; class B{ public void print() { System.out.println(x); } } } }
虚拟机内存:
堆空间(存的是对象)
栈空间(存放的是局部变量)
方法区:常量池,全局性的属性(如静态属性,全类公有)...