一.内部类
定义:内部类是指在一个外部类的内部在定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在。内部类可以为静态,可以用protected和private修饰
为什么要用内部类:
每个内部类都能独立的继承自一个接口的实现,无论外围类是否已经继承了某个实现,对应内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象类的能力,一些设计与编程问题就很难解决。
根据位置的不同,JAVA中的内部类分为四种:
1. 静态内部类:
1)使用static修饰,声明在类体中
2)静态内部类中可以访问外部类的静态成员
2.成员内部类
1)声明在类体中,不使用static,具有类的成员特征,也就是,必须有类的实例才能创建内部类实例
2)内部类实例可以访问共享外部类的成员变量
3)如:链表的节点就可以定义为内部类
3.局部内部类
把类声明在方法中就是局部内部类,作用域
4.匿名内部类
1)匿名类是对原类的一个继承,同时创建了实例,{}就是继承以后的类体,类体中可以使用所有类的语法
2)匿名类不能写构造器
3)匿名类可以从抽象类或者接口继承,必须提供抽象方法的实现
内部类的访问规则:
1. 内部类可以直接方法外部类中的成员,包括私有类
之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式外部类名.this;
2.外部了要访问内部类,必须建立内部类对象
访问格式,当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中可以直接建立内部类对象 格式:外部类名.内部类名 变量名=外部类对象.内部类对象;
例如:Outer.Innerin=new Outer().new Inner();
3. 当内部类在成员位置上,就可以被成员修饰符所修饰。
例如,private,将内部类在外部类中进行封装
Static:内部类就具备了static的特性。
当内部类被静态修饰后,只能直接访问外部类中的静态成员了,出现了访问局限。
在外部其他类中,如何直接访问静态内部类?
new Outer.Inner().function();
在外部其他类中,如何直接访问static内部类的静态成员呢?
Outer.Inner.function();
注意:当内部类中定义了静态成员,该内部类必须是静态的。
当外部类中的静态方法访问内部类时,内部类也必须是静态的
当描述事物时,事物的内部还有事物,该事物用内部类来描述,因为内部事物在使用外部事物中的内容。
注意:内部类定义在局部时:
1. 不可以被成员修饰符修饰
2. 可以直接访问外部类中的成员,因为还持有外部类中的引用。
但是不可访问它所在局部中的变量,只能访问被final修饰的局部变量。
abstract class AbsDemo
{
abstract void show();
}
class Outer
{
int x=3;
/*class Inner extends AbsDemo
{
void show()
{
System.out.println("show:"+x);
}
}
*/
public void funcation()
{
//new Inner().show();
new AbsDemo() //AbsDemo的匿名子对象相当于new Inner().show()
{
void show()
{
System.out.println("x:"+x);
}
}.show();
}
}
class InnerClassDemo3
{
public static void main(String[] args)
{
Outer out=new Outer();
out.funcation();
}
}
匿名内部类其实就是内部类的简写格式。
定义匿名内部类的前提:
内部类必须继承一个类或者实现接口。
3. 匿名内部类的格式: new 父类或者接口(){定义子类的内容}
4. 其实匿名内部类就是一个匿名子类对象,而且这个对象有点胖!可以理解为带内容的对象
5. 匿名内部类中定义的方法最好不要超过3个。
6. 什么时候使用匿名对象类: