目录
(一)概述
将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。
(二)内部类的作用
i.内部类方法可以访问该类定义所在作用域中的数据,包括被 private 修饰的私有数据
ii.内部类可以对同一包中的其他类隐藏起来
iii.内部类可以解决 java 单继承的缺陷
iv.当我们想要定义一个回调函数却不想写大量代码的时候我们可以选择使用匿名内部类来实现
(三)成员内部类
成员内部类可以使用private、default、protected、public任意进行修饰。
定义格式
class 外部类
{
class 内部类{
}
}
(3.1)非静态内部类
(3.1.1)使用要点
外部类里使用非静态内部类和平时使用其他类没有什么不同。
i.非静态内部类必须寄存在一个外部类对象里,因此,如果有一个非静态内部类对象那么一定存在对应的外部类对象。非静态内部类对象单独属于外部类的某个对象。
ii.非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问非静态内部成员。
iii.非静态内部类不能有静态方法,静态属性和静态初始化块。
iv.外部类的静态方法、静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义变量、创建实例。
(1.1.2)非静态内部类的访问
class Outer {
private String xing= "中国无敌";
class Inner{
public void print() {
System.out.println(xing);
}
}
public void fun() {
new Inner().print();
}
}
public class text1 {
public static void main(String[] args) {
Outer outer = new Outer();
outer.fun();
}
}
运行结果如下:
(3.2)静态内部类
(3.2.2)使用要点
i.当一个静态内部类对象存在,并不一定存在对应的外部类对象。因此,静态内部类的实例方法不能直接访问外部类的实例方法。
ii.静态内部类看做外部类的一个静态成员。因此,外部类的方法中可以通过:“静态内部类.名字”的方式访问静态内部类的静态成员,通过new静态内部类()的实例。
(1.2.2)静态内部类的访问
class Outer
{
private static String age="中国无敌";
static class Inner
{
public void run()
{
System.out.println(age);
}
}
}
public class text1
{
public static void main(String[] args)
{
//通过new 外部类名。内部类名()来创建内部对象
Outer.Inner inner=new Outer.Inner();
inner.run();
}
}
运行结果如下:
(四)匿名内部类
匿名内部类适合那种只需要使用一次的类。比如,键盘监听操作等。
定义格式
new 父类名或者接口名()
{
// 方法重写
@Override public void method()
{
// 执行语句
}
};
(4.1)使用要点
i.匿名内部类没有访问修饰符。
ii.匿名内部类没有构造方法。因为它连名字都没有又何来构造方法。
(4.2)匿名内部类的访问
interface A{
public void printInfo();
}
class X{
public void fun1() {
this.fun2(new A(){
public void printInfo() {
System.out.println("中国无敌敌");
}});
}
public void fun2(A a) {
a.printInfo();
}
}
public class text1 {
public static void main(String[] args) {
new X().fun1();
}
}
运行结果如下:
(五)局部内部类
(5.1)使用要点
i.在方法内部定义,作用域只限于本方法
ii.局部内部类的使用主要用来解决比较复杂的问题,想创建一个类来辅助我们的解决方案,但又不希望这个类公开,所以就有了局部内部类。局部内部类和成员内部类一样被编译,只是作用域发生了改变,只在该方法中使用,出了该方法就失效。
(5.2)局部内部类的访问
public class text1
{
public void show()
{
//作用域仅限于该方法
class Inner
{
public void fun()
{
System.out.println("中国无敌厉害");
}
}
new Inner().fun();
}
public static void main(String[] args)
{
new text1().show();
}
}
运行结果如下: