2 内部类
2.1 内部类的分类
什么时候使用内部类 ?
- 多个事物之间有包含关系, 可以使用内部类
内部类分类 ?
- 成员内部类
- 局部内部类
- 匿名内部类
2.2 成员内部类
-
定义的位置 : 类中方法外
-
创建成员内部类对象格式 : 外部类名.内部类名 对象名 = new 外部类名().new 内部类名(参数);
javapackage com.itheima.innerclass_demo.member_innerclass; // 外部类 public class Person { // 成员内部类 public class Heart { // 频率变量 private int rate; // 跳动方法 public void beats() { System.out.println("咚咚咚!"); } } } class Test { public static void main(String[] args) { // 创建内部类对象 Person.Heart heart = new Person().new Heart(); // 调用内部类中的方法 heart.beats(); } }
成员内部类访问外部类的成员
- 在内部类中有代表外部类对象的格式 : 外部类名的.this , 私有的也可以访问
- 外部类要想访问内部类成员 , 需要创建内部类对象
java
package com.itheima.innerclass_demo.member_innerclass;
public class Person {
private String name = "张三";
private int num = 10;
// 成员内部类
public class Heart {
int num = 100;
// 频率
private int rate;
// 跳动
public void beats() {
System.out.println("咚咚咚!");
}
// 调用外部类的成员
public void show(){
int num = 1000;
System.out.println(Person.this.name);
System.out.println(num);// 1000 就近原则
System.out.println(this.num);// 100
System.out.println(Person.this.num);// 10
}
}
}
class Test {
public static void main(String[] args) {
Person.Heart heart = new Person().new Heart();
heart.beats();
heart.show();
}
}
2.3 匿名内部类
- 匿名内部类 : 没有名字的类 , 一次性产品
- 使用场景 : 直接调用方法 , 作为方法的传参 , 返回值类型
- 好处 : 简化代码 , 快速实现接口或者抽象的抽象方法
- 格式 :
- new 类名/接口名(){ 重写抽象方法 } 注意 : 此处创建的是子类对象!!!
- 使用方式 :
- 直接调用方法
- 作为方法的参数传递
- 作为方法的返回值类型
java
public interface Flyable {
void fly();
}
public class Test1 {
public static void main(String[] args) {
new Flyable(){
@Override
public void fly() {
System.out.println("我在学习JAVA");
}
}.fly();
// 作为方法的参数传递
showFlyable(
new Flyable(){
@Override
public void fly() {
System.out.println("作为方法的参数传递");
}
}
);
// 作为方法的返回值类型
getFlyable().fly();
}
public static void showFlyable(Flyable flyable) {
flyable.fly();
}
// 作为方法的返回值类型
public static Flyable getFlyable(){
return new Flyable() {
@Override
public void fly() {
System.out.println("作为方法的返回值类型");
}
};
}
}
程序运行后的结果如下:
html
我在学习JAVA
作为方法的参数传递
作为方法的返回值类型