java内部类的基本理解

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值