1. 内部类
- 在Java中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。
- Inner class一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。
- Inner class的名字不能与包含它的类名相同;
- Inner class可以使用外部类的私有数据,因为它是外部类的成员,同一个类的成员之间可相互访问。而外部类要访问内部类中的成员需要:内部类.成员 或者 内部类对象.成员。
- 分类
- 成员内部类(static成员内部类和非static成员内部类)
- 局部内部类(不谈修饰符)、匿名内部类
2. 内部类举例
class A {
private int s;
public class B{
public void mb() {
s = 100;
System.out.println("在内部类B中s=" + s);
}
}
public void ma() {
// 外部类中可以直接new内部类的对象
B i = new B();
i.mb();
}
}
public class Test {
public static void main(String args[]){
A o = new A();
o.ma();
}
}
3. 内部类与外部类之间的关系
public class Demo01 {
public static void main(String[] args) {
//创建外部类的对象
Outer outer = new Outer();
outer.outer_method();
//创建内部类的对象
// 外部类.内部类 对象名 = 外部类的对象.new 内部类();
Outer.Inner inner = outer.new Inner();
inner.inner_method();
inner.inner_method3(333);
outer.outer_method2();
}
}
/**
* 外部类 Outer
* @author Administrator
*
*/
class Outer{
//外部类的属性
private int s = 111;
double count = 20;
public void outer_method() {
System.out.println("外部类的方法");
}
public void outer_method2() {
//外部类中创建内部类的对象
//new Inner().inner_method();
System.out.println(new Inner().inner_method2());
}
/**
* 内部类 Inner
* 特点:
* (1)内部类可以无条件的访问外部类的属性和方法
* (2)对除了外部类的其他类来说,内部类能够进行隐藏
* (3)内部类中的属性和方法可以被外部类调用
* (4)内部类常用于编写事件驱动程序(swing、Android)
*
* @author Administrator
*/
class Inner{
private int s = 222;
public void inner_method() {
System.out.println("内部类的方法");
// 内部类可以无条件的访问外部类的属性和方法(private、static、public ... )
System.out.println("内部类访问外部类的属性和方法>>>>>>");
System.out.println(count);
outer_method();
}
public double inner_method2() {
return 200;
}
public void inner_method3(int s) {
System.out.println(s); // 局部变量s -- 333
System.out.println(this.s); // 内部类对象的属性s -- 222
System.out.println(Outer.this.s); // 外层类对象属性s -- 111
}
}
}
4. 内部类特性
- Inner class作为类的成员:
- 可以声明为final的
- 和外部类不同,Inner class可声明为private或protected;
- Inner class 可以声明为static的,但此时就不能再使用外层类的非static的成员变量;
- Inner class作为类:
- 可以声明为abstract类 ,因此可以被其它的内部类继承
【注意】非static的内部类中的成员不能声明为static的,只有在外部类或static的内部类中才可声明static成员。
5. 匿名内部类
匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
-
语法
-
new 父类构造器(实参列表)|实现接口(){ //匿名内部类的类体部分 }
-
代码实现
interface A{
public abstract void fun1();
}
public class Outer{
public static void main(String[] args) {
new Outer().callInner(new A(){
//接口是不能new但此处比较特殊是子类对象实现接口,只不过没有为对象取名
public void fun1() {
System.out.println(“implement for fun1");
}
});// 两步写成一步了
}
public void callInner(A a) {
a.fun1();
}
}