1、成员内部类
- 定义格式:
class 外部类 {
修饰符 class 内部类 { }
}
- 访问方式
成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类,前提是必须存在一个外部类对象。
外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
案例:
/**
* 内部类
*/
public class demo1 {
public static void main(String[] args) {
//创建内部类对象
//Body.heart s=new Body().new heart();
//s.show();
Body b=new Body();
b.getheart();
}
}
class Body{
int num=1;
private class heart{
int num=2;
public void show(){
System.out.println("我是内部类中的方法");
//访问外部类中的成员变量
System.out.println(Body.this.num);
//访问外部类中的成员方法
Body.this.m1();
System.out.println(this.num);
}
}
//提供一个访问内部类的发式
public void getheart(){
heart h=new heart();
h.show();
}
public void m1(){
System.out.println("我是外部类成员");
}
}
2、局部内部类
-
局部内部类,是定义在外部类方法中的局部位置,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
注意:局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。
- 定义格式
class 外部类 {
修饰符 返回值类型 方法名(参数) {
class 内部类 {
//其他代码
}
}
}
- 访问方式
在内部类所在的法中,创建内部类对象,进行访问
注意:局部内部类只能访问被final修饰的局部变量
原因:内部类对象的生命周期会超过局部变量的生命期
局部变量的生命期:当该方法被调用时,该方法中的局部变量在栈中被创建,当方法调用结束时,退栈,这些局部变量全部死亡。
内部类对象生命期,与其它类一样,当创建一个局部内部类对象后,只有当没有其它人再引用它时,它才能死亡。
所以完全可能一个方法已调用结束(局部变量已死亡),但该局部类的对象仍然活着。即:局部类的对象生命期会超过局部变量。
案例:
package day0529;
/**
* 局部内部类
* 作用范围:方法内
*/
public class demo2 {
public static void main(String[] args) {
class Inner{
public void show(){
System.out.println("我是局部内部类中的方法");
}
}
Inner inner=new Inner();
inner.show();
}
}
3、匿名内部类
- 作用:匿名内部类是创建某个类型子类对象的便捷方式。(匿名内部类适合用于创建那种只需要一次使用的类)
- 格式:
new 父类或接口(){
//进行方法重写
};
案例:
package day0529;
import java.util.Scanner;
/**
* 匿名内部类
* 用法:多线程
*/
public class demo3 {
public static void main(String[] args) {
//正常方式
Zi zi=new Zi();
zi.show();
//匿名内部类
Inter inter=new Inter(){
//快捷键Alt+Enter
@Override
public void show() {
System.out.println("我是匿名内部类中的方法");
}
};
inter.show();
Abstractclass a=new Abstractclass() {
@Override
void show() {
System.out.println("使用匿名内部类创建抽象类对象");
}
};
a.show();
//普通类
Student student=new Student(){
@Override
public void show() {
System.out.println("调用m1(Student student)");
}
};
m1(student);
m2(a);
m3(inter);
}
public static void m1(Student student){
student.show();
}
public static void m2(Abstractclass aclass){
aclass.show();
}
public static void m3(Inter inter){
inter.show();
}
}
interface Inter{
void show();
}
class Zi implements Inter{
public void show(){
System.out.println("我是接口的实现方法");
}
}
abstract class Abstractclass{
abstract void show();
}
class Student{
public void show(){
System.out.println("我是普通类");
}
}