内部类
定义:
内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限)。
为什么需要内部类?
典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码操作创建
其的外围类的对象。所以你可以认为内部类提供了某种进入其外围类的窗口。
使用内部类最吸引人的原因是:
每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。
从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。
根据位置的不同,Java中的内部类分为四种:
静态内部类。
1、使用static修饰,声明在类体中。
2、静态内部类中可以访问外部类的静态成员。
class Outer {
private static int num = 6;
static class Inner {
void show() {
System.out.println(num);
}
}
}
public class Test {
public static void main(String[] args) {
Outer.Inner inner = new Outer.Inner();
inner.show();
}
}
成员内部类。
1、声明在类体中,不使用static,具有类的成员特征,也就是,必须有类的实例才能创建内部类实例。
2、内部类实例可以访问共享外部类的成员变量(很常用)。
3、如:链表的节点就可以定义为内部类。
class Outer {
private int num = 6;
public void test() {
class Inner {
void show() {
System.out.println(num);
}
}
Inner in = new Inner();
in.show();
}
}
public class Test {
public static void main(String[] args) {
Outer out = new Outer();
out.test();
}
}
局部内部类
把类声明在方法中,就是局部内部类,作用域。
类似局部变量(很少见)。
匿名内部类。
1、匿名类,非常常见,可以写在任何地方,就像一般的语句。
2、语法更象是创建对象:Date d = new Date(){//...};
3、匿名类是对原类的一个继承,同时创建了实例,{} 就是继承以后的类体。类体中可使用所有类的语法。
4、匿名类不能写构造器。
5、匿名类可以从抽象类或者接口继承,必须提供抽象方法的实现。
任何内部类都编译成独立的class文件。最大的作用:封装!
interface Animal {
void sleep();
}
public class Test {
public static void main(String[] args) {
//匿名内部类作为参数传递给sleep方法
animalS(new Animal() {
public void sleep() {
System.out.println("睡觉");
}
});
}
public static void animalS(Animal animal) {
animal.sleep();
}
}
如果想通过外部类访问内部类需要外部类对象创建内部类对象:
外名.内名 变量名 = new 外名.内名 ();
内部类访问特点:
1,内部类可以直接访问外部类中的成员。
2,外部类要访问内部类,必须建立内部类的对象。
匿名内部类。就是内部类的简写格式。
必须有前提:
内部类必须继承或者实现一个外部类或者接口。
匿名内部类:其实就是一个匿名子类对象。
格式:new 父类or接口(){子类内容}
匿名对象:没有名字的对象
使用方式1.当对象的方法只调用一次时
使用方式2.匿名对象可以当作实例传递
网友评论