文章目录
- (一)编程实现
- 1、创建汽车接口
- 2、创建司机类
- 3、创建测试司机类
- 4、运行程序,查看结果
- 5、修改TestDriver类,演示匿名内部类
- 6、运行程序,查看结果
- (二)知识点讲解
- 1、成员内部类
- 2、局部内部类定义
- 3、静态内部类定义
- 4、匿名内部类
- (三)拓展练习
- 任务1、使用成员内部类实现学生使用各种类型计算机的场景
- 任务2、使用匿名内部类实现学生使用各种类型计算机的场景
- 创建Car接口
- 创建Driver类
- 创建测试类TestDriver
1、基于Car接口创建成员内部类
对象作为参数传给驾驶员对象的drive()方法。
2、基于Car接口创建匿名内部类
对象作为参数传给驾驶员对象的drive()方法。
(一)编程实现
1、创建汽车接口
- 在
net.huawei.p03.t04
包里创建Car
接口
public interface Car {
void start();
void run();
void stop();
}
2、创建司机类
- 在
net.huawei.p03.t04
包里创建Driver
类 - 在
Driver
类里创建成员内部类Benz
public class Driver {
/**
* 成员内部类Benz
*/
class Benz implements Car {
private String model;
private double price;
private String color;
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@Override
public void speak() {
System.out.println(color + "色奔驰[" + model + "]单价:" + price + "万~");
}
@Override
public void start() {
System.out.println("奔驰[" + model + "]正在起步……");
}
@Override
public void run() {
System.out.println("奔驰[" + model + "]正在行驶……");
}
@Override
public void stop() {
System.out.println("奔驰[" + model + "]正在停止……");
}
}
}
-
Driver
是Benz
的外部类,Benz
就是Driver
的成员内部类 - 给
Driver
类添加name
属性和drive(Car car)
方法
3、创建测试司机类
- 在
net.huawei.p03.t04
包里创建TestDriver
类
public class TestDriver {
public static void main(String[] args) {
// 创建司机对象(外部类对象)
Driver driver = new Driver();
// 设置司机对象属性
driver.setName("唐小刚");
// 基于司机对象(外部类对象)创建奔驰对象(内部类对象)
Driver.Benz benz = driver.new Benz();
// 设置奔驰对象属性
benz.setModel("梅赛德斯-AMG A 35 L 4MATIC");
benz.setPrice(45);
benz.setColor("蓝");
// 调用司机对象的驾驶方法
driver.drive(benz);
}
}
4、运行程序,查看结果
- 运行
TestDriver
类
5、修改TestDriver类,演示匿名内部类
- 匿名内部类是直接基于接口创建对象
public class TestDriver {
public static void main(String[] args) {
// 创建司机对象(外部类对象)
Driver driver = new Driver();
// 设置司机对象属性
driver.setName("唐小刚");
// 基于司机对象(外部类对象)创建奔驰对象(内部类对象)
Driver.Benz benz = driver.new Benz();
// 设置奔驰对象属性
benz.setModel("梅赛德斯-AMG A 35 L 4MATIC");
benz.setPrice(45);
benz.setColor("蓝");
// 调用司机对象的驾驶方法
driver.drive(benz);
System.out.println("=======================");
// 司机驾驶宝马车(采用匿名内部类方式)
driver.drive(new Car() {
private String model = "全新BMW Z4敞篷跑车";
private double price = 55;
private String color = "红";
@Override
public void start() {
System.out.println("宝马[" + model + "]正在起步……");
}
@Override
public void run() {
System.out.println("宝马[" + model + "]正在行驶……");
}
@Override
public void stop() {
System.out.println("宝马[" + model + "]正在停止……");
}
public void speak() {
System.out.println(color + "色宝马[" + model + "]单价:" + price + "万~");
}
});
}
}
6、运行程序,查看结果
- 运行
TestDriver
类 - 思考题:为什么奔驰有自我介绍而宝马没有?
(二)知识点讲解
- 在Java中,允许在一个类的内部定义类,这样的类称作
内部类(inner class)
,这个内部类所在的类称作外部类(outer class)
。
1、成员内部类
- 在一个类中除了可以定义成员变量、成员方法,还可以定义类,这样的类被称作成员内部类。其实我们可以将内部类理解为国中之国。
2、局部内部类定义
- 局部内部类,也叫做方法内部类,就是定义在某个局部范围中的类,它和局部变量一样,都是在方法中定义的,其有效范围只限于方法内部。
3、静态内部类定义
- 所谓静态内部类,就是使用static关键字修饰的成员内部类。静态内部类在成员内部类前增加了static关键字,在功能上,静态内部类中只能访问外部类的静态成员,同时通过外部类访问静态内部类成员时,可以跳过外部类从而直接通过内部类访问静态内部类成员。
4、匿名内部类
- 匿名内部类其实就是没有名称的内部类。在调用包含有接口类型参数的方法时,通常为了简化代码,可以直接通过匿名内部类的形式传入一个接口类型参数,在匿名内部类中直接完成方法的实现。
(三)拓展练习
任务1、使用成员内部类实现学生使用各种类型计算机的场景
- Computer接口(speak()方法、compute()方法)
- Student类(name属性、use(Computer computer)方法、Desktop成员内部类、Laptop成员内部类、iPad成员内部类)
- TestStudent类(使用台式机、使用笔记本、使用平板电脑)
任务2、使用匿名内部类实现学生使用各种类型计算机的场景
- Computer接口(speak()方法、compute()方法)
- Student类(name属性、use(Computer computer)方法)
- TestStudent类(使用台式机、使用笔记本、使用平板电脑)