一、概念:
内部类,就是将一个类定义在另一个类的内部。内部的类称为内部类
public class Outer
{
class Inner
{
// 省略
}
}
二、内部类的主要特点:
内部类可以很好的实现隐藏,可以使用protected private 修饰符
内部类可以直接访问外部类的所有成员 包括私有的成员
外部类不能直接访问内部类的成员 必须首先建立内部类的对象才能访问
三、成员内部类的应用:
1.成员内部类属于外部类的实例成员 成员内部类可以有 public private protected 权限修饰符。
在成员内部类中访问外部类的成员方法和属性,要使用“外部类名.this.成员方法”和“外部类名.this.成员属性”的形式
2.创建成员内部类的实例使用 外部类名.内部类名 实例 = 外部类实例名.new 内部类
构造方法(参数) 的形式
四、代码实例:
class Outer
{
int data1;
void printData1()
{
System.out.println("外部类打印:"+data1);
}
void visitInner()
{
// 首先建立内部类的对象
Inner i = new Inner();
i.data2 = 55;
System.out.println("外部访问内部类:"+i.data2);
}
class Inner
{
int data2;
void printData2()
{
System.out.println("内部打印:"+data2);
Outer.this.printData1(); // 在成员内部类中访问外部类的成员方法和属性
// 外部类名.this.成员方法” “外部类名.this.成员属性
}
}
}
public class Test {
public static void main(String[] args) {
//外部类名.内部类名 实例 = 外部类实例名.new 内部类 构造方法(参数)
Outer o = new Outer();
Outer.Inner i = o.new Inner();
i.data2 = 5;
i.printData2();
o.visitInner();
}
}
五、匿名内部类:
匿名内部类是没有名称的内部类
1.匿名内部类的特点:
1.匿名内部类是没有名称的内部类 没办法引用他们 必须在创建时,作为new 语句的一部分来声明并创建他们的实例
2.匿名内部类必须继承一个类(抽象的 非抽象的都可以)或者实现一个接口。所有父类(或者父接口)是抽象类,则匿名内部类必须实现其所有抽象方法
语法: new interface/superclass() {类体}
这种形式的new 语句声明一个新的匿名类,它对一个给定的类进行拓展,或者实现一个给定的接口,并同时创建该匿名类的一个新实例
2.代码实例:
abstract class Demo1
{
abstract void printIn();
}
interface Demo2
{
abstract void printInner();
}
public class Test {
public static void main(String[] args) {
Demo1 d1 = new Demo1()
{
void printIn() {
// TODO Auto-generated method stub
System.out.println("这不是demo1,而是匿名内部类的方法");
}
};
d1.printIn();
new Demo2()
{
public void printInner() {
// TODO Auto-generated method stub
System.out.println("这不是接口的实例,而是匿名内部类的方法");
}
}.printInner();
}
}