目录
前言:
大家好啊!我有一个朋友。。。咳咳,给大家介绍一下它,它就是内部类。
在Java中,我们把一个类定义在另一个类或者方法里面叫内部类,我感觉呢,它就和蛋黄酥里面的咸蛋黄、红豆沙是一样一样的,同样在内部,而类或者方法则充当着他俩的角色,内部类如咸蛋黄般在一口咬开蛋黄酥(类或者方法)时,丰富着蛋黄酥的口感,发挥着它的作用。稍微那么咀嚼一下,口感沙、酥、绵、密...咸甜交融得恰到好处,香甜的红豆,沙沙口感的蛋黄,真的无敌了!
内部类:
哈哈哈,有点扯远了,继续给大家介绍内部类。
内部类格式:
/*
格式:
class 外部类名{
修饰符 class 内部类名{
}
}
*/
访问特点:
内部类可以直接访问外部类的成员,包括私有外部类要访问内部类的成员,必须创建对象
广泛意义上内部类包括四种:成员内部类、局部内部类、匿名内部类和静态内部类。下面我就来为大家一一介绍它们。
1、成员内部类:
成员内部类是最普通的内部类,它定义在另一个类中,在类中方法,跟成员变量是一个位置。
外界创建成员内部类格式:
格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
举例:Outer.Inner oi = new Outer().new Inner();
成员内部类的推荐使用方案:
将一个类,设计为内部类的目的,大多数都是不想让外界去访问,所以内部类的定义应该私有化,私有化之后,再提供一个可以让外界调用的方法,方法内部创建内部类对象并调用。
2、局部内部类:
局部内部类是定义在一个方法里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内。
使用和访问:
局部内部类,外界是无法直接使用,需要在方法内部创建对象并使用
该类可以直接访问外部类的成员,也可以访问方法内的局部变量
注意:局部内部类就像是方法里面的一个局部变量一样,是不能有 public、protected、private 以及 static 修饰符的。
3、匿名内部类:
匿名内部类应该是平时我们编写代码时用得最多的,在编写事件监听的代码时使用匿名内部类不但方便,而且使代码更加容易维护。
匿名内部类的本质是一个继承了该类或者实现了该接口的子类匿名对象。
前提:
存在一个类或者接口,这里的类可以是具体类也可以是抽象类
格式:
格式:new 类名 ( ) { 重写方法 } new 接口名 ( ) { 重写方法 }
举例: new Inter(){
@Override
public void method(){}
}
细节:
匿名内部类可以通过多态的形式接受
Inter i = new Inter(){
@Override
public void method(){}
}
在开发中的使用:
匿名内部类的本质是一个继承了该类或者实现了该接口的【子类匿名对象】
既然是对象,那就可以作为参数传递。
所以,当发现某个方法需要,接口或抽象类的子类对象,我们就可以传递一个匿名内部类过去。
4、静态内部类:
静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。
静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法,这点很好理解,因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象。
5、内部类关于static修饰的注意事项:
静态成员:
在非静态内部类中不可以声明静态成员,只有静态内部类才能够定义静态的成员变量与成员方法。
成员引用:
非静态内部类,可以随意的访问外部类中的成员变量与成员方法。即使这些成员方法被修饰为private(私有的成员变量或者方法)。
静态内部类只能引用外部类中的静态的成员(变量或方法),而不能够访问非静态的变量
创建对象:
普通非静态内部类的对象是依附在外部类对象之中的,需要开两个new。
程序员在定义静态内部类的时候,是不需要定义绑定在外部类的实例上的。也就是说,要在一个外部类中定义一个静态的内部类,不需要利用关键字new来创建内部类的实例。