这样答面试题,好吗?
这样答面试题,好吗?
第一部分:基础知识(面向对象)
1、“类”(Class)和“对象”(Object)的联系和区别?请举例说明。
答:1、联系:
万物皆对象
对象是一个抽象概念,你可以说类是对象,也可以说实例是对象。类是代码,实例是数据,代码是设计期的,数据是运行期的。而对象则贯穿整个设计阶段和运行阶段以及维护阶段。
我们说面向对象(Object-Oriented),而不是面向类(Class-Oriented),也不是面向实例(Instance-Oriented),那是因为对象作为抽象概念已经包含了类和实例,而且对象不止是类和实例,还包含了他们的现实意义。
所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的
举个现实中的例子:
比如建房子;类好比就是图纸,而实例就是房子;
那么问你图纸上画的是什么?当然是“房子”,那么这个抽象的“房子”实际上相当于对象,虽然它并不实实在在存在,这就是对象的抽象意义。根据图纸造好的房子当然也是对象,这就是对象的实际意义
2、区别:
1)、类是对象的抽象;对象是类的具体。
2)、类不占用内存空间,对象占用存储空间。
3)对象可以被创建和销毁,但类是无所不在的。
2、“类”(Class)和“元类”(Metaclass)的联系和区别?请举例说明。
答:(1)联系:因为类是一个对象,它必须是某个另外的类的实例:一个元类.元类是一个类对象的描述,就像类是一个普通对象的描述。,元类就是用来创建这些类(对象)的,元类就是类的类。比如:
MyClass=MetaClass()
MyObject=MyClass()
(2)区别:类是元类的实例,元类是类的模板。也可以把元类称为“类工厂”;
比如:你决定在你的模块里所有的类的属性都应该是大写形式。有好几种方法可以办到,但其中一种就是通过在模块级别设定__metaclass__。采用这种方法, 这个模块中的所有类都会通过这个元类来创建,我们只需要告诉元类把所有的属性都改成大写形式就万事大吉了;
3、什么是“单继承”(Single Inheritance)?有什么特点?
答:单继承指的就是一个类只能继承于一个父类;
特点:在单继承中,每个类可以有多个派生类,但是每个派生类只能有一个基类
4、“抽象类”(Abstract class)和“接口”(Interface)有哪些区别?
答:区别就是
(1)抽象类包含实例方法而接口只包含抽象方法,抽象类可以有方法的实现而接口不行。
(2)抽象类只能继承自一个父类,;而接口可以继承自不止一个接口。
修改版:
答:区别(基于C#):
(1)抽象类表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个接口。
(2)在抽象类中可以有自己的数据成员,也可以有成员方法(非抽象方法),而在接口中,只能够有静态的不能被修改的数据成员(也就是必须是 static final的,不过在接口中一般不定义数据成员),所有的成员方法都是abstract的。
(3)继承抽象类的类需要实现其父类的所有抽象方法,实现接口的类必须实现其中的所有方法。
(4)抽象方法可以有方法的实现,而接口中则不能有实现方法(也就是不能包含方法体)
(5)抽象类包含实例方法而接口只包含抽象方法,抽象类可以有方法的实现而接口不行。
(6)抽象类和接口所反映出的设计理念不同。抽象类表示的是"is-a"关系,interface表示的是"like-a"关系。
(7)抽象类只能继承自一个父类;而接口可以继承自不止一个接口。
(8)接口中定义的变量默认是public static final 型,且必须给其初值,所以实现接口的类中不能重新定义,也不能改变其值。但是抽象类中的变量可以是private或者public类型,在子类中可以重新赋值。
(9)接口中的方法默认都是 public,abstract 类型的。
5、举例说明在你熟悉的程序设计语言中,“多态”(Polymorphism)是如何实现的。
答:多态是面向对象的基本特征之一,其作用体现在:
(1)方法的多态:方法的重写和重载;
(2)类的继承;使用接口;
多态的目的:
通过类型转换,把一个对象当作它的基类对象对待。
从相同的基类派生出来的多个派生类可被当作同一个类型对待,可对这些不同的类型进行同样的处理。
这些不同派生类的对象响应同一个方法时的行为是有所差别的,这正是这些相似的类之间彼此区别的不同之处。
6.什么是“模式”(Pattern)和“设计模式”(Design Pattern)?请举例说明。
答:模式(Pattern)其实就是解决某一类问题的方法论。把解决某类问题的方法总结归纳到理论高度,那就是模式。模式是一种指导,在一个良好的指导下,有助于你完成任务,有助于你作出一个优良的设计方案,达到事半功倍的效果。而且会得到解决问题的最佳办法
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代 码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。
7、在GoF Design Pattern中,有几大类模式?
答:三大类模式,分别为:
(1)创建型模式:Factory模、AbstactFactory模、 Singleton模、Builder模、 Prototype模
(2)结构型模式:Bridge模、Adapter模、 Decorator模、Composite模、Flyweight模、Facade模式.、Proxy模、
(3)行为模式.:Template模式、Strategy模式、 State模式、Observer模式.、Memento模式.、Mediator模式、Command模式、 Visitor模式、Chain of Responsibility模式、Iterator模式、nterpreter模式
8、“抽象工厂”(Abstract Factory)的特点和使用?
答:
(1)特点:抽象工厂提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
(2)在以下情况可以使用抽象工厂模式:
一个系统要独立于它的产品的创建、组合和表示时。
一个系统要由多个产品系列中的一个来配置时。
当你要强调一系列相关的产品对象的设计以便进行联合使用时。
当你提供一个产品类库,而只想显示它们的接口而不是实现时。
9、试述一下MVC模式的结构与特点?
答:(1)结构:MVC 是 模型(Model),视图(View)和控制(Controller)的缩写,其目的实现Web系统的职能分工。其中Model层实现系统中的业务逻辑, 通常可以用JavaBean或EJB来实现; View层用于与用户的交互,通常用JSP来实现; Controller层是Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映 射为模型层可执行的操作。
(2)特点:MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。
关系如下:
10、试述一下架构模式中Layered Application的特点?
答:架构模式中Layered Application比如三层架构的Application分为表示层(UI层)、DAL层和BLL层。UI层包含表示代码、用户交互GUI、数据验证;业务逻辑层(BLL层)包含业务规则处理代码,即程序中与业务 相关专业算法、业务政策;数据持久层(DAL层)包含数据处理代码和数据存储代码。
分层应用程序的特点为:
l 耦合性低
l 重用性高
l 生命周期成本低
l 部署快
l 可维护性高
l 有利软件工程化管理
l 可扩展性强
l 开发规范
11、试述你所熟悉的软件工程过程?
答:软件工程过程的两个方面内涵。
第一,软件工程过程是指为获得软件产品,在软件工具支持下由软件工程师完成的一些列软件工程活动。基于这个方面,软件工程过程通常包含4种基本活动:
1. plan——软件规格说明。规定软件的功能及其运行时的限制。
2. do——软件开发。产生满足规格说明的软件。
3. check——软件确认。确认软件能够满足客户提出的要求。
4. action——软件演进。为满足客户的变更要求,软件必须在使用的过程中演进。
第二,从软件开发的观点看,它就是使用适当的资源(包括人员、硬软件工具、时间等),为开发软件进行的一组开发活动,在过程结束时将输入(用户要求)转化为输出(软件产品)。
所以,软件工程的过程是将软件工程的方法和工具综合起来,以达到合理、及时地进行计算机软件开发的目的。软件工程过程应确定方法使用的顺序、要求交付的文档资料、为保证质量和适应变化所需要的管理、软件开发各个阶段完成的任务。
12、试述在开发阶段,可以通过哪些手段提高最终产品质量?
答:(1)进行全面质量管理思想的教育对全体员工进行全面质量管理思想的教育
1)明白提高质量与降低成本的关系质量提高,不仅不会提高成本,反而会降低成本。
2)树立百分之百合格产品的责任感使百分之百的员工成为抓质量的主人。
(2)、明确顾客需求搞清楚什么样的产品是让用户满意的产品。
(3)、了解市场经常将别的厂商的产品向大家展示,并进行研究,让大家明白别人是怎么做得,我们有何差距。
(4)、让员工明白什么是好的产品给出样板,进行足够的培训,让大家都真正明白什么是好的合格的产品。
(5)、建立明确的质量基准和质量测评制度产品好坏一定要有一个明确公开的标准来衡量。每个人都可以把自己的工作结果与之对照,从而知道自己做得是好是坏。而且这种标准要以一种制度的形式切实付诸实施,才能增加可信度。
(6)、建立相对完善的激励机制如果检测的结果对个人的利益无任何影响,则员工没有尽力提高质量的动力。要在物质和精神方面对员工根 据他们的绩效进行不同的激励。
(7).帮助质量检测部门变成提高质量的催化剂改变质检人员“挑问题者”的角色,消除Tester,QA同开发者之间的隔阂和对立。可以采取三种措施:让质检人员与开发者一起参加有关培训,使他们彼此更好地理解对方的工作。
(8)、建立一套明确一致的解决问题的方法一旦出现问题,大家能够按照此方法去解决问题,而不是互相埋怨或手足无措。 解决问题常用的6步法:讨论并确定问题找出问题的根源提出可能的解决方法选择最佳办法建议、批准和实施测试、评估、调整和庆贺9、在全体员工中培育主人翁 意识和敬业精神如果大家都抱着“公司不是我的,我是来打工的,公司效益好坏、能够存活发展与我无关”,产品质量如何提高,公司如何搞好?
(9)、让员工有一定的自由和权利有了权利,才会有主动性。允许员工提出问题,解决问题,并将解决方案付诸实施。如果什么问题都要Leader来决定,大家只有消极工作和等待。
(10)、建立质量小组质量小组由不同角色的人员组成,负责发现质量问题,讨论解决方法,提出并实施解决方案。
(11)、加强Teamwork的培训培训员工,尤其是Leader如何有效地制定Team'sgoal,如何不断增强这个goal,如何始终围绕这个 goal工作。教给大家如何更好地交流,如何更好地合作,如何在解决问题时对事不对人。
第二部分:分析设计
1、请用你熟悉的程序设计语言实现单链表并遍历
下面使用C#实现:
1 using System; 2 3 //单向链表Node>Node>Node 4 namespace LinkDemo 5 { 6 public class Node 7 { 8 private String name; //保存节点的名字 9 private Node _next; //保存下一个节点 10 11 public Node(string name) 12 { 13 this.name = name; 14 } 15 16 //设置下一个节点 17 public void SetNext(Node next) 18 { 19 this._next = next; 20 } 21 //获取下一个节点 22 public Node GetNext() 23 { 24 return this._next; 25 26 } 27 //获取下一个节点名称 28 public string GetName() 29 { 30 return this.name; 31 } 32 33 } 34 35 public class LinkDemo 36 { 37 38 public static void Main(string[] args) 39 { 40 Node _root = new Node("根节点"); 41 Node _n1 = new Node("第一节车厢"); 42 Node _n2 = new Node("第二节车厢"); 43 Node _n3 = new Node("第三节车厢"); 44 45 //设置节点关系 46 _root.SetNext(_n1);//设置根节点的下一个节点为n1 47 _n1.SetNext(_n2); 48 _n2.SetNext(_n3); 49 Print(_root); 50 Console.ReadLine(); 51 52 } 53 //遍历输出 54 public static void Print(Node _node) 55 { 56 57 if (_node != null) 58 { 59 Console.Write(_node.GetName() + "-->"); 60 61 62 } 63 if (_node.GetNext() != null) 64 { 65 Print(_node.GetNext()); 66 } 67 } 68 69 } 70 71 72 73 }
2、请用你熟悉的程序设计语言语言,实现一下“单体”(Singleton),并注释说明代码是如何保障它实现的。
1 using System; 2 3 namespace ConsoleApplication1 4 { 5 class Singleton 6 { 7 private static Singleton instance;//静态私有成员变量instance 8 9 private Singleton(){ }//一个私有构造函数,确保用户无法通过new直接实例它。 10 11 //Instance方法负责检验并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。 12 public static Singleton Instance()//静态公有方法Instance() 13 { 14 if (instance == null) 15 instance = new Singleton(); 16 return instance; 17 } 18 19 } 20 21 internal class Client 22 { 23 private static void Main(string[] args) 24 { 25 Singleton s1 = Singleton.Instance(); 26 Singleton s2 = Singleton.Instance(); 27 28 if (s1 == s2) 29 Console.WriteLine("The same instance");//保证只有一个实例 30 31 Console.ReadLine(); 32 } 33 } 34 } 35
3、在某计算系统的实现代码中,有如下的代码,其中使用了那些模式,各有什么特点?Runner1的基本功能是打印表达式,Runner2是计算表达式,请根据Client中代码,添加必要的代码,并在对原有代码修改最少的情况下,
实现Runner2(提示:使用堆栈,Variable)。
1 public class Cient 2 { 3 public static void Call() 4 { 5 Node expression = new Mul( 6 new Add(new Literal(99), new Literal(11)), 7 new Div( 8 new Literal(1000), 9 new Sub(“-”, new Variable(“a”), new Variable (“b”))); 10 11 expression.Run(Runner1.Instance); 12 expression.Run(Runner2.Instance); 13 } 14 } 15 16 public interface IRunner 17 { 18 void Run(Literal node); 19 void Run(Variable node); 20 void Run(Add node); 21 void Run(Sub node); 22 23 // TODO: 24 25 26 27 } 28 29 public class Runner1 30 { 31 public static Runner1 Instance = new Runner1(); 32 public void Run(Literal node) { Console.Write(node.Value); } 33 public void Run(Variable node) { Console.Write(node.Text); } 34 35 public void Run(Add node) 36 { 37 Console.Write(“+”); 38 node.Left.Run(this); 39 node.Right.Run(this); 40 } 41 42 public void Run(Sub node) 43 44 { 45 Console.Write(“-”); 46 node.Left.Run(this); 47 node.Right.Run(this); 48 } 49 50 //TODO: 51 52 } 53 54 public class Runner2 55 { 56 public static Runner2 Instance = new Runner2(); 57 58 // TODO: 59 60 } 61 62 public abstract class Node 63 { 64 protected Node(string text) 65 { 66 this.Text = text; 67 } 68 69 public abstract void Run(IRunner runner); 70 } 71 72 public class Literal : Node 73 { 74 public double Value { get ; set; } 75 public Literal (double val) 76 { 77 this.Value = val; 78 } 79 80 public override void Run(IRunner runner) { Runner.Run(this); } 81 } 82 83 public class Variable : Node 84 { 85 public string Name { get ; set; } 86 public double Value { get ; set; } 87 public Variable (string name) 88 { 89 this.Name = name; 90 } 91 92 public override void Run(IRunner runner) { Runner.Run(this); } 93 } 94 95 public abstract class Op : Node 96 { 97 public Node Left { get; set; } 98 public Node Right { get; set; } 99 public Op(Node left, Node right) 100 { 101 this.Left = left; 102 this.Right = right; 103 } 104 105 public override void Run(IRunner runner) { Runner.Run(this); } 106 } 107 108 public class Add : Op 109 { 110 public Add (Node left, Node right) : base(left, right) {} 111 public override void Run(IRunner runner) { Runner.Run(this); } 112 } 113 114 public class Sub : Op 115 { 116 public Add (Node left, Node right) : base(left, right) {} 117 public override void Run(IRunner runner) { Runner.Run(this); } 118 } 119 120 //TODO:
答:这道题目暂时还是完成不了,由于题目中要求修改Client中代码,但是编写时候发现这个代码框架好像缺少的不止Client中代码;自己比较少接触这样的题目,暂时不知道该从何下手~~请前辈赐教~~
4、某电子商务网站,有一个功能需求是“下订单”(Place an Order),客户在线浏览的同时,选择一个或多个“商品”(Product)或“服务”(Service),并确定每种产品或服务的“数量”(Quantity),作为一个“订单”(Order)提交给系统。在订单中,系统统计该订单中所有商品或服务的单价作为“小计”(Subtotal),以及“税”(Tax)后的“总计”(Total)。不同的商品或服务在不同“省”(Province)的“税率”(Tax Rate)是不同的。请使用你熟悉的方法和工具进行分析,分析过程要尽可能清晰完整。如果你可以使用4+1 View描述和分析,请尽量使用。数据库设计请使用UML或ER图。
答:首先分析一下该模块的实现大概流程:
然后数据库表设计:
数据库名:PlaceOrderDB
表名:Orders(订单表)
列名 |
数据类型 |
主键 |
允许空 |
说明 |
Id |
Int(自增) |
是 |
否 |
订单编号 |
OrderDate |
datetime |
|
否 |
订单日期 |
UserId |
int |
|
否 |
用户编号 |
TotalPrice |
decimal |
|
否 |
订单总额 |
OrderStateId |
int |
|
是 |
订单状态 |
表名:OrderStates(订单状态表)
列名 |
数据类型 |
主键 |
允许空 |
说明 |
Id |
Int(自增) |
是 |
否 |
状态编号(1,2,)对应状态名称(未处理,已审核) |
Name |
varchar |
|
否 |
状态名称 |
表名:Product(产品表)
列名 |
数据类型 |
主键 |
允许空 |
说明 |
Id |
int |
是 |
否 |
产品编号 |
PName |
nvarchar |
|
否 |
产品名称 |
UnitPrice |
money |
|
否 |
产品单价 |
Quantity |
int |
|
否 |
产品质量 |
Description |
nvarchar |
|
是 |
产品描述 |
表名:Users(用户表)
列名 |
数据类型 |
主键 |
允许空 |
说明 |
Id |
int |
是 |
否 |
用户编号 |
Name |
nvarchar |
|
否 |
用户姓名 |
Address |
nvarchar |
|
否 |
家庭住址 |
Phone |
nvarchar |
|
否 |
电话 |
|
nvarchar |
|
否 |
邮箱 |
Gender |
int |
|
否 |
性别 |
关系图:
---------------------------------------------------------------------------------------------------------------------------------------------------------------
交流QQ:392989505