Java 内部类的详解

来源:互联网 发布:优酷网络电视客户端 编辑:程序博客网 时间:2024/06/06 00:35

1.内部类的概述

将类定义在另一个类的内部则成为内部类。其实就是类定义的位置发生了变化。

看下面代码:

class Outer{int num=10;class Inner{//属性int age=20;//内部类定义函数public void print(){System.out.println("内部类");}}public void show(){System.out.println("外部类");}}

在一个类中,定义在类中的叫成员变量,定义在函数中的叫成员函数,那么根据类定义的位置也可以分为成员内部类局部内部类

备注:内部类生产的class文件为 “外部类$内部类”,为了标明该内部类是属于具体哪个外部类的。

2.成员内部类访问的方式

(1) 内部类可以直接访问外部类的成员属性。(孙悟空相当于内部类飞到牛魔王的肚子里面去)

(2) 外部类需要访问内部类的成员属性时需要创建内部类的对象。

在外部类的成员函数中创建内部类的对象,通过内部类对象直接访问内部类的成员。

在其他类中直接创建内部类的对象。

Outer.Inner inner = new Outer().new Inner();

class Outer{int num=10;class Inner{//内部类定义函数public void print(){//内部类可以直接访问外部类System.out.println(num);}}public void show(){System.out.println("外部类");}}

外部类访问内部类的属性


所以外部类需要访问内部类的属性时,需要创建内部类的对象访问。





A类和B类,当A类想要直接访问B类中的成员,而B类又需要建立A类的对象来A类中的成员。这时,就将A类定义成B类的内部类。比喻:孙悟空和铁扇公主。孙悟空到了公主肚子中,就成了内部类(其实是持有外部类的对象引用)。

疑问: 什么时候使用内部类呢?

当我们分析事物时,发现事物的内部还有具体的事物,这时则应该定义内部类了。

比如人体是一个类,人体有心脏,心脏的功能在直接访问人体的其他内容。这时就将心脏定义在人体类中,作为内部类存在。

内部类的优势:成员内部类作为外部类的成员,那么可以访问外部类的任意成员。


3.成员内部类访问细节



私有的成员内部类不能在其他类中直接创建内部类对象来访问。

如果内部类中包含有静态成员,那么java规定内部类必须声明为静态的访问静态内部类的形式:Outer.Inner in = new Outer.Inner(); 

4.成员内部类(成员属性,成员方法)特点

(1)私有的成员内部类

     特点:不能在其他类中直接创建内部类对象来访问

(2)静态的成员内部类

     特点:如果内部类中包含有静态成员,那么java规定内部类必须声明为静态的

 访问静态内部类的形式:

 Outer.Inner in = new Outer.Inner();


疑问: 目前打印的num20,如果想打印10的话,应该怎么做?

解答:这时候其实在show方法中已经存在了两个this对象,一个是外部类对象,一个是内部类对象,所以要在this前面加上类名标明对应的this

5.局部内部类

局部内部类概述:包含在外部类的函数中的内部类称之为局部内部类。

访问:可以在包含局部内部类的方法中直接创建局部内部类的对象调用局部内部类的成员。

注意:局部内部类只能访问所在函数的fanal属性。

必须被final修饰?为什么呢?

 因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有立马从堆内存中消失,还要使用那个变量。为了让数据还能继续被使用,就用fianl修饰,这样,在堆内存里面存储的其实是一个常量值。通过反编译工具可以看一下。


好了,到这里内部类就说完了~




下一篇讲一下匿名内部类~

太晚了~不写了睡觉


0 0