内部类——内部类的使用

来源:互联网 发布:福建省广电网络集团 编辑:程序博客网 时间:2024/06/07 04:30

一、在外部类里使用内部类

非静态内部类

对于初始化块:

不允许在外部类的静态初始化块中创建非静态内部类的实例(可以声明变量,但不能创建实例)

可以在外部类的普通初始化块中自由使用非静态内部类(既可以声明变量,又可以创建实例)

对于成员方法:

不允许在外部类的静态成员方法中创建非静态内部类的实例(可以声明形参、局部变量,但不能创建实例)

可以在外部类的非静态成员方法中自由使用非静态内部类(既可以声明形参、局部变量,又可以创建实例)

对于成员变量:

可以定义 非静态内部类 类型的 静态成员变量,但是不能直接进行初始化,也不能在静态初始化块、静态成员方法中进行初始化;只能在构造方法、非静态成员方法、非静态初始化块中对其进行初始化。

可以定义 非静态内部类 类型的 非静态成员变量,并能够直接初始化

静态内部类

可以在外部类的初始化块(静态、非静态)中自由使用静态内部类(既可以声明变量,又可以创建实例,也可以直接访问静态内部类的静态成员)

可以在外部类的成员方法(静态、非静态)中自由使用静态内部类(既可以声明形参、局部变量,又可以创建实例,也可以直接访问静态内部类的静态成员)

可以使用静态内部类来声明静态成员变量(静态、非静态)


在外部类里可以自由使用静态内部类,就像使用非内部类一样。


二、在外部类外使用内部类

如果希望在外部类以外的地方访问内部类,则内部类不能使用private访问权限控制,private修饰的内部类只能在外部类内部使用。

对于使用其他访问控制符修饰的内部类,则能在访问控制符对应的访问权限内使用。

非静态内部类

定义一个带有非静态内部类的类,代码如下:

package org.lgy.study.innerclass;public class Out{public class In{public In(String msg){System.out.println(msg);}public void method1(){System.out.println("********");}}}

下面演示如何在不同的包下使用上面定义的内部类,代码如下:

package org.lgy.study.main;import org.lgy.study.innerclass.Out;public class InnerClassMain{public static void main(String[] args){//在外部类以外的地方定义内部类变量的语法格式为:OuterClass.InnerClass varName;Out.In in = null;//因为非静态内部类的对象必须寄存在外部类的对象里,因此创建非静态内部类对象之前,//必须先创建其外部类对象。并且必须使用外部类对象来调用内部类的构造器。//下面一行代码将创建一个外部类对象,之后创建的内部类对象将寄存在该外部类对象中Out out = new Out();//用过外部类实例和new来调用内部类构造器创建非静态内部类实例in = out.new In("create inner class Out.In");in.method1();Out.In in1 = new Out().new In("create another inner class Out.In");in1.method1();}}

静态内部类

定义一个带有静态内部类的类,代码如下:

package org.lgy.study.innerclass;public class StaticOut{public static class StaticIn{public StaticIn(String msg){System.out.println(msg);}public void method1(){System.out.println("*******");}}}

下面演示如何使用上面定义的内部类,代码如下:

package org.lgy.study.main;import org.lgy.study.innerclass.StaticOut;public class InnerClassMain{public static void main(String[] args){//在外部类以外的地方定义内部类变量的语法格式为:OuterClass.InnerClass varName;StaticOut.StaticIn in = null;//因为静态内部类属于外部类,所以创建内部类对象时必须使用外部类来调用构造器in = new StaticOut.StaticIn("create inner class StaticOut.StaticIn");in.method1();StaticOut.StaticIn in2 = new StaticOut.StaticIn("create another inner class StaticOut.StaticIn");in2.method1();}}


0 0
原创粉丝点击