java内部类的基本理解

来源:互联网 发布:adobe cc2018 mac破解 编辑:程序博客网 时间:2024/04/20 09:08

一、内部类(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(“车开了!”);
}
}

0 0