1.1 内部类

1.1.1 内部类的基本定义

在类内部可定义成员变量与方法,而且在类内部也可以定义另一个类。如果在Outer的内部再定义一个类Inner,此时类Inner就称为内部类,而类Outer则称为外部类。

内部类可声明成publicprivate。当内部类声明成publicprivate时,对其访问的限制与成员变量和成员方法完全相同。内部类的声明格式:

标识符 class 外部类的名称{

//外部类的成员

标识符 class内部类的名称{

//内部类的成员

}

}

定义内部类:

class Outer{

private String info = "Hello";

class Inner{

public void print(){

System.out.println(info);

}

}

public void fun(){

new Inner().print();

}

}

class InnerClassDemo01{

public static void main(String[] args) {

new Outer().fun();

}

}

运行结果:

Hello

Inner类作为Outer类的内部类存在,并且在外部类的fun()方法之中直接实例化内部类的对象并调用方法print(),但是从以上代码中可以明显地发现,内部类的存在实际上已经破坏了一个类的基本结构,因为类是由书香及方法组成的,所以这是内部类的一个缺点。把内部类拿到外面就能发现内部类的优点:

class Outer1{

private String info = "你成功了!";

public String getInfo(){

return info;

}

public void fun(){

new Inner(this).print();

}

}

class Inner{

private Outer1 out = null;

public Inner(Outer1 out){

this.out = out;

}

public void print(){

System.out.println(out.getInfo());

}

}

class InnerClassDemo02{

public static void main(String[] args) {

new Outer1().fun();

}

}

运行结果:

你成功了!

完成了与内部类同样的功能,但是代码明显比之前的更加复杂,所以内部类的唯一好处就是可以方便的访问外部类中的私有属性。

1.1.2 使用static定义内部类

使用static可以声明属性或方法,而使用static也可以声明内部类,用是他提出声明的内部类变成了外部类,但是用static声明的内部类不能访问非static的外部属性。

class Outer2{

private static String info = "Hello";

static class Inner{

public void print(){

System.out.println(info);

}

}

}

class InnerClassDemo03{

public static void main(String[] args) {

new Outer2.Inner().print();

}

}

运行结果:

Hello

1.1.3 在外部访问内部类

一个内部类除了可以通过外部类访问,也可以直接在其他类中进行调用,调用的基本格式:

外部类.内部类 内部类对象 外部类实例.new 内部类();

首先要找到外部类的实例化对象后,才可以通过外部类的实例化对象去实例化内部类的对象。

在外部访问内部类:

class Outer3{

private String info = "Hello";

class Inner{

public void print(){

System.out.println(info);

}

}

}

class InnerClassDemo04{

public static void main(String[] args) {

Outer3 out = new Outer3();

Outer3.Inner in = out.new Inner();

in.print();

}

}

运行结果:

Hello

1.1.4 在方法中定义内部类

也可以在方法中定义一个内部类,但是在方法中定义的内部类不能直接访问方法中的参数,如果方法中的参数要想被内部类所方位,则参数前必须加上final关键字。

在方法中定义内部类:

class Outer4{

private String info = "Hello";

public void fun(final int temp){

class Inner{

public void print(){

System.out.println("类中的属性" + info);

System.out.println("方法中的参数" + temp);

}

}

new Inner().print();

}

}

class InnerClassDemo05{

public static void main(String[] args) {

new Outer4().fun(30);

}

}

运行结果:

类中的属性Hello

方法中的参数30