内部类(inner class)与静态内部类(inner static class)区别与使用场景
前言
在java开发过程中,不管是在阅读JDK源码,还是开源项目的一些源码,多多少少都会看到内部类的一些使用。直观上的感觉就是在这么项目类文件分布情况来看,没有那么多的文件,因为内部类都放置在外部类中了,当然这些类都是可以被提取出来作为单独的类使用的。
内部类与普通类的区别
在使用设计上
内部类:
内部类是依托于外部类的,可以不用通过继承这种方式使用到外部类的属性信息;
在对象新建的时候需要通过外部类勾勒出来;
在JVM编译过程中,编译结果是 主类$内部类
普通类:
需要使用到上一层类的属性,可以通过继承的方式来使用上一层的属性及方法信息;
在他处,构建对象的时候,直接可通过new自身就可以创建对象;
建一个普通的cup类
public class Cup {
private String color = "红色";
private Integer height = 10;
public String getColor() {
return color;
}
public Integer getHeight() {
return height;
}
}
构建一个继承类MarkCup继承Cup,并声明内部类InnerCup,来验证说明上述区别:
public class MarkCup extends Cup{
private String shape = "正方形";
public static void main(String[] args) {
MarkCup markCup = new MarkCup();
//打印父类属性
System.out.println("父类Cup属性打印:color:" + markCup.getColor() + " - height:" + markCup.getHeight());
//内部类创建
InnerCup innerCup = new MarkCup().new InnerCup();
innerCup.printFields();
}
public class InnerCup {
private String form = "高脚";
public void printFields() {
System.out.println("外部类MarkCup属性打印:cup's shape is " + shape);
System.out.println("内部类InnerCup属性打印:InnerCup's form is " + form);
}
}
}
运行结果:
内部类和静态内部类的区别
内部类和静态内部类(都是定义在外部类里面)的主要区别是:
1、直观上,静态内部类在类定义的过程中比内部类多一个static;
2、在新建对象上,内部类要通过new外部类才能在new内部类,静态内部类在new的过程中,加上外部类前缀就可以;
3、在使用外部类属性上,内部类可以使用所有属性,静态内部类只能使用静态属性;
4、内部类是不能定义静态变量的,静态类可以;
5、类加载过程中,这个跟static有关,静态内部类先被加载后再加载内部类
事例代码如下:
public class MarkCup extends Cup{
private String shape = "正方形";
private static String test = "测试外部类静态属性";
public static void main(String[] args) {
MarkCup markCup = new MarkCup();
//打印父类属性
System.out.println("父类Cup属性打印:color:" + markCup.getColor() + " - height:" + markCup.getHeight());
//内部类创建
InnerCup innerCup = new MarkCup().new InnerCup();
innerCup.printFields();
//静态内部类创建
StaticInnerCup staticInnerCup = new MarkCup.StaticInnerCup();
staticInnerCup.printFields();
}
public class InnerCup {
private String form = "内部类属性";
public void printFields() {
System.out.println("外部类MarkCup属性打印:cup's shape is " + shape);
System.out.println("内部类InnerCup属性打印:InnerCup's form is " + form);
}
}
public static class StaticInnerCup {
private static String form = "静态内部类静态属性";
private String test = "测试静态内部类属性";
public void printFields() {
System.out.println("外部类MarkCup静态属性打印test: " + test);
System.out.println("静态内部类StaticInnerCup静态属性打印form:" + form);
System.out.println("静态内部类StaticInnerCup属性打印test:" + test);
}
}
}
运行结果如下:
内部类应用场景
1、内部类创建就是说基本上只有外部类在使用,极少的情况下,非外部类可能会在使用(正常来说不会),这种情况下可以使用内部类,当然也可以使用普通构造类。
2、在构建内部类的时候,需要使用到外部类的静态属性或者需要其他类来处理这个类的内容的,建议用静态内部类;
3、就是满足内部类和静态内部类的特性的就使用对应的类构建。