C++面试题

来源:互联网 发布:q宠大乐斗代玩软件 编辑:程序博客网 时间:2024/05/17 02:57


一、

5%2-5%25%-2-5%-2 输出是什么?   答案:  

 

二、

 A、抽象方法和抽象类有什么区别,什么时候用抽象类。

答:有抽象方法的类一定是抽象类,但抽象类中不一定有抽象方法;

当某个类中的某个方法提供给外部使用时,我又不希望他知道我内部还有那些方法的时候用抽象类。

B、什么时候使用抽象类什么时候使用接口

百度答案:

//第一种答案

共同点是他们都可以实现多态。

不同点在于设计抽象类和接口的目的和使用方式有所不同,抽象类是为继承而精心设计的,接口则更多以组合的方式使用。

 

如果你的业务中可以抽象出一个通用的处理过程,只是某些局部传递的状态或参数有所不同,这时可以考虑使用抽象类。否则在一般的情况下,优先使用接口和组合的形式,这样使代码之间的耦合度降低。

 

一个比较典型的抽象类使用范例是模板模式,当然也有使用组合来实现的模板。另一个使用抽象类的情形,比如很多场合下特别是对一个声明了相当数量方法的接口,提供一个类似模板的默认实现类是很有好处的,比如spring提供的一些template,dom4j提供的VisitorSupport等。甚至在effective java里已经将这种方式提倡成一种最佳实践

 

//第二种答案:

接口和抽象类的区别知道了,但实际应用中,到底如何选择呢?
其区别:
1:一个类可以实现任意多的接口,但是最多只能对一个抽象类进行子类化。
2:一个抽象类可以包括非抽象方法,而一个接口的所有方法在效果上都是抽象的。
3:一个抽象类可以申明并使用变量,而一个接口不行。
4:一个抽象类中的方法的访问修饰符可以使 public,internal,protected,protected internal,private,而接口成员的访问修饰符在默认情况下都是 public,而且,在申明接口成员时,不允许使用访问修饰符(甚至不能使用public)。
5:一个抽象类可以定义构造函数,而一个接口不行。 

三、

什么是多态?

比如有一个父类superClass,它有2个子类subClass1,subClass2。superClass有一个方法

func(),两个子类都重写了这个方法。那么我们可以定义一个superClass的引用obj,让它指向一个子类的对象,比如superClass obj = new subClass1();那么我们调用obj.func()方法时候,会进行动态绑定,也就是obj它的实际类型的func()方法,即subClass1的func()方法。同样你写superClass obj = new subClass2();obj.func()其实调用的是subClass2的func()方法。这种由于子类重写父类方法,然后用父类引用指向子类对象,调用方法时候会进行动态绑定,这就是多态。多态对程序的扩展具有非常大的作用,比如你要再有一个subClass3,你需要改动的东西会少很多,要是使用了配置文件那就可以不动源代码了。

 

因为多态的定义:事物存在的多种表现形态;而后,有人将重载(overload)、改写(override)、多态变量和泛型归结于同一个术语“多态”之下。

 

多态可以分为变量的多态,方法的多态,类的多态.我这里强调的是类的多态,这是我们在以后的工作中经常回用到的

 

首先,有这样一个系统:有个学生工作从达内毕业了,作的还不错.买了辆捷达汽车.这个系统应该如何设计呢?

按照OO的思想,我们会抽象出来一个类,表示捷达汽车,其中有个run()方法

public class JD{

public void run(){

       System.out.println("JD在以120迈的速度在run");

}

}

我们还会抽象出一个类,来代表人.其中有个drive()方法,需要一个汽车类型作为参数,我们先传入一个JD类型的参数

 

// 这是我们的核心业务类

public class Person{

public void drive(JD jd){

       jd.run();

}

 

public static void main(String args[]){

   Person p =new Person();

   JD jd = new JD();

   p.drive(jd);

}

}

 

如果你写出这样的代码的话,恭喜你!你中大奖了!---------------------你会被项目精力砍死的!!!!!!!

 

项目经理为什么会砍你呢?

因为你写的代码偶合性太强了!

 

如果我们的需求变了,这个学生后来更有钱了,买了一两Benz.那么我们以前的系统怎么办啊.不要指望你作的系统永远不会变化

我们的系统只能修改!这就是项目经理砍你的原因

我们的系统会增加一个Benz类,也有个run()方法

 

public class Benz{

public void run(){

       System.out.println("Benz在以200迈的速度在run");

}

}

 

我们的核心业务类也要修改

 

public class Person{

 

    /*

public void drive(JD jd){

       jd.run();

}

*/

 

public void drive(Benz b){

       b.run();

}

 

public static void main(String args[]){

   Person p =new Person();

   Benz b = new Benz();

   p.drive(b);

}

}

 

以后的情况,我们可以把车抽象出来:

public abstract class Driver{

   /*属性*/

   public void run();//让子类来运行

}

 

public Benz extends Driver{

   public void run(){

System.out.println("Benz在以200迈的速度在run");

   }

}

public JD extends Driver{

   public void run(){

System.out.println("JD is running...");

   }

}

 

public class Person{

private Driver driver;

public Person(){

 

}

public Person(Driver driver){

   this.driver = driver;

}

public void drive(){

       driver.run();

}

public void setDriver(Driver driver){//运用参数多态,以后不管买什么车都可以

   this.driver = driver;

}

 

 

public static void main(String args[]){

   Person p =new Person();

   JD jd = new JD();//刚开始没钱就买辆JD吧

   p.setDriver(jd);

   p.driver();

   Benz benz = new Benz{();//有钱换车了

   p.setDriver(benz);

   p.driver();

}

}

 

什么是多态? 

简单的说:就是用基类的引用指向之类的对象

 

提问:多态可以用在什么地方呢?

回答:可以用在方法的参数中和方法的返回类型中

 

其中方法的参数楼上的兄弟已经给出了代码.我这里给出在方法的返回类型中如何使用多态

 

上面的例子中,不管是JD还是Benz都是我们自己直接new出来的.我们可以设计一个工厂类,专门生成汽车

 

/**

*   我们将多态使用在方法的返回类型中

*   Car可以是抽象类,也可以是接口,JD和Benz分别继承该类或实现该借口

*/

public class CarFactory{

public Car factory(String carName){

   if(carName.equals("JD")){

      return new JD();

   }else if(carName.equals("Benz")){

      return new Benz();

   }else{

      System.out.println("对比起,不伺候");

      return null;

   }

}

}

 

这实际上就是设计模式中的简单工厂模式!

 

另外,我我们在JDK中可以大量的看到多态的应用,比如在Object类中的equals(Object obj)方法中,参数是个Object

 

类型的参数.因为Object是Java中所有类的基类.,但是才传入参数的时候,可以传入任何一个类的对象

这就是多态的应用!

 

四、什么是面向对象?

0 0