1.内部类的定义
一个类的内部再创建一个类,叫内部类。
2.内部类的分类
2.1 成员内部类:与成员方法,成员变量类似,直接定义在类的内部即可。
public class Outer {
//属性
private String name;
private int age;
//成员内部类
class Inner{
private double score;
public void show(){
System.out.println("Outer---name"+name);
}
}
//主方法测试
public static void main(String[] args) {
Outer out = new Outer();
Inner i = out.new Inner();
i.show();
}
}
2.2 静态内部类:与成员内部类类似,需要static修饰符修饰这个类。
public class Outer {
//属性
private String name;
private static int age;
//静态内部类
static class Inner1{
private double score;
public void show(){
System.out.println("Outer---name:"+age);
}
}
//主方法测试
public static void main(String[] args) {
Inner1 i = new Inner1();
i.show();
}
}
2.3 方法内部类:在方法的内部定义一个内,创建对象时在方法内部创建即可。
public class Outer {
//属性
private String name;
private static int age;
//方法内部类
public void fun1(){
class Inner2{
private double score;
public void show(){
System.out.println("Outer---name:" + name);
}
}
Inner2 i = new Inner2();
i.show();
}
//主方法测试
public static void main(String[] args) {
Outer out = new Outer();
out.fun1();
}
}
2.4 匿名内部类:没有名称的内部类
定义一个Bird抽象类
public abstract class Bird {
//属性
private String name;
//构造方法
public Bird(){}
public Bird(String name){
this.name = name;
}
//get/set方法
public String getName(){
return name;
}
public void setName(){
this.name = name;
}
//抽象方法
public abstract void fly();
}
定义Outer内使用内部类
public class Outer {
//属性
private String name;
private static int age;
//匿名内部类
public void fun2(Bird b){
b.fly();
System.out.println("name="+b.getName());
}
public void fun3(){
fun2(new Bird("大雁"){
@Override
public void fly() {
System.out.println(getName()+"能飞行10000米");
}
});
}
//主方法测试
public static void main(String[] args) {
Outer out = new Outer();
out.fun3();
}
}
使用匿名内部类的注意事项:
1.使用内部类是必须实现或继承一个接口;
2.匿名类中不能定义构造函数;
3.匿名类内部不能存在任何静态成员变量和方法;
4.匿名内部类要使用外部类的局部变量,必须使用final修饰该局部变量