A.定义
用class关键字修饰过的就是类;将类定义在类的内部,这个类我们称之为内部类
//内部类,是改变了类定义位置方式,叫做成员内部类,先初始化外部类,
//再初始化内部类“外部类$内部类”
class dog{
//定义属性
int age = 10;
//定义方法
public void print() {
System.out.println(age);
}
//构造方法
public dog(){
}
}
B.成员内部类的访问方法
1.内部类可以直接访问外部类的成员属性
2.外部类需要访问内部类的成员属性时需要创建内部类的对象
一:在外部类的成员函数中创建内部类的对象,通过内部类的对象,直接访问内部类的成员
public void show() {
System.out.println("外部类" + new dog().age);
}
二:在其他类中需要调用内部类的成员属性时,需要创建内部类的对象,通过外部类来创建内部类
public static void main(String[] args) {
Test.dog dog = new Test().new dog();
System.out.println(dog.age);
}
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.new dog().age);
}
C.什么时候调用内部类
当一个具体的事物发生时,如果该事物内部还有其他具体的事物,这个时候就需要定义内部类
比如我们定义了人(身高、年龄....)心脏(......)有独立的属性和方法,但是又包含在外部类中
D.局部内部类访问方式
局部内部类的描述:包含在外部类的函数中的内部类我们称之为局部内部类
访问方式:
1、在本类的成员函数中调用
public void run() {
class Myin{
int age = 10;
public void show() {
System.out.println(i);
System.out.println(j);
}
}
new Myin().show();
System.out.println("" + new Myin().age);
}
}
public void show() {
run();
}
2、在本类的成员内部类函数当中调用
class In{
int j = 1;
public void run() {
class Myin{
int age = 10;
public void show() {
System.out.println(i);
System.out.println(j);
}
}
new Myin().show();
System.out.println("" + new Myin().age);
}
}
public void show() {
new In().run();
}
E.匿名内部类
匿名内部类描述:就是一个没有类名的内部类,是因为要简化内部类的书写
匿名内部类一般用于哪些场景:必须继承一个父类或者实现一个接口(抽象类或者接口)
匿名内部类的使用:
Innter inn = new Innter() {
@Override
public void show2() {
System.out.println("show2");
}
@Override
public void show1() {
System.out.println("show1");
}
};
inn.show1();
inn.show2();
F.内部类的总结
成员内部类
使用场景:一个事物中有另一个具体事物(汽车类型- 汽车的发动机 电脑-主机)
使用方式:1、在本类中使用的话,new内部类,通过这个来使用
2、在其他类,通过外部类的方式new外部类().new内部类()
局部内部类
使用场景:本类的函数中或者本类的内部类的函数中
使用方式:在函数中调用,在外部类调用封装的函数名
匿名内部类
使用场景:存在于接口或者抽象类的实例
使用方式:new接口名/抽象类,它会需要我们重写接口或者抽象类当中的方法