一、Java内部类概述
内部类的概念
所谓的Java内部类就是在类中再重新定义一个类,重新定义的类就被称为内部类。
内部类的特点:
1. 内部类可以直接访问外部类的中的成员,包括私有成员,因为内部类持有一个外部类的引用,格式为外部类名.this。
2. 外部类访问内部类成员,必须创建内部类对象才可以访问。
什么时候创建内部类?
内部类一般用于类的设计。
分析事物时,如果发现该事物描述中还有事物,而且这个事物还在访问被描述事物的内容,这时就是还有的事物定义成内部类来描述。
内部类的分类:
内部类直接访问外部类成员的格式:
外部类名.内部类名 = new 外部类对象.new 内部类对象;
如果内部类是静态的,就相当于一个外部类。
访问格式: 外部类名.内部类名 = new外部类对象.内部类;
如果内部类中的成员也是静态的,可以是借使用类名访问,格式为:
外部类名.内部类名.静态函数名;
总结一句话就是访问内部类必须经过外部类。
内部类的注意事项:
1. 如果内部类的成员是静态的,那么内部类也必须是静态的。
2. 如果内部类被定义在局部位置,也就是在外部类的函数里(包括主函数),那么内部类只能访问局部位置中被final修饰的局部变量。
内部类示例:
class Demo2
{
public static void main(String[] args)
{
Car c =new Car();
c.show();
}
}
//定义一个汽车类
class Car
{
private String color;
private String model;
int num=3;
//内部类
class Tyre
{
int num = 4;
//轮胎类有行走的方法
void walk()
{
int num =5;
//内部类可以直接访问外部类成员 默认持有一个外部类的引用
System.out.println("行走"+num+this.num+Car.this.num);
}
}
//外部类访问内部类必须创建内部类对象
void show()
{
Tyre t = new Tyre();
t.walk();
}
}
二、匿名内部类
匿名内部类的概述
匿名内部类顾名思义就是名字被隐藏起来的内部类,简单的说就是没有名字。是内部类的一种简写。
其实匿名内部类就是一个匿名子类对象,而且这个对象有点胖,也可以理解为,带内容的对象。
定义匿名内部类的前提
必须继承一个外部类,或者实现接口。
匿名内部类的使用场景
当函数参数是接口类型时,而且接口中的方法不超过三个,可以用匿名内部类作为实际参数进行传递。
匿名内部类的定义格式
new父类或者(or)接口(){子类成员}
匿名内部类的小练习:
class InnerClassDemo
{
public static void main(String[] args)
{
Test.function().method();
}
}
interface Inner
{
void method();
}
class Test
{
//补充代码
static Inner function()
{
return new Inner()
{
public void method(){}
};
}
}