java中的内部类汇总
来源:互联网 发布:python gnu readline 编辑:程序博客网 时间:2024/06/16 09:55
内部类是什么:
内部类是定义在另外一个类里面的类,与它相对应的,包含内部类的类是外部类。
为什么要用内部类:
1、内部类提供了更好的封装,把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
2、内部类所实现的功能外部类同样可以实现,只是有时使用内部类更方便
内部类数据访问特点:
1、内部类可以直接访问外部类的成员,包括私有成员
2、外部类访问内部类成员时,需要创建对象
内部类的分类:
1、成员内部类(在成员位置定义的类)
2、局部内部类(也叫方法内部类,在局部位置,即方法内定义的类)
3、静态内部类(被static修饰的成员内部类)
4、匿名内部类(没有名字的内部类)
详细内容
一、成员内部类
class Outer {String strO = "OuterString";// 成员内部类protected class Inner {public void show() {System.out.println(strO);}}public void method() {// 访问内部类,内部类相当于一个外部类成员的位置Inner in = new Inner();in.show();}}class InnerClassTest {public static void main(String[] args) {//在其他类中调用Outer类的Inner内部类时的格式。必须使用外部类对象来创建内部类对象,不能直接new一个内部类对象Outer.Inner in=new Outer().new Inner();//外部类.内部类 对象名=外部类对象.new 内部类();in.show(); Outer o=new Outer();//当内部类Inner被private修饰时,需要提供公共方法调用Inner类的成员,再在其他类InnerClassTest中使用 o.method(); }}Inner类是Outer类的成员内部类,Inner类可以使用任意访问控制符,如public,protected,默认的,private。在InnerClassTest类中调用Outer类的内部类。当Inner的访问控制符是private时,其他类InnerClassTest中不能调用内部类。Inner类中可以直接访问Outer类中的成员,不受访问控制符的影响。编译后,内部类也生成了一个.class 文件,文件名称是外部类名$内部类名.class
当成员内部类被private修饰后,在InnerClassTest类中将不能创建内部类Inner的对象,这就是private修饰符保证安全性的体现。如果要使用Inner内部类的方法,可以在Outer类中提供一个公共方法例如method(),来调用私有内部类的show方法。
二、局部内部类(方法内部类)
class FOuter {private int num = 123;public void method() {final int num2 = 100;//final修饰的局部变量// 定义一个局部内部类 class Inner {public void show() {System.out.println(num);System.out.println(num2);}}Inner i = new Inner();i.show();}}class FunctionInnerClassTest {public static void main(String[] args) {// 创建外部类对象FOuter o = new FOuter();o.method();}}局部内部类是定义在外部类的方法中的类,局部内部类只在该方法的内部可见,即只在该方法内可用。由于局部内部类不能在外部类的方法以外的地方使用,因此,局部内部类不能使用static修饰符和public、protected、private修饰符。
1、局部内部类访问局部变量必须使用final修饰
2、局部内部类可以直接访问外部类的成员
三、静态内部类
// 外部类class NOuter {// 外部类中的静态变量num1private static int num1 = 7;private int num2 = 12;// 创建静态内部类public static class SInner {// 内部类中的变量num1int num1 = 24;public void show() {System.out.println("访问外部类中的num1:" + NOuter.num1);System.out.println("访问外部类中的num2:" + new NOuter().num2);System.out.println("访问内部类中的num1:" + num1);}}public void show() {SInner si = new SInner();si.show();}}class StaticInnerClassTest {// 测试静态内部类public static void main(String[] args) {// 直接创建内部类的对象NOuter o = new NOuter();// 调用show方法o.show(); NOuter.SInner oi=new NOuter.SInner(); oi.show(); }}静态内部类其实是在成员内部类的基础上被static修饰的内部类。因为内部类是外部类的一个成员,为了方便访问,用static修饰。这种内部类的特点是:
1、静态内部类随着外部类的加载而加载。
2、静态内部类不能直接访问外部类的非静态成员,但是可以通过new 外部类().成员的方式访问.
3、如果外部类的静态成员与内部类的成员名称相同,可通过类名.静态成员访问外部的静态成员,如果名称不同,可直接通过成员名调用外部类静态成员。
4、在其他类例如测试类StaticInnerClassTest类中,访问格式:外部类名.内部类名 对象名=new 外部类名.内部类名();
四、匿名内部类
匿名内部类:没有名字的内部类
前提: 存在一个接口或类 这个类可以使抽象的也可以是具体
格式:
new 类名或者接口名(){
重写方法;
};//相当于创建一个实现该接口或者继承该类的子类的匿名对象.
匿名内部类的本质:
该接口的实现类 匿名 对象
- java中的内部类汇总
- Java匿名内部类汇总
- java中的内部类
- JAVA中的内部类
- java 中的内部类
- java中的内部类
- Java中的内部类
- JAVA 中的内部类
- java中的内部类
- java 中的内部类
- java中的内部类
- Java中的内部类
- java中的内部类
- Java 中的内部类
- java 中的内部类
- java中的内部类
- Java中的内部类
- java中的内部类
- Swift如何调用Object-C类
- 不稳定排序之选择、快速、希尔以及堆排序
- Win7运行httpd.exe -> ApacheCould not reliably determine the server's fully qualified do main name
- 的境百屯毡姓送屯宜汲荒葡底尉鬃
- 传智播客javase总结 9
- java中的内部类汇总
- java设计模式之-----单例设计模式
- 什么是阻抗?什么是阻抗匹配?为什么要阻抗匹配?
- URL类方法源码解读
- 98 Consider the following scenario for your database: - Backup optimization is enabled in RMAN. - Th
- 第十二周--数据结构--图 算法库
- Android内存和进程的关系
- 在C6455上移植NDK
- 内部排序-插入排序-二叉树排序法