一、内部类
将类定义在其他类的内部(成员位置或局部位置),此种方式定义的类称之为内部类。定义在成员位置的类称之为成员内部类。定义在局部位置的类称之为局部内部类。
成员内部类可以使用成员修饰符,如public、private、static等等。它也是个类,可以继承、实现接口等。
内部类可以使用外部的成员,包括私有的。但是外部类要使用内部类的成员,必须要创建内部类对象。
创建内部类对象格式:
外部类类名.内部类类名 变量 = new 外部类().new 内部类();
例:
//外部类
public class Outer {
//成员内部类
class Inner{
public Inner(){
System.out.println("我是成员内类的构造方法!");
}
//成员内部类方法
public void innerFun(){
System.out.println("我是成员内部类的方法!");
}
}
}
//定义测试类
class Test{
public static void main(String[] args){
//创建成员内部类对象
Outer.Inner oi = new Outer().new Inner();
//调用内部类方法
oi.innerFun();
}
}
局部内部类,要想使用其中的成员,要在成员方法中创建局部内部类对象,然后调用其成员。
例:
//外部类
public class Outer {
//成员方法
public void fun(){
//局部内部类
class Inner{
public Inner(){
System.out.println("我是局部内部类的构造方法!");
}
//局部内部类的方法
public void sectionInnerFun(){
System.out.println("我是局部内部类的成员方法!");
}
}
//创建局部内部类对象
Inner in = new Inner();
//调用其成员方法
in.sectionInnerFun();
}
}
//定义测试类
class Test{
public static void main(String[] args){
//创建外部类对象,调用成员方法即可
new Outer().fun();
}
}
二、匿名内部类
匿名内部类是局部内部类的一种,是创建某个类型的子类对象的便捷方式,其不能有构造方法。
格式:
new 接口或父类(){
重写抽象方法
};
例:
//定义“人”类接口
public interface Person {
//定义抽象方法eat
public void eat();
//定义抽象方法 sleep
public void sleep();
}
public class MyTest {
public static void main(String[] args){
//使用匿名内部类方式创建实现类对象,以下是多态体现,父类引用指向子类对象(new 关键开始到分号结束 为子类对象)
Person p = new Person(){
//实现接口中的所有抽象方法
@Override
public void eat() {
System.out.println("吃饭!");
}
@Override
public void sleep() {
System.out.println("睡觉!");
}
};
//调用重写后的方法
p.eat();
p.sleep();
}
}