我来解释一下,你看下面的代码//这是一个接口,Vehicle是交通工具的意思,这个接口定义了交通工具的一个共有的方法 //drive()驾驶 public interface InfVehicle { public void drive(); } //小汽车是交通工具,实现交通工具的接口 public class Car implements InfVehicle { public void drive() { //这里具体实现小汽车的驾驶方法 } } //自行车也是交通工具,实现了交通工具的接口 public class Bicycle implements InfVehicle { public void drive() { //这里具体实现自行车的驾驶方法 } }//这是一个“人”类,它有一个方法是 goHome回家,回家需要一种交通工具,所以他有一个交通工具,他回家时使用这个工具 public class Man { private InfVehicle vehicle;
public InfVehicle getVehicle() { return this.vehicle; } public void setVehicle(InfVehicle vehicle) { this.vehicle = vehicle; } //回家方法 public void goHome() { this.vehicle.drive(); } }现在我们来看怎么使用这些类Man aMan = new Man(); //创建一个"人" InfVehicle car = new Car(); //创建一个小汽车 InfVehicle bicycle = new Bicycle();//创建一个自行车//比如今天这个人想开车回家,我们就 aMan.setVehicle(car); aMan.goHome(); //如果他开车开腻了,想换一种方式,他这可以骑车回家 aMan.setVehicle(bicycle); aMan.goHome(Bicycle); 看明白上面的代码我来回答你的问题:1)为什么一个函数的返回值可以是接口?比如 类 Man 中的 public InfVehicle getVehicle() 这是因为接口也是一种“类型”,当然它可以用来当方法的返回值。但一个接口是不能有实例的,也就是说它必须指向一个具体类型(比如car或bicycle),当一个方法返回一个接口时,实现上也是返回一个具体实例,只不过是以接口的形式返回的2) 为什么接口能定义变量?比如上例中的 InfVehicle car = new Car(); 上面说了,接口是一种类型,它就可以定义变量,但它所指向的对象必须是一个具体的类型,这里的具体类型是car.你不能这样写 InfVehicle v = new InfVehicle(); //这就错了,因为接口不能被实例化。它所接收的要是一个具体类的实例,而这个类要实现这个接口。3)一个类实例为什么能被强制转成接口? 将一个具体的类实例转成它所实现的接口,这种操作叫向上转型,这是可以的。 当你转成接口后,你就只能使用接口中的方法了,而不能使用这个实现所扩展的方法。这是一个要注意的地方。当然,你向上转型时要保证你所转向的类型确实是这个类的父类类型4)为什么接口自己调用了起来? 这个问题比较好回答,一个具体的类调用自已的方法你一定认为这没什么吧,很正常,当然了,一个接口也可以调用自已的方法啊。为什么不能呢? 你要明白的是虽然表面是它是一个接口,实际上,它是指向一个具体的类的实例的,也就是说当接口调用自已方法时,和一个具体的类的实例调用自己的方法是一样的。没有什么不同。
我们还年轻牛奶会有的奶牛也会有的
可天天在 csdn 混这些会有吗 ??
//drive()驾驶
public interface InfVehicle {
public void drive();
} //小汽车是交通工具,实现交通工具的接口
public class Car implements InfVehicle {
public void drive() {
//这里具体实现小汽车的驾驶方法
}
}
//自行车也是交通工具,实现了交通工具的接口
public class Bicycle implements InfVehicle {
public void drive() {
//这里具体实现自行车的驾驶方法
}
}//这是一个“人”类,它有一个方法是 goHome回家,回家需要一种交通工具,所以他有一个交通工具,他回家时使用这个工具
public class Man {
private InfVehicle vehicle;
public InfVehicle getVehicle() {
return this.vehicle;
} public void setVehicle(InfVehicle vehicle) {
this.vehicle = vehicle;
}
//回家方法
public void goHome() {
this.vehicle.drive();
}
}现在我们来看怎么使用这些类Man aMan = new Man(); //创建一个"人"
InfVehicle car = new Car(); //创建一个小汽车
InfVehicle bicycle = new Bicycle();//创建一个自行车//比如今天这个人想开车回家,我们就
aMan.setVehicle(car);
aMan.goHome();
//如果他开车开腻了,想换一种方式,他这可以骑车回家
aMan.setVehicle(bicycle);
aMan.goHome(Bicycle);
看明白上面的代码我来回答你的问题:1)为什么一个函数的返回值可以是接口?比如 类 Man 中的 public InfVehicle getVehicle()
这是因为接口也是一种“类型”,当然它可以用来当方法的返回值。但一个接口是不能有实例的,也就是说它必须指向一个具体类型(比如car或bicycle),当一个方法返回一个接口时,实现上也是返回一个具体实例,只不过是以接口的形式返回的2) 为什么接口能定义变量?比如上例中的 InfVehicle car = new Car();
上面说了,接口是一种类型,它就可以定义变量,但它所指向的对象必须是一个具体的类型,这里的具体类型是car.你不能这样写
InfVehicle v = new InfVehicle(); //这就错了,因为接口不能被实例化。它所接收的要是一个具体类的实例,而这个类要实现这个接口。3)一个类实例为什么能被强制转成接口?
将一个具体的类实例转成它所实现的接口,这种操作叫向上转型,这是可以的。 当你转成接口后,你就只能使用接口中的方法了,而不能使用这个实现所扩展的方法。这是一个要注意的地方。当然,你向上转型时要保证你所转向的类型确实是这个类的父类类型4)为什么接口自己调用了起来?
这个问题比较好回答,一个具体的类调用自已的方法你一定认为这没什么吧,很正常,当然了,一个接口也可以调用自已的方法啊。为什么不能呢? 你要明白的是虽然表面是它是一个接口,实际上,它是指向一个具体的类的实例的,也就是说当接口调用自已方法时,和一个具体的类的实例调用自己的方法是一样的。没有什么不同。