
1.抽象类与抽象方法
2.接口
3.接口的注意事项
4.抽象类VS接口
5.面向对象设计原则
1、抽象类与抽象方法1.1语法
1.2抽象类VS普通类
-
抽象类不能被实例化
-
但是可以创建一个引用变量,其类型是一个抽象类,指向非抽象的子类实例
-
-
普通类可以被实例化
1.3抽象方法VS普通方法
-
有无方法体
1.4抽象类与抽象方法的使用
-
抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类。
-
如果子类没有实现父类的抽象方法,子类必须被定义为抽象类
-
没有抽象构造方法,也没有抽象静态方法
-
抽象类中可以有非抽象的构造方法,创建子类实力时可调用
2.1语法
2.2接口特性
-
常作为类型使用
-
接口不可以被实例化
-
实现类必须实现接口的所有方法
-
实现类可以实现多个接口
-
implements ,多个接口使用逗号隔开
-
-
接口中的变量都是静态常亮(public static final)
2.3示例:认识接口
-
"锁"接口
public interface Lock{
// 属性(成员),接口属性用的很少
// 接口属性默认静态常亮
// public static final String name = "老王"
String name = "老王";
// public abstract void onLock();
void onLock();
void unLock();
}
-
"防风"接口
public interface Defend{
void defend();
}
-
"窗口"类
public class Window implements Lock,Defend{
@Override
public void onLock(){
System.out.println("窗户上锁")
}
@Override
public void unLock(){
System.out.println("窗户解锁")
}
@Override
public void defend(){
System.out.println("窗户防风")
}
}
-
测试类
public class Test{
public static void main(String[] args){
// 让程序更好去使用多态
// 找到一个有上锁能力的对象
Lock lock = new Window();
lock.onLock();
}
}
2.4 接口表示一种能力
-
"做这项工作需要一个钳工(木工/程序员)"
-
钳工是一种能力,不管是这个人是谁
-
-
接口是一种能力
-
体现在接口的方法上
-
-
面向接口编程
-
程序设计时
-
关心实现类有何能力,而不关心细节
-
面向接口的约定而不考虑接口的具体实现
-
-
2.5 示例:防盗门
面向接口编程描述防盗门。防盗门是一个门。is a 的关系;防盗门有一个"锁"的能力has a 的关系
-
"门"抽象类
public abstract class Door{ // 门的特征 public abstract void open(); public abstract void close(); } -
防盗门类
public class TheftproofDoor extends Door implements Lock{ // 继承门的能力 @Override public void open(){ System.out.println("防盗门打开了") } @Override public void close(){ System.out.println("防盗门关闭了") } @Override public void onLock(){ System.out.println("防盗门上锁") } @Override public void unLock(){ System.out.println("防盗门解锁") } } -
测试类
public class Test{ public static void main(String[] args){ // 程序里需要一个带锁的对象 // 假如某一天,防盗门、窗口的锁功能不能满足实现的需求(功能升级) // 升级为手机解锁的能力 // 使用接口不影响原来的继承关系,也可以实现多继承功能 Lock lock = new TheftproofDoor(); lock.onLock(); } }
2.6 接口是一种约定
-
接口是一种约定,有些接口只有名称
-
面向接口编程,程序设计时面向接口的约定而不考虑具体实现
2.7 示例:打印机
-
使用面向接口编程,描述打印机
public interface InkBox{
String getColor();
}
-
彩色墨盒类
public class ColorInkBox implements InkBox {
@Override
public String getColor() {
return "彩色";
}
}
-
黑白墨盒类
public class GrayInkBox implements InkBox {
@Override
public String getColor() {
return "黑白";
}
}
-
纸张接口
public interface Paper{
String getSize();
}
-
A4纸张类
public class A4Paper implelement Paper{
@Override
public String getSize(){
return "A4"
}
}
-
A3纸张类
public class A3Paper implelement Paper{
@Override
public String getSize(){
return "A3"
}
}
-
打印机类
public class Printer{
// 不确定墨盒和纸张的厂商,只要符合打印机的墨盒和纸张的"规格"就打印
// 约定"规格"
// 墨盒定义为接口
private InkBox inkBox;
// 纸张定义为接口
Private Paper paper;
public InkBox getInkBox(){
return InkBox;
}
public void setInkBox(InkBox inkBox){
this.inkBox = inkBox;
}
public Paper getPaper(){
return paper;
}
public void setPaper(Paper paper){
this.paper = paper;
}
// 打印方法
public void print(){
System.out.println("打印的颜色为:"+inkBox.getColor() + ",打印纸张的大小为:"+paper.getSize())
}
}
-
测试类
public class Test{
public static void main(String[] args){
Printer printer = new Printer();
// 打印前先要有纸张和墨盒
printer.setInkBox(new GrayInkBox)
printer.setPaper(new A4Paper)
printer.print();
}
}
3.接口的注意事项
-
接口中的成员变量
-
默认都是public static final 的,必须显示初始化;
-
-
接口中的方法
-
默认都是public abstract 的;
-
-
接口没有构造方法,不能被实例化
-
一个接口不能实现另一个接口,但可以继承其他多个接口
-
一个类必须实现接口的所有抽象方法,除非这个类是抽象类
4.抽象类vs接口
-
相同点
-
代表系统的抽象层
-
都不能被实例化
-
都包含抽象方法
-
用于描述系统提供的服务,不必提供具体实现
-
-
-
不同点
-
在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法
-
抽象类便于复用,接口便于代码维护
-
-
一个类只能继承一个父类,但可以实现多个接口
-
-
使用原则
-
接口做系统与外界交互的窗口
-
接口提供服务
-
-
接口本身一旦制定,就不能随意更改
-
抽象类可以完成部分功能的实现,还有部分功能可作为系统的扩展点
-
5.面向对象设计原则
-
多用组合,少用继承
-
针对接口编程
-
针对扩展开放,战队改变关闭
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)