7.1 内部类
java支持在一个类中定义另外一个类
这样的类叫做内部类,而包含内部类的类叫做外嵌类
内部类和外嵌类的关系:
1.内部类可以调用外嵌类的成员变量和方法
2.内部类的类体中不可以声明静态变量和静态方法,外嵌类可以使用内部类声明的对象作为自己的成员使用,
3.内部类仅仅供他的外部类使用,不可以额外再让其他的类使用。
4内部类的外嵌类的成员在内部类中仍然有效,以至于内外沟通·更加方便
eg:举个例子,加入红牛农场养红牛,但是他不希望别的农场同事养这种牛,他就可以将红牛定义为自己的内部类,这样就只有他自己可以使用红牛,别的农场不可以使用
1。java编译器生成的内部类的字节码文件的名字和通常类的字节码文件的名字有些不同,格式为“外嵌类名$内部类名.class”,因此在将字节码文件复制给其他开发人员的时候。不要忘记将内部类的字节码文件一并复制
2. 非内部类不可以是static类,但是内部类可以是static类。
类是一种数据类型,那么static内部类就是外嵌类的一种静态数据类型,这样程序就可以在其他类中使用static类创建对象了。但是有一个限制就是static内部类不能操作外嵌类的实例成员变量。
但是在外部调用的时候注意格式:
eg:内部类是b,外部类是a
a.b duixiang=new a.b(所传参数);
7. 2 匿名类
首先大家应该理解什么时候使用匿名类;
eg: void f(A a){
}
加入上述A类是一个抽象类的话,那么需要子类去实现抽象类中的抽象方法,而且用户希望通过上转型对象的方法向A a的传参值为A类的一个子类的对象的引用,但是系统没有提供要求的子类,那么用户在使用的时候就可以考虑使用匿名类
和子类有关的匿名类
1.在创建子类的对象的时候,我们可以使用父类的构造方法或者类体,所谓的类体,就可以认为是一个子类去掉类声明之后的类体,称作匿名类。匿名类就是一个子类,由于无名可用,所以不可以通过匿名类声明一个对象,但是可以通过匿名类创建一个对象。
通过上面一句话我们总结出了以下3个特点。。。。。1:匿名类没有名字 2:匿名类不可以声明一个对象(因为没有名字) 3:匿名类可以通过类体创建一个对象
2匿名类的特点1:匿名类可以继承父类的方法,也可以重写父类的方法
2:使用匿名类肯定是在某个类中进行声明,所以匿名类一个是个子类
3:匿名类具有内部类的属性,可以访问外嵌类的成员变量和方法,但是在匿名类的类体中不可以创建静态的成员变量和方法
4:由于匿名类是一个子类,而且还没有类名,所以在用匿名类创建对象的时候,要直接使用父类的构造方法
3:匿名类的结构
假设Bank是一个类,那么下面的代码就是用Bank的一个子类创建的对象,也就是匿名类
new Bank(){
匿名类的类体
}; //注意分号
和接口有关的匿名类
1原理类似:假设A是一个接口,那么直接可以使用接口名和类体直接创建一个匿名对象
结构和上面的一样
eg: new A(){
实现接口的匿名类的类体
};