这样答面试题,好吗?

 这样答面试题,好吗?

第一部分:基础知识(面向对象)


1Class)和对象Object)的联系和区别?请举例说明。

答:1联系:

万物皆对象

对象是一个抽象概念,你可以说类是对象,也可以说实例是对象。类是代码,实例是数据,代码是设计期的,数据是运行期的。而对象则贯穿整个设计阶段和运行阶段以及维护阶段。

我们说面向对象(Object-Oriented),而不是面向类(Class-Oriented),也不是面向实例(Instance-Oriented),那是因为对象作为抽象概念已经包含了类和实例,而且对象不止是类和实例,还包含了他们的现实意义。

所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的

举个现实中的例子:

比如建房子;类好比就是图纸,而实例就是房子;

那么问你图纸上画的是什么?当然是房子,那么这个抽象的房子实际上相当于对象,虽然它并不实实在在存在,这就是对象的抽象意义。根据图纸造好的房子当然也是对象,这就是对象的实际意义

2、区别:

1)、类是对象的抽象;对象是类的具体。
2)、类不占用内存空间,对象占用存储空间。

3对象可以被创建和销毁,但类是无所不在的。

 
2Class)和元类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)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代 码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。

 

7GoF 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层实现系统中的业务逻辑, 通常可以用JavaBeanEJB来实现; View层用于与用户的交互,通常用JSP来实现; Controller层是ModelView之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映 射为模型层可执行的操作。

(2)特点:MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务

关系如下:

这样答面试题,好吗?_第1张图片

 

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).帮助质量检测部门变成提高质量的催化剂改变质检人员挑问题者的角色,消除TesterQA同开发者之间的隔阂和对立。可以采取三种措施:让质检人员与开发者一起参加有关培训,使他们彼此更好地理解对方的工作。

 (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描述和分析,请尽量使用。数据库设计请使用UMLER图。

 答:首先分析一下该模块的实现大概流程:

这样答面试题,好吗?_第2张图片

然后数据库表设计:

数据库名: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

 

 电话

Mail

nvarchar

 

 邮箱

Gender

int

 

 性别

关系图:

这样答面试题,好吗?_第3张图片

 

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 交流QQ:392989505

你可能感兴趣的:(面试题)