您的位置:首页 > 编程语言 > Java开发

Java内部类的应用(初级)

2016-05-22 10:40 453 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/Kingcrab26/article/details/51474033

Hello!Everybody.我是Crab宇,英文名Crab Yu。今天,我要总结一下java中的内部类。呃。。。初级的。Crab Yu还在菜鸟通往天堂的路上艰难地啪嗒着翅膀。

这是分割线---------------------------------------------


内部类:顾名思义,就是写在内部的类(也就是说写在外部类内部的类)。

我们知道java(外部)类的基本要素有:

类名与文件名(.java)相同,class关键字修饰;

$_英文字母开头,后接字母数字下划线和$;

建议每个单词的首字母大写或者用下划线隔开(驼峰命名法);

而内部类是定义在类内部的,而避免同包下的类名冲突,内部类的类名不需要与所在的文件的文件名相同,这是最基本的区别。

那么接下来,我分别介绍一下内部类家族的兄弟姐妹:它们分别是成员内部类、局部内部类(方法内部类)、静态嵌套内部类和匿名内部类。

1.成员内部类:是最普通的内部类,是定义在外部类的内部,除了不用也不可以与文件名相同以外,其他都与外部类无异。

需要注意的是:内部类的包(位置)依赖外部类,所以构造时需要写外部类.内部类;

成员内部类以外部类的成员变量的形式出现,而且是非静态的,这点与静态内部类区分。

再看一个例子:

运行结果:

局部变量:14 内部类变量:13 外部类变量:12

很容易看出,在外部类的内部,内部类可以无条件地访问外部类的属性和方法,而外部类则要通过外部类再到内部类的方式来获得内部类的成员。内部类俨然像外部类的一个局部成员一样,呆在“深闺”之中,不是谁想见就能见到的。

运行结果:

内部类没同名,所以直接调用外部类成员变量:10

内部类可以拥有 private访问权限、protected访问权限、public访问权限及包访问权限 。

比如上面的例子,如果成员内部类Inner用private修饰,则只能在外部类的内部访问,如果用public修饰,则任何地方都能访问; 如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。

这一点和外部类有一点不一样, 外部类只能被public和包访问两种权限修饰 。

由于成员内部类看起来像是外部类的一个成员,所以可以像类的成员一样拥有多种权限修饰。要注意的是,成员内部类不能含有static的变量和方法。 因为成员内部类需要先创建了外部类,才能创建它自己的



2.局部内部类:局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。

定义在方法里的内部类:

运行结果:10       12

本例中我们将内部类移到了外部类的方法中,然后在外部类的方法中再生成一个内部类对象去调用内部类方法。如果此时我们需要往外部类的方法中传入参数,那么外部类的方法形参必须使用 final 定义。

换句话说,在方法中定义的内部类只能访问方法中final类型的局部变量,这是因为在方法中定义的局部变量相当于一个常量,它的生命周期超出方法运行的生命周期,由于局部变量被设置为final,所以不能再内部类中改变局部变量的值。

定义在作用域内的内部类:

运行结果: 12


3.静态嵌套类:又叫静态局部类、嵌套内部类,就是修饰为static的内部类。声明为static的内部类,不需要内部类对象和外部类对象之间的联系,就是说我们可以 直接引用outer.inner ,即不需要创建外部类,也不需要创建内部类。

如果用static 将内部内静态化,那么内部类就只能访问外部类的静态成员变量,具有局限性。

其次,因为内部类被静态化,因此Outter.Inner可以当做一个整体看,可以直接new 出内部类的对象( 通过类名访问static,生不生成外部类对象都没关系 )


4.匿名内部类:匿名内部类应该是平时我们编写代码时用得最多的,在编写事件监听的代码时使用匿名内部类不但方便,而且使代码更加容易维护。下面这段代码是一段Android事件监听代码:

这段代码为两个按钮设置监听器,这里面就使用了匿名内部类。具体位置是这段:

代码中需要给按钮设置监听器对象,使用匿名内部类能够在实现父类或者接口中的方法情况下同时产生一个相应的对象,但是前提是这个父类或者接口必须先存在才能这样使用。当然像下面这种写法也是可以的,跟上面使用匿名内部类达到效果相同:

这种写法虽然能达到一样的效果,但是既冗长又难以维护,所以一般使用匿名内部类的方法来编写事件监听代码。同样的, 匿名内部类也是不能有访问修饰符和static修饰符的 。

匿名内部类是唯一一种没有构造器的类 。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于 接口回调 。匿名内部类在编译的时候由系统自动起名为Outter$1.class。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: