内部类,通俗点说就是类里面或方法里面有一个类,这就像是大箱子里面还有一个小巷子的样子
类的内部类
下面是一个普通内部类的例子
public class OutClass {
private int age=10;
public void printInfo(){
System.out.println("age="+age);
}
class InClass{
public void print(){
System.out.println("age="+age);
printInfo();
}
}
public static void main(String[] args) {
InClass ic=new OutClass().new InClass();//通过outClass的对象来实例化一个inClass的对象
ic.print();
}
}
运行结果:
age=10
age=10
可以看到内部类的方法可以直接访问外部类的所有成员而不用创建外部类的对象
而且当要创建一个内部类对象时,必须通过一个外部类的对象才可创建
静态内部类:
当一个类的内部类声明为静态时,该内部类只能访问外部类的静态成员
内部类对变量、方法的访问优先度:
当外部类的成员变量,内部类的成员变量,局部变量重名时,使用该变量名的访问优先度为局部变量--内部类的成员变量--外部类的成员变量
使用【this.变量名】可访问内部类的成员变量,使用【外部类名.this.变量名】可访问外部类的变量
而对于方法名重名也同理
方法内部类
当一个类在函数体里声明时,该类被称为方法内部类
因为声明是在方法内部的,所以方法内部类声明时可以使用的修饰符只有final和abstract修饰符。
例:
public class FunctionInnerClass {
private int a=10;
public int b=15;
public void test() {
int c=20;
class InnerClass{
public void print(){
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
new InnerClass().print();
}
public static void main(String[] args) {
FunctionInnerClass fic=new FunctionInnerClass();
fic.test();
}
}
输出结果:
10
15
20
方法内部类可以直接访问外部类的所有变量和方法体内的局部变量
匿名内部类
当一个类实现了某个接口或继承了某个类但只使用一次的时候,我们可以使用匿名内部类。
匿名内部类没有名字,在声明完类体之后就直接实例化一个对象赋给某个类或接口引用了,个人觉得这和c语言中匿名结构体有点类似
下面看一个例子
public class NoNameClass {
public static void main(String[] args) {
Person cokelover=new Person() { //①
public void drink(){
System.out.println("喝三瓶可乐洗胃啊!");
}
};
cokelover.drink();
}
}
abstract class Person{
abstract void drink();
}
运行结果:
喝三瓶可乐洗胃啊!
注①:因为匿名内部类没有类名,所以实例化对象时使用父类类名或接口名
关于匿名内部类在多线程上也有应用,博主我还没有学习多线程,这里先挖个坑,日后再填