前不久参加了一个公司的面试,然后面试官问到了一个问题:如何理解java中的面向对象思想?
当时突然有点紧张,因为确实答不出来,就直接用Java中的集合框架拿出来展开了。因为框架的设计的很多,体现了面向对象编程的一面。
当时核心的问题问到了,为什么要采用面向接口编程这种模式? 因为其他的集合实现类都是继承自一个Collection借口,此借口中有一个方法叫做iterator(),返回一个Iterator对象,使用对象的hasNext() , next()方法来遍历集合中的元素,所有实现类都实现了这个方法。
下面来看2个程序的区别,这里就不用集合类来演示了。
程序一:
package com.OOD;
public class OOD {
public static void main(String[] args) {
toCall(new A());
toCall(new B());
toCall(new C());
}
public static void toCall(Object o) {
if(o instanceof A) {
A a = new A();
a = (A)o;
a.call();
}else if(o instanceof B) {
B b = new B();
b = (B)o;
b.call();
}else if(o instanceof C) {
C c = new C();
c = (C)o;
c.call();
}
}
}
class A {
public void call() {
System.out.println("Call A");
}
}
class B {
public void call() {
System.out.println("Call B");
}
}
class C {
public void call() {
System.out.println("Call C");
}
}
该程序有3个类:A,B,C
他们内部都有自己的call()方法,而这3个类没有一点联系,除了他们都继承自Object类。
在OOD类里面有一个方法,是用统一的一个toCall方法,调用传入的参数自己的call方法。
由于这3个类的联系仅仅只是都继承了Object,所以参数可以设置为一个Object类型,来接收不一样类型的对象。
当接受到一个对象时,首先先要判断这个对象是哪个类的实例,然后强制转换之后,才能正确的调用call方法(因为Object没有call这个方法,o是一个Object的引用)。虽然可以暂时解决问题,但是从设计的角度上来说,如果有新的类加入了,比如D类,那么需要在OOD的toCall方法中加以修改才能正确运行。
再看另一种方法,这些类都实现一个接口。
package com.OOD;
public class OOD {
public static void main(String[] args) {
toCall(new A());
toCall(new B());
toCall(new C());
}
public static void toCall(Father f) {
f.call();
}
}
class A implements Father {
public void call() {
System.out.println("Call A");
}
}
class B implements Father {
public void call() {
System.out.println("Call B");
}
}
class C implements Father {
public void call() {
System.out.println("Call C");
}
}
interface Father {
public void call();
}
这些类现在的共同点是都实现了一个叫做Father的接口,并且重写了call方法。
现在看看toCall方法,参数由原来的Object类型变成了Father类型,传进来的都是一个Father引用,我不用关心这个实例具体指的是哪个对象,他是一种Father,他就带有一个call方法。所以直接在代码里面写上f.call()方法 就可以达到要求了。而当有新的类来时,只要实现Father接口,重写call方法,toCall方法的代码就不需要改了。这样的设计,比起上面的例子,是不是好了很多呢?
分享到:
相关推荐
国外计算机科学经典教材-面向对象分析与设计(UML 2.0版) 简介:本书详细介绍了面向对象的分析与设计,全面探讨了面向对象概念、软件开发过程、UML和多层技术。 本书使用最常见的技术和方法,通过一个贯穿全书的...
Javascript面向对象设计一 工厂模式.docx
用面向对象设计的方法,设计一个圆的类,包括计算圆的直径、圆的周长和圆的面积的方法。 【问题描述】 用面向对象设计的方法,设计一个圆的类,包括计算圆的直径、圆的周长和圆的面积的方法。 【基本要求】 采用...
《面向对象分析与设计(第3版)》是UML创始人Grady Booch的代表作之一,书中介绍的概念都基于牢固的理论基础。同时,《面向对象分析与设计(第3版)》又是一本注重实效的书,面向架构师和软件开发者等软件工程实践者的...
C#面向对象设计模式纵横谈 12种设计模式 一本不可多得的详解设计模式书籍。
作为一名软件开发人员,我深刻地体会到面向对象系统设计带来的种种便 : 1、 良好的可复用性。开发同类项目的次数与开发新项目的时间成反 比,谁也不愿做重复劳动吧 J 。 2、 易维护。基本上不用花太大的精力跟...
面向对象设计的基本原则 132 第三单元:用UML辅助系统分析与设计 177 UML简介及常见疑难问题辨析 178 借鉴RUP的UML建模与分析 213 第四单元:设计模式与软件设计思想 267 设计模式 268 常用的软件架构风格及适用情况...
详细介绍了面向对象的分析与设计,全面探讨了面向对象概念、软件开发过程、UML和多层技术。本书使用最常见的技术和方法,通过一个贯穿全书的案例分析,对面向对象的软件开发过程和使用面向对象技术的编程过程进行了...
《C#面向对象程序设计》源代码。本书以面向对象的软件工程思想为主线...全书提供了丰富的示例代码和课后习题,并通过一个贯穿全书的“旅行社管理系统”案例展现了如何运用C#语言和面向对象技术来进行实际软件系统开发。
Python实验一 面向对象程序设计实验
《面向对象程序设计JAVA语言程序设计》《面向对象程序设计JAVA语言程序设计》《面向对象程序设计JAVA语言程序设计》《面向对象程序设计JAVA语言程序设计》《面向对象程序设计JAVA语言程序设计》
面向对象程序设计将数据和操作封装在一起,程序是由一个个对象组成的,对象之间通过接口进行通信,能够较好地支持程序代码的复用。 2.面向对象程序设计语言有四个特征: ⑴ 抽象性 ---- 许多实体的共性产生类。 ⑵ ...
面向对象设计程序员必读,c++初学者适合一看,各有启迪
很好的一套面向对象程序设计C++期末考试,适合于大学程序设计的各种考试复习
面向对象程序设计课程设计java设计一个计算器.pdf面向对象程序设计课程设计java设计一个计算器.pdf面向对象程序设计课程设计java设计一个计算器.pdf面向对象程序设计课程设计java设计一个计算器.pdf面向对象程序设计...
北交大面向对象设计第一次离线作业下载
面向对象程序设计课程设计java设计一个计算器.docx面向对象程序设计课程设计java设计一个计算器.docx面向对象程序设计课程设计java设计一个计算器.docx面向对象程序设计课程设计java设计一个计算器.docx面向对象程序...
全面系统的学习面向对象程序设计的基本概念、基本语法和编程方法。正确理解掌握C++面向对象程序设计的基本特性:类、对象、继承与派生、多态、虚函数、模板、流类库等。遵循软件过程的各个环节进行系统分析、设计、...
《Java与UML面向对象程序设计》旨在介绍使用Java和UML开发面向对象的软件所必需的知识,并将伴您走上使用Java进行真正面向对象软件开发的道路。《Java与UML面向对象程序设计》共分12章。《Java与UML面向对象程序设计...
面向对象程序设计形成性考核册答案