目录
一 、内部类的基本定义
在一个类的内部还存在另外一个类,则成为内部类
定义一个内部类:
class Outer { //定义外部类
private String info = "hello world"; //定义外部类的私有属性
class Inner { //定义内部类
public void print() { //内部类的方法
System.out.println(info); //直接访问外部类的私有属性
}
};
public void fun() { //外部类的方法
new Inner().print(); //通过内部类对象调用内部类方法
}
}
public class InnerClassDemo01 {
public static void main(String[] args) {
new Outer().fun(); //调用外部类的fun()方法
}
}
程序运行结果:
内部类的存在会增加一个类的结构复杂度,那么定义内部类有什么优点呢?此时,将内部类拿到外面,再实现一次以上代码的功能,就能发现内部类的优点。
class Outer {
private String info = "hello world";
public String getInfo() {
return this.info;
}
public void fun() {
new Inner(this).print(); //将操作此方法的当前对象传递到Inner中
}
}
class Inner {
private Outer out = null; //声明外部类对象
public Inner(Outer out) { //接收外部类对象实例
this.out = out;
}
public void print() {
System.out.println(out.getInfo()); //打印外部类的私有属性
}
};
public class InnerClassDemo02 {
public static void main(String[] args) {
new Outer().fun(); //调用Outer类的fun()方法
}
}
以上程序完成了与内部类相同的功能,但是代码明显比之前更加复杂,所以内部类的优点是 可以方便地访问外部类中的私有属性
二 、使用 static 定义内部类
使用 static 声明的内部类不能访问 非static 的外部类属性
class Outer {
private static String info = "hello world"; //定义 static 类型私有属性
static class Inner { //使用 static 定义内部类
public void print() {
System.out.println(info); //访问 static 类型的外部类私有属性
}
}
}
public class InnerClassDemo03 {
public static void main(String[] args) {
new Outer.Inner().print(); //访问内部类
}
}
三 、在外部访问内部类
一个内部类除了可以通过外部类访问,也可以直接在其它类中进行调用,调用的基本格式为:
外部类.内部类 内部类对象 = 外部类实例.new 内部类()
class Outer {
private String info = "hello world";
class Inner {
public void print() {
System.out.println(info);
}
};
}
public class InnerClassDemo04 {
public static void main(String[] args) {
Outer out = new Outer(); //实例化外部类对象
Outer.Inner in = out.new Inner(); //实例化内部类对象
in.print(); //调用内部类方法
}
}
四 、在方法中定义内部类
在方法中定义的内部类不能直接访问方法中的参数,如果方法中的参数想要被内部类所访问,则参数前必须加上 final 关键字
class Outer {
private String info = "hello world";
public void fun(final int temp) { //参数要被访问必须用 final 关键字声明
class Inner {
public void print() {
System.out.println("类中的属性:" + info);
System.out.println("方法中的参数:" + temp);
}
};
new Inner().print();
}
}
public class InnerClassDemo05 {
public static void main(String[] args) {
new Outer().fun(20);
}
}
程序运行结果: