内部类
定义在类中的类。
好处:可以直接访问外部类中的成员。
外部类要访问内部类需要创建内部类的对象。
内部类直接访问外部类的原理:因为内部类持有了外部类的引用。外部类名.this
例:
class Outer
{
private int num = 4;
//内部类。
class Inner
{
int num = 5;
void show()
{
int num = 6;
System.out.println("inner show "+Outer.this.num);//4
}
}
void method()
{
Inner in = new Inner();//外部类要访问内部类需要创建内部类的对象。
in.show();
}
}
class InnerClassDemo
{
public static void main(String[] args)
{
Outer out = new Outer();
out.method();
}
}
内部类方法的调用及对象的创建
class Outer
{
private static int num = 4;
/*
如果把内部类定义在成员位置上。他就可以被成员修饰符所修饰。
public private static
*/
//public
public class Inner_1
{
void show()
{
System.out.println("Inner show..."+num);
}
}
//private
private class Inner_2
{
void show()
{
System.out.println("Inner show..."+num);
}
}
public void method()
{
new Inner_2().show();
}
//static
static class Inner_3//非静态内部类中只能定义静态常量,其他静态修饰的成员都不允许。
{
static final int x = 4;
void show()
{
System.out.println("Inner show...."+num);
}
}
}
class InnerClassDemo2
{
public static void main(String[] args)
{
/*
//直接创建内部类对象。
Outer.Inner_1 in = new Outer().new Inner_1();
in.show();
*/
/*
new Outer().method();
*/
/*
内部类静态,访问非静态的方法。
Outer.Inner_3 in = new Outer.Inner_3();
in.show();
*/
/*
内部类静态,访问静态的方法。
Outer.Inner_3.show();
*/
}
}
匿名内部类
就是内部类的简化格式。
内部类必须继承一个类或者实现接口,这种情况下的内部类可以简化成匿名内部类
其实匿名内部类就是一个子类对象。
class Test
{
public static void main(String[] args)
{
Fu f = new Zi();//0x0088
f.show();
/*
下面两个匿名内部类有区别吗?为什么?
*/
new Object()
{//匿名内部类括号里 是子类对象的方法
public void show()
{
System.out.println("show run");
}
}.show();
Object obj = new Object()
{
public void show()
{
System.out.println("show run");
}
};
obj.show();//这里会编译出错,
//因为Object obj指向了自己的子类对象。对象提升为了Object 就不能调用子类的特有方法
}
}