Java中的几种内部类
- 成员内部类
- 静态内部类
- 匿名内部类
- 局部内部类
成员内部类:顾名思义,就是类里面有一个类,例子如下:
public class Outer { // 外部类
private int id = 10;//外部类的私有属性
public void out()
{
System.out.println("外部类方法.");
}
class Inner{//成员内部类
public void in()
{
System.out.println("内部类方法.");
}
}
}
但是如果需要创建内部类的对象的话应该怎么做呢?
骚操作来了:
public class Main {
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner(); // 创建内部类对象
inner.in();
}
}
输出的结果如下:
内部类方法.
不知道大家注意到没,我特意给外部类设置了一个私有属性,看看内部类能不能访问:
class Inner{
public void in()
{
System.out.println("内部类方法.");
}
public int getID()// 可以访问外部类的私有属性~
{
return id;
}
}
结果是可以的:
总结一下:
成员内部类可以被public修饰符修饰,我们知道在Java文件中可以存在多个class,但是只有一个class能被public修饰,这一点要与成员内部类区分,而且内部类可以访问外类的私有属性。
静态内部类:其实应用也很简单,就是在成员内部类添加static关键字修饰符就可以。但是同样也有几点需要注意:
一旦内部类添加了static关键字以后,就不能对外部类的私有属性进行访问了,原因是此时的内部类是在类加载的时候就被加载了进来,它属于类,而私有属性是在外部类进行实例化以后才加载出来,是属于对象。如果此时还是想要对其进行访问需要给私有属性也添加static关键字。
局部内部类:这个其实也很简单,就是在成员方法中添加内部类:
public class Outer {
private int id = 10;//私有属性
public void out()//成员方法
{
class Inner{ // 局部内部类
public void in()
{
System.out.println("局部内部类.");
}
}
}
}
匿名内部类:没有名字去初始化类,不用将实例保存在变量中,有点抽象,先看代码:
public class Test {
public static void main(String[] args) {
new Apple().eat();//匿名内部类调用方法
}
}
class Apple{
public void eat()
{
System.out.println("I eat a apple.");
}
}
上述的new Apple就是一个匿名内部类,是不是看上去很简单,下面来点好玩的:
public class Test {
public static void main(String[] args) {
new Apple().eat();//匿名内部类
new UserService(){//匿名实现接口
@Override
public void ServiceTest() {
System.out.println("测试服务器接口...");
}
};
}
}
class Apple{
public void eat()
{
System.out.println("I eat a apple.");
}
}
interface UserService{
void ServiceTest();
}
匿名接口实现也是匿名内部类的一种高阶玩法~