接口和抽象类

1.适配器的使用

如果定义了一个接口,则它的子类要实现他全部的抽象方法。但是我们可以通过适配器来实现。这里用到了一个abstract来实现。

interface  Window{
	public void open();
	public void close();
	public void icon();
	public void unicon();
}
class MyWindow implements Window{

	@Override
	public void open() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void close() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void icon() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void unicon() {
		// TODO Auto-generated method stub
		
	}
	
}
public class AdpaterDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

像以上的实现要覆写全部的抽象方法,但是现在希望可以根据自己的需要来选择性的覆写,这个时候我们就要借助一个中间变量来实现,这个中间的变量就是抽象类。用一个抽象类先将接口实现了,但是实现的话都属于空实现,之后再继承此类。

因为抽象类的方法也不能直接使用,必须覆写。

interface  Window{
	public void open();
	public void close();
	public void icon();
	public void unicon();
}

abstract class WindowAdpater implements Window{
    public void open(){}
	public void close(){}
	public void icon(){}
	public void unicon(){}
};
class MyWindow extends WindowAdpater{
	public void open(){
		System.out.println("打开窗口");
	}
}
public class AdpaterDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
         Window win = new MyWindow();
         win.open();
	}

}

2.工厂设计模式

看下面这段代码:
interface HomeWork{
	public void write();
}
class math implements HomeWork{
	public void write(){
		System.out.println("写数学作业。");
	}
};
class English implements HomeWork{
	public void write(){
		System.out.println("写英语作业。");
	}
};
public class InterDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
       HomeWork hm1 = new math();
       hm1.write();
       HomeWork hm2 = new English();
       hm2.write();
	}

}
他设计的并不好,因为他需要对main()函数中做大的修改,在这里我们应该把主方法看做一个客户端。客户端的代码要越简单越好。这样的设计不好耦合性太高了
所以现在我们将对他做如下的修改:
interface HomeWork{
	public void write();
}
class math implements HomeWork{
	public void write(){
		System.out.println("写数学作业。");
	}
};
class English implements HomeWork{
	public void write(){
		System.out.println("写英语作业。");
	}
};
class Factory {
	public static HomeWork getFruit(String className){
		HomeWork hm =null;
		if("math".equals(className)){
			hm = new math();
		}
		if("English".equals(className)){
			hm = new English();
		}
		return hm;
	}
};
public class InterDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
     HomeWork hm = Factory.getFruit(args[0]);
     if(hm!=null){
    	 hm.write();
     }
	}

}


3.抽象类和接口的区别

No

比较点

抽象类

接口

1

组成

抽象方法,普通方法,常量,变量,构造方法,全局常量

抽象方法,全局常量

2

定义

Abstract

interface

3

子类

子类通过extends继承抽象类

子类通过implements实现接口

4

限制

一个子类只能继承一个抽象方法

一个子类可以同时实现多个接口

 

5

 

关系

一个抽象类可以实现多个接口

一个接口不能继承一个抽象类,可以实现多个接口

一个抽象类中允许包含一个接口

一个接口允许包含一个抽象类

  6

设计模式

模板设计

工厂设计、代理设计

都是通过对象的多态性,都是通过子类进行实例化实现操作

7

实现限制

存在单继承限制

不存在此种限制

从以上可以看出,两者做选择是优先选择接口




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值