接口回调
目录:程序员成长之旅/Java学习/笔记
接口回调
指针回调: 表示一个变量的地址在某一时刻存放在一个 '指针变量' 中,这个 '指针变量' 可以间接操作该变量中存放的数据;
接口回调: 接口回调借用了C语言中'指针回调'的术语, 有 '接口变量'.
1. 接口变量的类型声明的类型必须是接口, 声明后就可以接受实现了该接口的对象的引用
2. 使用该接口变量可以调用所有接口中所描述的方法
3. (其实当 接口变量 在调用被类实现的接口方法时,就是在通知相应的对象调用这个方法)
Example5_8
关键
在calArea方法中使用了接口回调, 该接口变量调用了接口IArea中描述的的方法.
// Student.calArea(IArea area);
public void calArea(IArea area){
System.out.println("Area of " + area.getArea() + " is " + area.getType());
}
// IArea.java
public interface IArea{
public float PI = 3.1415926f;
public String getType();
public float getArea();
}
在入口文件中使用了Student.calArea(IArea area), 描述了如何给接口变量传实参
// Example5_8.java 入口文件
public class Example5_8{
public static void main(String[] args) {
Desk desk = new Desk(10, 20);
Cake cake = new Cake(12, 8);
BasketBall basketBall = new BasketBall(10);
Student mikeStudent = new Student("Mike");
mikeStudent.calArea(desk);
mikeStudent.calArea(cake);
mikeStudent.calArea(basketBall);
System.out.println("万宇晨 20203101019");
}
}
完整代码
// Example5_8.java
package JClassHomework_21_12_18_2;
public class Example5_8{
public static void main(String[] args) {
Desk desk = new Desk(10, 20);
Cake cake = new Cake(12, 8);
BasketBall basketBall = new BasketBall(10);
Student mikeStudent = new Student("Mike");
mikeStudent.calArea(desk);
mikeStudent.calArea(cake);
mikeStudent.calArea(basketBall);
System.out.println("万宇晨 20203101019");
}
}
// IArea.java
package JClassHomework_21_12_18_2;
public interface IArea{
public float PI = 3.1415926f;
public String getType();
public float getArea();
}
// Desk.java
package JClassHomework_21_12_18_2;
public class Desk implements IArea{
private float lenght;
private float width;
private String type = "Desk";
public Desk(){}
public Desk(float lenght, float width){
this.lenght = lenght;
this.width = width;
}
public float getWidth() {
return width;
}
public void setWidth(float width) {
this.width = width;
}
public float getLenght() {
return lenght;
}
public void setLenght(float lenght) {
this.lenght = lenght;
}
@Override
public String getType() {
return type;
}
@Override
public float getArea() {
return this.lenght * this.width;
}
}
// Cake.java
package JClassHomework_21_12_18_2;
public class Cake implements IArea{
private float width;
private float height;
private String type = "Cake";
public Cake(){}
public Cake(float width, float height){
this.width = width;
this.height = height;
}
public float getWidth() {
return width;
}
public void setWidth(float width) {
this.width = width;
}
public float getHeight() {
return height;
}
public void setHeight(float height) {
this.height = height;
}
@Override
public String getType() {
return type;
}
@Override
public float getArea() {
return this.width * this.height / 2;
}
}
// BasketBall.java
package JClassHomework_21_12_18_2;
public class BasketBall implements IArea{
private float radius;
private String type = "BasktBall";
public BasketBall(){}
public BasketBall(float radius){
this.radius = radius;
}
public float getRadius() {
return radius;
}
public void setRadius(float radius) {
this.radius = radius;
}
@Override
public String getType() {
return type;
}
@Override
public float getArea() {
return this.radius * this.radius * IArea.PI;// 调用了接口中的值
}
}
// Student.java
package JClassHomework_21_12_18_2;
public class Student{
private String name;
public Student(){}
public Student(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
*
* @param area 接口变量, 可以调用所有实现了IArea接口的类的对象中IArea所描述的方法.(接口回调)
*/
public void calArea(IArea area){
// 指针回调: 表示一个变量的地址在某一时刻存放在一个 '指针变量' 中,这个 '指针变量' 可以间接操作该变量中存放的数据;
// 接口回调: 接口回调借用了C语言中'指针回调'的术语., 有 '接口变量'.
// 1. 接口变量的类型声明必须是接口, 声明后就可以接受实现了该接口的对象的引用
// 2. 使用该接口变量可以调用所有接口中所描述的方法
// 3. (其实当 接口变量 在调用被类实现的接口方法时,就是在通知相应的对象调用这个方法)
System.out.println("Area of " + area.getArea() + " is " + area.getType());
}
}
其他使用方法
public class Caller {
//保存一个接口引用
private MyCallInterface callInterface;
public Caller() {
}
public void setCallFunc(MyCallInterface callInterface) {
this.callInterface = callInterface;
}
public void call() {
callInterface.printName();
}
}