Java中的内部类
内部类的访问特点:
- 内部类可以直接访问外部类中的成员。
- 外部内要访问内部类,必须建立内部类的对象。
为什么内部类能直接访问外部类中的成员呢?
那是因为内部类持有外部类的引用。外部类名.this
一般用于类的设计。
分析事物时发现事物Outer描述中还有事物Inner,而且Inner事物还在访问被描述Outer事物的内容。
这时就将还有的事物Inner定义成内部类来描述。
如果内部类中定义了静态成员,该内部类也必须是静态的。
定义一个内部类如下:
class Outer
{
private int num=3;
class Inner//内部类
{
void show()
{
System.out.println("Inner run..."+num);
}
void function()
{
System.out.println("function run..."+num);
}
}
public void method()
{
Inner in=new Inner();
in.show();
}
}
如何访问内部类Inner呢?通过定义一个Outer类对象访问Outer类的方法,在Outer类的方法中定义内部类Inner对象,在通过内部类对象Inner访问内部类的方法。
代码如下:
class InnerClassDemo
{
public static void main(String[] args)
{
Outer o=new Outer();
o.method();
System.out.println("Hello World!");
}
}
运行结果:
如何直接访问外部类Outer中内部类Inner的成员?访问方式如下:
class InnerClassDemo
{
public static void main(String[] args)
{
//直接访问外部类中的内部类中的成员
Outer.Inner in=new Outer().new Inner();
in.show();
}
}
运行结果:
如果一个内部类是静态的相当于一个外部类,访问方式如下:
class Outer
{
private static int num=3;
static class Inner//内部类
{
void show()
{
System.out.println("Inner run..."+num);
}
void function()
{
System.out.println("function run..."+num);
}
}
public void method()
{
Inner in=new Inner();
in.show();
}
}
class InnerClassDemo
{
public static void main(String[] args)
{
//如果内部类是静态的,相当于一个外部类。
Outer.Inner in=new Outer.Inner();
in.show();
}
}
运行结果:
如果内部类中定义了静态成员,该内部类也必须是静态的。访问方式如下:
class Outer
{
private static int num=3;
static class Inner//内部类
{
void show()
{
System.out.println("Inner run..."+num);
}
static void function()
{
System.out.println("function run..."+num);
}
}
public void method()
{
Inner in=new Inner();
in.show();
}
}
class InnerClassDemo
{
public static void main(String[] args)
{
//如果内部类时静态的,成员是静态的。
Outer.Inner.function();
}
}
运行结果:
匿名内部类:就是内部类的简写格式。
必须有前提:
内部类必须继承或者实现一个外部类或者接口。
匿名内部类:其实就是一个匿名子类对象。
格式:new父类or接口(){子类内容}
示例代码如下:
abstract class Demo
{
abstract void show();
}
class Outer
{
int num=4;
public void method()
{
new Demo()
{
void show()
{
System.out.println("show..."+num);
}
}.show();
}
}
class InnerClassDemo3
{
public static void main(String[] args)
{
new Outer().method();
System.out.println("Hello World!");
}
}
内部类的匿名对象的应用场景:
- 当函数参数是接口类型时,而接口中的方法不超过三个。
- 可以使用匿名内部类作为时间参数进行传递。
当匿名内部类作为函数参数传递时,示例代码如下:
interface Inter
{
abstract public void show1();
abstract public void show2();
}
class InnerClassDemo4
{
public static void main(String[] args)
{
method(new Inter()
{
public void show1(){}
public void show2(){}
});
System.out.println("Hello World!");
}
public method(Inter in)
{
in.show1;
in.show2;
}
}