1、内部类
(1)概念
所谓内部类(Inner Class)。顾名思义,就是将一个类定义在另一个类的内部。内部的类称之为内部类
public class Outer{
class Inner{
//省略
}
}
(2)特点
内部类可以很好的实现隐藏,可以使用protected private修饰符
内部类可以直接访问外部类的所有成员,包括私有的成员
外部类不能直接访问内部类的成员,必须首先建立内部类的对象才能访问
2、成员内部类即应用
成员内部类属于外部类的示例成员,成员内部类可以有public private default protected权限修饰符。在成员内部类中访问外部类的成员方法和属性,要使用“外部类名.this.成员方法”和“外部类名.this.成员属性”的形式
创建成员内部类的示例使用“外部类名.内部类名 示例 = 外部类实例名.new 内部类构造方法(参数)”的形式
代码示例:
class Outer{
int data;
void printfdata(){
System.out.println("外部类打印");
}
void visitInner(){ //外部类不能直接访问内部类的成员,必须首先建立内部类的对象才能访问
Inner i = new Inner();
i.data = 90;
System.out.println("外部类访问内部类,内部内data="+i.data);
}
class Inner{
int data;
void Innerprintf(){
System.out.println("内部类打印");
System.out.println(Outer.this.data);//使用“外部类名.this.成员方法”的访问外部变量
Outer.this.printfdata();//使用“外部类名.this.成员方法”的形式调用外部类方法
}
}
}
public class Test {
public static void main(String[] args) {
//外部类名.内部类名 示例 = 外部类实例名.new 内部类构造方法(参数)
Outer o = new Outer();
o.data = 100;
Outer.Inner test = o.new Inner();
test.Innerprintf();
o.visitInner();
}
}
3、匿名内部类及应用
匿名内部类的特点:
匿名内部类是没有名称的内部类,没办法引用他们。必须在创建时,作为new语句的一部分来声明并创建他们的实例。
匿名内部类必须继承一个类(抽象的,非抽象的都可以),或者实现一个接口,所有父类(或者父接口)是抽象类,则匿名内部类必须实现其所有抽象方法。
语法:实例
new interface/superclass(){类体}
这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口,并同时创建该匿名类的一个新实例。
代码实例:
abstract class demo1{ //抽象类
abstract void printfinfo();
}
interface demo2{ //接口
abstract void interprint();
}
public class Test {
public static void main(String[] args) {
new demo1(){ //即去初始化它又去实现它,创建了一个匿名内部类
void printfinfo() {
// TODO Auto-generated method stub
System.out.println("这不是demo1,而是匿名内部类的方法");
}
}.printfinfo();//调用内部类内的方法
new demo2() {
public void interprint() {
// TODO Auto-generated method stub
System.out.println("这不是接口的实例,而是匿名内部类的方法");
}
}.interprint();
}
}