概念:在一个类的内部再定义一个完整的类
特点:编译之后可别分生成独立的字节码文件
内部类可直接访问外部类的私有成员,而不破坏封装
内部类:成员内部类、静态内部类、局部内部类、匿名内部类
成员内部类:创建对象 先创建外部类对象 再通过外部类对象.new.内部类类名() 创建内部类对象
外部类类名.this 引用外部类的当前对象
- public class TsetInner {
- public static void main(String[] args) {
- Outer o1= new Outer(11);
- Outer.MemberInner in1= o1.new MemberInner();
- in1.method();
-
- Outer o2= new Outer(22);
- //Outer.MemberInner in2= o2.new MemberInner();
- //in2.method();
- }
- }
- class Outer{
-
- private int a;
- public Outer(int a) {
- this.a=a;
- }
- public void m() {
- //局部变量
- int x= 20;
- //局部内部类
- class localInner{
-
- }
- }
- //成员内部类
- class MemberInner{
- private int a = 33;
- public void method() {
- int a= 44;
- System.out.println(a);//44
- System.out.println(this.a);//33
- System.out.println(Outer.this.a);//11
- }
- }
- //静态内部类
- static class StaticInner{
-
- }
- }
静态内部类:只能访问外部类的静态成员
局部内部类:作用范围 从定义开始 到代码块结束
局部内部类不能定义静态成员
局部内部类可以访问外部类的私有成员 还能访问外部类的局部变量 但是要加final
- public class TestTeacher {
- public static void main(String[] args) {
- Students stu = new Students();
- stu.study();
- }
- }
- class School{
- //静态的教师教课A和B
- public static Teacher getTeacher(int n) {
- class TeacherA implements Teacher{
- public void teach() {
- System.out.println("A");
- }
- }
- class TeacherB implements Teacher{
- public void teach() {
- System.out.println("B");
- }
- }
- //判断学习安排的老师进行讲课 学生访问不到 只有数值0或1
- if(n%2==0)return new TeacherA();
- else return new TeacherB();
-
- }
- }
- class Students{
- //学习方法 不能自己在去决定哪个老师来上课
- public void study() {
- Teacher t=School.getTeacher(0);
- t.teach();
- }
- }
- //接口 为了让教师方法都可以去随意调用访问
- interface Teacher{
- void teach();
- }