Java内部类

什么是内部类
在Java中,允许一个类定义另一个类,前者称为外部类,后者称为内部类。
Inner Class一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。
Inner Class的名字不能与包含它的外部类名称相同;
内部类分类:
成员内部类:非静态成员内部类、静态成员内部类;
局部内部类:匿名内部类
成员内部类
成员内部类与外部类的不同点:
可以采用private或protected修饰符修饰;
可以在内部类中调用外部类的成员;
可以使用static关键字修饰,但此时就不能再使用外层类的非静态成员。
成员内部类的特点:
可以在内部定义属性、方法、构造器等成员;
可以直接使用外部类的所有成员,包括私有的数据;
外部类访问成员内部类的成员,需要“内部类.成员”或“内部类对象.成员”的方式;
可以使用abstract关键字修饰,因此可以被其它的内部类继承;
可以使用final关键字修饰;
编译以后生成的字节码文件格式:OuterClass$InnerClass.class。
注意事项:
外部类或静态成员内部类中可以使用static关键字,而非静态成员内部类中不能使用static关键字;
外部类的静态成员部分使用内部类成员时,可以考虑使用静态内部类。

示例1:

class Outer {

private int s;

public class Inner {

public void inner_method() {

s= 100;

System.out.println("在内部类Inner中s="+ s);

}

}

public void outer_method() {

Inner i= newInner();

i.inner_method();

}

}

public class InnerTest {

public static void main(String args[]) {

Outer o= new Outer();

o.outer_method();

}

}

示例2:

public class Outer {

private int s= 111;

public class Inner {

private int s= 222;

public void inner_method(int s) {

System.out.println(s);     // 输出局部变量s

System.out.println(this.s);  // 输出内部类对象的属性s

System.out.println(Outer.this.s);   // 输出外部类对象属性s

}

}

public static void main(String args[]) {

Outer a= new Outer();

Outer.Inner b= a.new Inner();

b.mb(333);

}

}

局部内部类
局部内部类的特点:
局部内部类仍然是一个独立的类,在编译之后局部内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号,以及数字编号;
局部内部类只能在声明它的方法或代码块中使用,而且是先声明后使用,除此之外的任何地方都不能使用该类;
局部内部类可以使用外部类的成员,包括私有的;
局部内部类可以使用外部方法的局部变量,但是必须是final的,由局部内部类和局部变量的生命周期不同所致;
局部内部类和局部变量地位类似,不能使用访问修饰符修饰;
局部内部类不能使用static修饰,因此也不能包含静态成员。
匿名内部类及其特点:
匿名内部类不能定义任何静态成员、方法和类;
匿名内部类必须继承父类(一般为抽象类)或实现接口;
匿名内部类一定是在new的后面,用其隐含实现一个接口或类;
匿名内部类只能创建一个实例。

new 父类构造器(实参列表)| 实现接口 () {

//匿名内部类的类体部分

}

示例:

interface A {

public abstract void fun();

}

public class Outer {

public static void main(String[] args) {

new Outer().call_Inner_method(new A(){

@override

public void fun() {

System.out.println(“implement for fun");

}

});

}

public void call_Inner_method(A a) {

a.fun();

}

}  

你可能感兴趣的:(java,开发语言)