当一个对象A离开对象B就没有存在的意义,比如:棋子与棋盘,手机充电器与手机。
没有棋盘,棋子就没用,没有手机,充电器就没用。这个时候就可以使用内部类。
棋子类可以定义在棋盘中。
包含有内部类的类叫外部类,内部类可以访问外部类属性(除了静态内部类,因为静态内部类产生于外部类之前)。
方法级别内部类(如下前两例),可以使用方法级别的修饰符 比如:private、public等,访问策略与类方法相同。
方法级别内部类编译时产生于本类加上内部类个数的class文件
例:
静态类内部类
public class InnerClass {
//静态内部类,注意其实例化。。。
static class A{
void doit(int a){
System.out.println("InnerClass is working and numuber is:"+a);
}
}
public static void main(String[] args) {
//静态内部类实例化
//与普通类的实例化差不多,可以吧InnerClass.A看做是一个类
InnerClass.A a= new InnerClass.A();
a.doit(3);
}
}
实例内部类
public class InnerClass {
//实例内部类,其实例化,必须先创建外部类实例,
class B{
void doit(){
System.out.println("实例内部类工作");
}
}
public static void main(String[] args) {
//实例内部类,必须要有棋盘,才能有棋子
//先实例外部类,通过外部类对象新的对象类B
InnerClass innerClass =new InnerClass();
InnerClass.B b=innerClass.new B();
b.doit();
//也可示例如下
InnerClass.B b1=new InnerClass().new B();
b1.doit();
}
}
局部变量级内部类
public class InnerClass {
//局部变量级内部类,属于某个方法,只在方法内有效,不能使用任何访问修饰符,就跟局部变量一样。
void method(){
class C{
void doit(){
System.out.println("局部变量级内部类");
}
}
//调用该类(只能在方法中使用)
C c = new C();
c.doit();
}
public static void main(String[] args) {
InnerClass innerClass1 =new InnerClass();
innerClass1.method();
}
}
这个写法也会产生新的class文件
但这个写法几乎没人用,只有一些职业笔试面试时好像会问到。
匿名内部类
我们给类起名是为了什么?
为了可以使用这个类名创建多个实例,可是如果只需要一个实例呢?不就是不起名,直接用就好。
于是匿名内部类产生,匿名类需继承于一个已有的父类或实现一个接口。
其实质是
class ??? extends XXXClass(){
//???(无名类)实现或重写XXXClass方法、或些自己的方法
}
定义一个无名的类继承或实现一个已有类,重写或实现父类方法、或写自己的方法。
之后就简化成
new XXXClass(){
//方法
}
实现代码如下
public class AnonymousClass {
public void method(){
System.out.println("method类使用");
}
public static void main(String[] args) {
//匿名类也有构造方法,默认是调用父类无参构造方法,若父类没有无参构造方法,则报错
//使用父类方法
new AnonymousClass(){
}.method();
//重写父类方法
new AnonymousClass(){
@Override
public void method() {
System.out.println("ss");
};
}.method();
//实现自己方法
new AnonymousClass(){
void me(){
System.out.println("sfsf");
}
}.me();
}
}