> 文章列表 > 局部内部类、匿名内部类、私有内部类

局部内部类、匿名内部类、私有内部类

局部内部类、匿名内部类、私有内部类

有关于内部类的讲解,见此篇java内部类的创建
下面分别将讲解局部内部类、匿名内部类、私有内部类。

1. 局部内部类

可以在方法中定义内部类,甚至在语句块中也可以定义内部类,
这种情况通常是某个方法需要创建一个类来辅助完成该方法的功能,而这个类只用在该方法中。
局部内部类需要配合接口来一起使用。

interface Speaker {void speak();
}class LocalInnerClass {Speaker getSpeaker(String str) {class MySpeaker implements Speaker {@Overridepublic void speak() {System.out.println(str);}}return new MySpeaker();}
}public class App {public static void main(String[] args) {LocalInnerClass li = new LocalInnerClass();li.getSpeaker("good").speak();}
}

局部内部类限定了该类只能在局部作用域内被访问,因此是无法直接返回该类型的对象的,需要向上转型为其实现的接口类型。因此,局部内部类不能使用public和private进行声明。

2. 匿名内部类

Java 中可以实现一个类中包含另外一个类,且不需要提供任何的类名直接实例化。
主要是用于在我们需要的时候创建一个对象来执行特定的任务,可以使代码更加简洁。
匿名类是不能有名字的类,它们不能被引用,只能在创建时用 new 语句来声明它们。
匿名类语法格式:

class outerClass {// 定义一个匿名类object = new Type(parameterList) {// 匿名类代码};}

以上的代码创建了一个匿名类对象 object,匿名类是表达式形式定义的,所以末尾以分号;来结束
匿名类通常继承一个父类或实现一个接口。一旦掌握了匿名的内部类,可以让你的代码更加简洁清晰,匿名内部类一定是一个实现某个接口或者继承某个类的类,所以我们必须在使用匿名内部类之前定义一个接口或类。

/* 1. 匿名类继承一个父类 */
class Polygon {public void display() {System.out.println("在 Polygon 类内部");}
}
class AnonymousClass {public void createClass() {// 创建匿名类并继承Polygon类Polygon p1 = new Polygon() {@Overridepublic void display() {System.out.println("我是匿名类,继承自Polygon类。");}};p1.display();}
}/* 2. 匿名类实现一个接口 */
interface Student {void show();
}
interface Singer {void sing();
}class AnonymousClassDemo {public void createClass() {// 创建匿名类并实现一个接口Student su = new Student() {@Overridepublic void show() {System.out.println("我是匿名类,实现了Student接口。");}};su.show();}public Singer getSinger() {return new Singer() {@Overridepublic void sing() {System.out.println("我是匿名类,实现了Singer接口。");}};}}class App {public static void main(String[] args) {AnonymousClass demo1 = new AnonymousClass();demo1.createClass();AnonymousClassDemo demo2 = new AnonymousClassDemo();demo2.createClass();demo2.getSinger().sing();}
}

3. 私有内部类

内部类可以使用 private 或 protected 来修饰,如果你不希望内部类被外部类访问可以使用 private 修饰符。

class PrOuterClass {int num1 = 10;private class PrInnerClass {int num2= 20;}
}
 // 企图在外部创建私有类,错误PrOuterClass pOuter = new PrOuterClass();PrOuterClass.PrInnerClass pInner = pOuter.new PrInnerClass();     // error