java中内部类的用法

 思维导图:

内部类概述 

内部类是定义在另一个类中的类,内部类也是封装的一种的体现。                                                  


格式:

public class OutClass {
    class InnerClass {
       //OutClass是外部类    InnerClass是内部类
    }

}            

注意事项:


1. 定义在class类名花括号外的,即使是在一个文件里,都不能称为内部类,例如:

public class OutClass {
    
}
class InnerClass {      //不是内部类,它在花括号外
    

2. 内部类和外部类共用一个java源文件,但是经过编译之后,内部类会单独形成字节码文件 
先看一下内部类都可以在一个类的哪些位置可以定义:

public class OutClass {
    public class InnerClass1{     //未被static修饰,实例内部类
    }
 
    static class InnerClass2{     //被static修饰,静态内部类
    }
 
    public void method(){
        class InnerClass3{      //在方法中定义,局部内部类
        }
    }
 
    {
        class InnerClass4{      //实例代码块中,局部内部类
        }
    }
 
    static {
        class InnerClass5{        //静态代码块中,局部内部类
        }
    }
}

 实例内部类(成员内部类)

未被static修饰的内部类称为实例内部类。 请看如下的代码和注释 :

public class OutClass {
    private int a;
    static int b;
    int c;
 
    public void method1() {
        a = 1;
        System.out.println(a);
    }
    public static void method2(){
        b = 2;
        System.out.println(b);
    }
    
    public class InnerClass1 {
        int c;
        public void innerMethod(){
            a = 10;
            b = 20;
            method1();       //内部类中可以直接访问外部类任何访问限定符修饰的成员
            method2();
            c = 30;           //访问的是内部类自己的成员c
            innerMethod();
            
            OutClass.this.c = 300;    //通过访问 外部类.this.同名成员名字 来访问外部类中与内部类同名的成员
            System.out.println(OutClass.this.c);
        }
    }
 
    public static void main(String[] args) {
        //普通内部类的成员创建以及访问
        OutClass oc = new OutClass();
        System.out.println(oc.a);
        System.out.println(oc.b);
        System.out.println(oc.c);
        oc.method1();
        oc.method2();
        //要访问普通内部类中的成员,必须先构造普通内部类对象
        //构造普通内部类对象方法:
        OutClass.InnerClass1 ic = new OutClass().new InnerClass1();
        //也就是说想构造内部类对象必须借助外部类
        System.out.println(ic.c);
        ic.innerMethod();
    }
}

 注意事项:

1. 外部类的任何成员都可以被在普通内部类方法中直接访问

2. 普通内部类所处的成员与外部类成员位置相同,因此受public private 等访问限定符约束

3. 在内部类方法中访问同名的成员时,优先访问自己的,如果访问外部类同名的成员必须以:外部类名称.this.成员变量 来访问

4. 普通内部类对象必须在先有外部类前体下才能创建

5. 普通内部类的非静态方法中包含了一个指向外部类对象的引用

6. 外部类中,不能直接访问内部类中的成员,如果要访问必须先创建外部类对象

 静态内部类

 被static修饰的内部类称为静态内部类。请看如下代码和注释:

public class OutClass {
    private int a;
    static int b;
    int c;
    public void method1(){
        a = 1;
        System.out.println(a);
    }
    public static void method2(){
        b = 2;
        System.out.println(b);
    }
    static class InnerClass{
        public void methodInner(){
            //  a = 10;    编译器会报错,因为静态内部类中只能访问外部类的静态成员
            b = 20;    //这一编译器不会报错,因为b是静态成员
           // method1();   编译器报错,因为method1不是静态成员方法
            method2();    //这里编译器正常通过
        }
    }
 
    public static void main(String[] args) {
        //静态内部类对象创建及成员访问
        OutClass.InnerClass ic = new OutClass.InnerClass();
        ic.methodInner();
    }
}

注意事项:

1.在内部类中只能访问外部类中的静态成员。

2.在创建内部类对象时不需要创建外部类成员。

3.成员内部类经过编译之后会产生独立的字节码文件,命名格式为:外部类名称$内部类名称

局部内部类 


定义在外部类的方法体或者{}中,该种内部类只能在其定义的位置使用,一般用的较少。

看以下代码:

public class OutClass {
    int a = 10;
    public void method(){
        int b = 20;
        class InnerClass{      //不能被public static等访问修饰符修饰
            public void methodInner(){
                System.out.println(a);
                System.out.println(b);
            }
        }
        InnerClass ic = new InnerClass(); //只能在该方法体内部使用,其他位置都不能用
        ic.methodInner();
    }
 
    public static void main(String[] args) {
      //  InnerClass ic = new InnerClass();    在这里变异错误
    }
}

 注意事项:
1.局部内部类只能在定义本方法体中内部使用
2.不能被public,static修饰。
3.编译器也有自己独立的字节码文件,命名格式:外部类名字$x内部类名字.class,x是一个整数

匿名内部类

没有名字的内部类就叫匿名内部类

例如:Student student = new Student();//student就是类的名字

           new Animal();//这个类没有名字


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值