最近看到好多源码中都有内部类的存在,比如ThreadLocal、HashMap中都是这样。也了解到在jdk源码中,静态内部类较为常见。了解内部类是很有必要的。
为什么要使用内部类?可以去看下这篇文章链表为什么使用内部类实现。
1.内部类可以访问其所在类的私有属性和方法
2.不希望除了所属的外部类使用外的其他类进行访问,内部类可以隐藏起来
3.可以联合外部类解决多继承问题
内部类总共有以下四类。
1.静态成员内部类(和成员字段相同位置,static修饰)
2.成员内部类(和成员字段相同位置,没有static修饰)
3.局部内部类(方法内定义一个类)
4.匿名内部类(方法内定义一个类,但是没有名称,类似于new Runnable)
1.类可以用static修饰吗?
只有成员内部类可以用static关键字修饰。public类、方法内部类不行 。
2.内部类可以被实例化吗?
当然可以。在网上看到好多说静态类只能调用其静态方法,不能实例化。其实是可以被实例化的,好多jdk的源码都是这么干的。
3.什么是内部类。
一句话,内部类看作外部类(或者方法的)的一个变量名称。他们都是可以被实例化的,
4.成员内部类
package com.xiaoer;
public class StaticOuterBean {
public static void main(String[] args) {
System.out.println("============静态类============================");
System.out.println(StaticInnerClassA.staticClassStaticField);
StaticInnerClassA.staticClassStaticMethod(); //静态内部类的静态调用,无需实例化内部类
StaticInnerClassA staticInnerClassA = new StaticInnerClassA();
System.out.println(staticInnerClassA.staticClassNotStaticField);
staticInnerClassA.staticClassNotStaticMethod(); //静态内部类的非静态调用,需要实例化内部类
System.out.println("============非静态类============================");
StaticOuterBean staticOuterBean = new StaticOuterBean();
//非静态内部类是外类对象的一个属性,所以必须要在外部类实例化之后才能使用
NotStaticInnerClassB notStaticInnerClassB = staticOuterBean.new NotStaticInnerClassB();
System.out.println(notStaticInnerClassB.staticClassNotStaticField);
notStaticInnerClassB.staticClassNotStaticMethod();
// new NotStaticInnerClassB();
}
static class StaticInnerClassA {
private String staticClassNotStaticField = "静态类的非静态字段";
static String staticClassStaticField = "静态类的静态字段";
void staticClassNotStaticMethod() {
System.out.println("静态类的非静态方法");
}
static void staticClassStaticMethod() {
System.out.println("静态类的静态方法");
}
}
class NotStaticInnerClassB {
private String staticClassNotStaticField = "静态类的非静态字段";
// static String staticClassStaticField = "静态类的静态字段";
void staticClassNotStaticMethod() {
System.out.println("静态类的非静态方法");
}
// static void staticClassStaticMethod() { //非静态内部类不能声明姿态字段或者静态方法
// System.out.println("静态类的静态方法");
// }
}
}
输出结果:
============静态类============================
静态类的静态字段
静态类的静态方法
静态类的非静态字段
静态类的非静态方法
============非静态类============================
静态类的非静态字段
静态类的非静态方法