一、内部类(Nested Class)的分类
1、静态内部类
2、非静态内部类
1)、普通内部类(成员内部类)
2)、匿名内部类
3)、方法内部类(局部内部类)
二、内部类的一些特性
1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成一个独立的class文件,但是名称前面是外部类名称和$符号
三、内部类的具体实现如下
1、静态内部类
1)静态内部类可以包含静态成员,非静态成员;
2)静态内部类可以直接调用外部类的静态属性,静态方法,但是不能调用外部类的普通属性和普通方法;
3)在不相关的类中,可以直接创建静态内部类的对象,不需要通过外部类;
4)静态内部类实际上和外部类的联系不多,也只有命名空间上的联系。
实例如下:
import com.silence.nested.StaticInnerClass.StaticClass;
/**
* 测试静态内部类的详细用法
* 1、内部类可以声明静态变量和普通变量
* 2、内部类方法只能调用外部类的静态变量和方法,不能调用普通变量和方法
*
* @author zhuxiang
*
*/
public class StaticInnerClass {
//定义静态内部类
/*private*/ static class StaticClass{
//内部类可以声明静态变量和普通变量
int a = 3;
static int b = 5;
}
}
class Test{
public static void main(String[] args) {
//在其他不相关类中调用内部类的时候,可以用外部类名.内部类来声明
StaticInnerClass.StaticClass sClass = new StaticInnerClass.StaticClass();
//也可以直接用内部类来声明,不过会导入一个类似于包的结构:
//import com.silence.nested.StaticInnerClass.StaticClass;
StaticClass stclas = new StaticClass();
}
}
2、成员内部类(普通内部类)基本用法
1)成员内部类就像一个成员变量一样存在于外部类中;
2)成员内部类可以访问外部类的所有成员,包括private修饰的变量;
3)成员内部类的this指的是内部类对象本身,要拿到外部类对象可以使用外部类名.this。成员内部类的对象是一定要绑定到一个外部类的对象上的,因此,创建成员内部类对象时需要持有外部类的对象的引用。要先有外部类的对象,后有成员内部类对象;
4)成员内部类不能有静态成员,但是可以声明为final,并且只能是编译器可以确定值的表达式。
5)成员内部类的对象的创建方式:
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
实例如下:
public class FiledInnerClass {
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.test();
}
}
class Outer{
int a = 3;
private int b = 3;
class Inner{
void test(){
System.out.println(a+b);
System.out.println("内部类:" + this);
System.out.println("外部类:" + Outer.this);
}
}
}
3、方法内部类(局部内部类)的基本使用
1)方法内部类的地位和方法内的局部变量的位置类似,因此不能修饰局部变量的修饰符也不能修饰方法内部类,如public,private等;
2)方法内部类只能在声明的方法内才可见,因此定义局部内部类之后,想用的话就要在此方法内直接实例化,但要先声明后使用,否则编译器找不到;
3)方法内部类不能访问定义它的方法内的局部变量,除非这个变量为final,本质原因是:局部变量和方法内部类的生命周期不一致。
4)方法内部类只能包含非静态成员!
实例如下:
/**
* 测试方法内部类(局部内部类)
* 只在该方法中有效
* 只能定义非静态变量
* 不能引用所在方法的局部变量,除非是final:
* 方法的生命周期和方法内部类的生命周期不一致
* @author zhuxiang
*
*/
public class MethodInnerClass {
}
class MethodOuter{
public void test(){
int a = 2;
class Inner{//只在该方法中有效
}
}
}
4、匿名内部类基本用法
1)匿名内部类的实例化方式:new InterfaceOrClass(){};意思是创造了一个实现(继承)了InterfaceOrClass的类的对象;
2)根据声明的位置,判断匿名内部类是成员内部类还是方法内部类;
注意:一般是方法内部类,这时就是具备方法内部类的特性。
3)三种使用方法:
继承式:
接口式:
参数式:
实例如下:
public class UnNameInnerClass {
public static void main(String[] args) {
NameOuter outer = new NameOuter();
outer.test();
}
}
class NameOuter{
public void test02(Car car){
car.run();
}
public void test(){
//匿名内部类,接口式 定义在方法中时,同时也是方法内部类
/*Runnable runnable = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
};*/
//匿名内部类,继承式
Car car = new Car(){
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("子类的车开了!");
}
};
car.run();
//参数式匿名内部类
test02(new Car(){
@Override
public void run() {
System.out.println("参数式匿名内部类!");
}
});
}
}
class Car{
public void run(){
System.out.println(“车开了!”);
}
}