1、 什么是内部类
将类写在其他类的内部,可以写在其他类的成员位置和局部位置,这时写在其他类内部的类就称为内部类。其他类也称为外部类。
2、内部类的分类
内部类分为成员内部类与局部内部类。
我们定义内部类时,就是一个正常定义类的过程,同样包含各种修饰符、继承与实现关系等。在内部类中可以直接访问外部类的所有成员。
①成员内部类:
1、成员内部类,定义在外部类中的成员位置。与类中的成员变量相似,可通过外部类对象进行访问
2、成员内部类可以使用成员修饰符:public、static…,它是一个类,可以继承、可以实现接口
成员内部类定义格式:
class 外部类 {
修饰符 class 内部类 {
//其他代码
}
}
成员内部类代码演示:
public class Outer {
private int i = 1;
//外部类成员的位置,定义内部类
class Inner {
public void inner() {
System.out.println("内部类方法inner "+ i);
}
}
}
调用规则:
内部类可以使用外部类成员,包括私有
外部类使用内部类必须建立内部类对象
访问方式:
外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
结合上面成员内部类的例子,代码演示:
public class Outer_Test {
public static void main(String[] args) {
/*
* 调用外部类中内部类的方法inner
*
* 依靠外部类对象找到内部类,利用内部类对象,调用内部类方法
* 访问方式:
外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
变量名.内部类方法;
*/
Outer.Inner in = new Outer().new Inner();
in.inner();
}
}
②局部内部类:
1、局部内部类,定义在外部类方法中的局部位置。与访问方法中的局部变量相似,可通过调用方法进行访问
2、局部内部类,定义在外部类方法中的局部位置。与访问方法中的局部变量相似,可通过调用方法进行访问
局部内部类定义格式
class 外部类 {
修饰符 返回值类型 方法名(参数) {
class 内部类 {
//其他代码
}
}
}
局部内部类代码演示:
public class JuBu_Outer {
public void out() {
class Inner{
public void inner() {
System.out.println("局部内部类方法inner");
}
}
// 在外部类方法中,创建内部类对象
Inner in = new Inner();
in.inner();
}
}
访问方式:
在外部类方法中,创建内部类对象,进行访问
结合上面局部内部类的例子,代码演示:
public class JuBu_Outer_Test {
public static void main(String[] args) {
//调用局部内部类方法inner
new JuBu_Outer().out();
}
}
3、内部类的实际使用——匿名内部类
一、定义的匿名内部类有两个含义:
① 临时定义某一指定类型的子类
② 定义后即刻创建刚刚定义的这个子类的对象
③匿名内部类属于局部内部类
二、定义匿名内部类的作用与格式
1、作用:
匿名内部类是创建某个类型子类对象的快捷方式。
格式:
new 父类或接口(){
//进行方法重写
};
匿名内部类代码演示:
public interface NiMing_inter {
//创建一个接口,里面有两个抽象方法
public abstract void smoking();
public abstract void playing();
}
public class NiMing_interTest {
public static void main(String[] args) {
//使用内部类实现smoking()、playing()方法
/*
* 定义实现类、重写方法、建立实现类对象,合为一步完成
格式:
new 父类或接口(){
//进行方法重写
};
*/
new NiMing_inter() { //new 父类或接口()
public void smoking() { //smoking方法重写
System.out.println("人在吸烟!");
}
public void playing() { //playing方法重写
System.out.println("人在玩耍!");
}
}.smoking();//调用重写方法
new NiMing_inter() { //new 父类或接口()
public void smoking() { //smoking方法重写
System.out.println("人在吸烟!");
}
public void playing() { //playing方法重写
System.out.println("人在玩耍!");
}
}.playing();//调用重写方法
// 利用多肽性,父类引用 = 子类对象
System.out.println("\n——————多态性调用——————");
NiMing_inter i = new NiMing_inter() {
public void smoking() { //smoking方法重写
System.out.println("人在吸烟!");
}
public void playing() { //playing方法重写
System.out.println("人在玩耍!");
}
};
i.smoking();
i.playing();
}
}
从new开始,到;(分号)结束,创建了接口NiMing_inter实现类的对象:
new NiMing_inter() { //new 父类或接口()
public void smoking() { //smoking方法重写
System.out.println("人在吸烟!");
}
public void playing() { //playing方法重写
System.out.println("人在玩耍!");
}
};
以上代码也是NiMing_inter的子类匿名对象
原因:
1、使用匿名对象的方式,将定义子类与创建子类对象两个步骤由一个格式一次完成。
2、虽然是两个步骤,但是两个步骤是连在一起完成的。
3、匿名内部类如果不定义变量引用,则也是匿名对象。