java中的内部类

定义:

如果一个事物的内部包含另一个事物,那么这就是一个类内部包含另一个类。

成员内部类

定义:

修饰符 class 外部类名称{

    修饰符 class 内部类名称{

    } 

}

注意:内用外,随意访问;外用内,需要内部对象;

使用:

1、间接方式:在外部类的方法当中,使用内部类;然后main方法只是调用外部类的方法

2、直接方式:外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();

如果出现重名现象,可以用:外部类名称.this.外部类成员变量名

局部内部类(包含匿名内部类)

局部内部类

如果一个类定义在一个方法内部,那么这就是一个局部内部类

格式:

局部内部类

使用:只有当前所属的方法才能使用,出了这个方法就不能用,通过调用外部类的方法调用内部类

定义一个类的权限修饰符:

1、外部类:public / (default)

2、成员内部类:public / protected / (default) / private

3、局部内部类:什么都不能写

局部内部类如果希望访问所在方法的局部变量,那么这个局部变量必须是【有效final的】

从java8开始,只要局部变量事实不变,那么final关键字可以省略

原因:

1、new出来的对象在堆内存

2、局部变量跟着方法走,在栈内存

3、方法运行结束,立刻出栈,局部变量就会立刻消失

4、但是new出来的对象会在堆内存中继续存在,直接垃圾回收消失 所以就拷贝一份过来,让他不变

匿名内部类

如果接口的实现类(或父类的子类)只需要使用唯一的一次,这时可省略该类的定义,改为使用【匿名内部类】

格式:

接口名称 对象名 = new 接口名称() {

    //覆盖重写所有抽象方法

};

解析:

1、new代表创建对象的动作

2、接口名称就是匿名内部类需要实现哪个接口

3、{....} 才是匿名内部类的内容,覆盖重写所有接口中的抽象方法

注意:

1、匿名内部类,在创建对象的时候,只能使用一次,如果希望多次创建对象,而且内容一样的话,就必须单独定义实现类

2、匿名对象,在调用方法的时候,只能调用唯一一次,如果希望同一个对象,调用多次方法,那么必须给对象起个名字

3、匿名内部类是省略了【实现类/子类名称】,但是匿名对象是省略了【对象名称】

变量

1、类作为成员变量 实例:String

2、接口作为成员变量,为接口赋值的时候,要使用接口的实现类(包括匿名内部类)

3、接口作为方法的参数和返回值

你可能感兴趣的:(java中的内部类)