接口里默认是public权限
接口不能用来生成对象
接口可以被继承,然后实例化。
接口只关心操作,并不关心操作的具体实现,即只关心方法的类型,名称和参数,但不关心方法的具体行为(接口中只有abstract方法)。实现同一个接口的两个类就会具有接口所规定的方法,但方法的内部细节(方法体的内容)可能不同。
不同的类可以实现相同的接口,同一个类也可以实现多个接口。当不希望某些通过继承使得他们具有一些相同的方法时,就可以考虑让这些类去实现相同的接口而不是把他们声明为同一个类的子类。
abstract抽象类与interface接口的比较
1.abstract类和接口都可以有abstract方法;
2.接口中值可以有常量,不能有变量;而abstract类中既可以有常量也可以有变量;
3.abstract类中也可以有非abstract方法,接口不可以。
接口回调
(类似对象的向上转型)
和类一样,接口声明的变量称为接口变量。类class属于引用型变量,接口interface也属于引用型变量。接口变量中存放实现该接口的类的实例的引用。
有接口USB:
interface USB{}
即可以用USB声明一个变量:
USB usb;
此时usb是一个空的接口,因为usb中还没有存放实现该接口的类的实例的引用。
此时,定义类Phone实现USB接口
class Phone implements USB{}
Phone phone = new Phone();
此时phone不仅可以调用Phone原有的方法,也可以调用USB接口的方法。
java中,接口回调是指,可以把实现某一接口的类创建的对象的引用,赋给该接口声明的接口变量中,那么该接口变量就可以调用被类实现的接口方法。
usb = new Phone();
类似继承中的向上转型。
package course6;
public interface USB {
//public String name;此句不可执行
//接口中的方法默认为abstract方法,不必注明
void read();//默认为public权限,抽象方法
void write();//默认为public权限,抽象方法
}
package course6;
public class Phone implements USB {
String phonename;
public void read(){
System.out.println("手机读取USB");
}
public void write(){
System.out.println("手机写入USB");
}
public static void main(String[] args){
//创建USB接口的引用变量usb
USB usb;
//创建一个Phone对象的实例
usb = new Phone();
usb.read();
usb.write();
}
}
输出结果:
手机读取USB
手机写入USB
package course6;
public class PC implements USB{
public void read(){
System.out.println("电脑读取USB");
}
public void write(){
System.out.println("电脑写入USB");
}
}
package course6;
public class Phone implements USB {
String phonename;
public void read(){
System.out.println("手机读取USB");
}
public void write(){
System.out.println("手机写入USB");
}
public static void main(String[] args){
//创建USB接口的引用变量usb
USB usb;
//创建一个Phone对象的实例,把他赋给了USB接口的usb,指向创建的Phone对象
usb = new Phone();
usb.read();
usb.write();
//现在usb指向了新创建的PC对象
usb = new PC();
usb.read();
usb.write();
}
}
手机读取USB
手机写入USB
电脑读取USB
电脑写入USB
接口的多态性
在接口的回调中,实现接口的类型的实例的引用,可以赋值给接口变量,这样接口变量就可以回调类重写的接口方法。
由接口产生的多态,就是指—
不同的类在实现同一个接口时可能具有不同的实现方式,那么接口变量在回调接口时就可能具有多种形态。
面向接口编程(考试)
案例:
现在我们要开发一个应用,能够使用电脑读取三种不同的移动存储设备—U盘、MP3播放器、移动硬盘。
要求能够实现读取以上三种设备中的数据(读取方式是不同的),并且以后还会有其他的移动存储设备需要数据读取,所以必须要有扩展性,能读取当前未知但以后可能会出现的移动存储设备。
package course7;
//I盘
public class FlashDisk {
public void read(){
System.out.println("读取U盘数据");
}
}
package course7;
//MP3播放器类
public class MP3 {
public void read(){
System.out.println("读取MP3数据");
}
}
package course7;
//移动硬盘类
public class MobileDisk {
public void read(){
System.out.println("读取移动硬盘数据");
}
}
package course7;
//PC类,要企业能够读取不同存储设备的类
public class PC {
public void systemInstall(){
}
//读取U盘的数据
public void readFlashDisk()
{
FlashDisk flashDisk = new FlashDisk();
flashDisk.read();
}
//读取MP3的数据
public void readMP3(){
MP3 mp3 = new MP3();
mp3.read();
}
//读取移动硬盘数据
public void readMoblkeDisk(){
MobileDisk mobileDisk = new MobileDisk();
mobileDisk.read();
}
}
package course7;
public class Tester {
public static void main(String[] args){
PC pc = new PC();
pc.readFlashDisk();//执行读取U盘数据
pc.readMoblkeDisk();
pc.readMP3();
}
}
输出结果:
读取U盘数据
读取移动硬盘数据
读取MP3数据
面向接口编程:
新增存储设备时,无需修改PC类
package course7;
//U盘类
public class FlashDisk implements MoblieStorage{
public void read(){
System.out.println("读取U盘数据");
}
}
package course7;
//MP3播放器类
public class MP3 implements MoblieStorage{
public void read(){
System.out.println("读取MP3数据");
}
}
package course7;
//移动硬盘类
public class MobileDisk implements MoblieStorage{
public void read(){
System.out.println("读取移动硬盘数据");
}
}
package course7;
//PC类,要求能够读取不同存储设备的类,要考虑今后可能有不同的存储设备需要读取数据
public class PC {
public void systemInstall(){
}
//创建了一个接口变量
private MoblieStorage mobilestorage;
//通过set方法为接口赋值
public void setMoblieStorage (MoblieStorage mobilestorage){
this.mobilestorage = mobilestorage;
}
//实现的是接口mobile
public void read(){
this.mobilestorage.read();
}
/*
//读取U盘的数据
public void readFlashDisk()
{
FlashDisk flashDisk = new FlashDisk();
flashDisk.read();
}
//读取MP3的数据
public void readMP3(){
MP3 mp3 = new MP3();
mp3.read();
}
//读取移动硬盘数据
public void readMoblkeDisk(){
MobileDisk mobileDisk = new MobileDisk();
mobileDisk.read();
}
//读取SD卡数据
public void readSD(){
SD sd = new SD();
sd.read();
}
*/
}
package course7;
public class Tester {
public static void main(String[] args){
PC pc = new PC();
MoblieStorage flash = new FlashDisk();
MoblieStorage mp3 = new MP3();
MoblieStorage mobileDisk = new MobileDisk();
//执行读取U盘数据
pc.setMoblieStorage(flash);
pc.read();
//执行读取MP3数据
pc.setMoblieStorage(mp3);
pc.read();
//执行读取移动硬盘数据
pc.setMoblieStorage(mobileDisk);
pc.read();
}
}
输出结果:
读取U盘数据
读取MP3数据
读取移动硬盘数据
(考试)
package course7;
//新增的任何存储设备都要实现MoblieStorage接口,重写
public class SD implements MoblieStorage{
public void read(){
System.out.println("读取SD卡数据");
}
}
package course7;
public class Tester {
public static void main(String[] args){
PC pc = new PC();
/*
MoblieStorage flash = new FlashDisk();
MoblieStorage mp3 = new MP3();
MoblieStorage mobileDisk = new MobileDisk();
MoblieStorage sd = new SD();
*/
//执行读取U盘数据
pc.setMoblieStorage(new FlashDisk());
pc.read();
//执行读取MP3数据
pc.setMoblieStorage(new MP3());
pc.read();
//执行读取移动硬盘数据
pc.setMoblieStorage(new MobileDisk());
pc.read();
//读取新增的sd设备数据
pc.setMoblieStorage(new SD());
pc.read();
}
}
输出结果:
读取U盘数据
读取MP3数据
读取移动硬盘数据
读取SD卡数据