昨天,真是郁闷的一天

  

看了三遍不知道说的是什么,又看了三遍才知道什么都没说!


  今天zc说正在看网上的java面试题,说有些题目看不懂是什么,让我帮忙看看……

  zc:“某个类或对象要使用分别在几个类或对象里面的方法或属性时,应该如何处理啊 ?”

  狐狸:“什么?这里面有错字么?或者缺标点么?”

  这句话看上去很别扭,其实仔细看好像也能明白是说的是什么,但是又感觉怪怪的,既然能用更明白的语言说清楚,为什么说这这样呢?我心里很奇怪。

  zc又复制了一遍这句话,看来并不是自己敲上去的,而是从网上复制下来的,也就是说,在信息传播的过程中,并没有改变它的原始信息。既然这样,那就看看吧。

  以狐狸的理解,大概他问的是,一个类的编写过程中,如果要使用其他的类或者对象的方法或者属性,这个时候应该如何处理?我当时想,这个问题是在问什么呢?难道是在问设计模式的问题?我前段看设计模式看多了,估计得了模式综合症了,什么都往模式上靠。但是又实在想不出来这个和哪个模式靠的比较近。就问了一句zc。

  狐狸:“这句话问的是什么?没有别的话了么?你把原题都给我复制过来,我看看。”

  这个时候我突然意识到,我的思路完全不对,试问,一般的情况下,哪个类不是在使用其他类的方法和属性呢?这个问题实在是问的没什么意义,如果但就这一句话来说,实在是无法回答。

  这时候zc又复制了下面的话。

  zc:“Java的接口和C++的虚类的相同和不同处

  答:由于Java不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性,现有的单继承机制就不能满足要求。与继承相比,接口有更高的灵活性,因为接口中没有任何实现代码。当一个类实现了接口以后,该类要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下面都是public static,所有方法默认情况下是public.一个类可以实现多个接口。”

  这个时候我才意识到,他问的问题是关于java怎么处理可能所谓的多重继承的问题。zc说看不懂上面的这句话说的是什么,不理解所以记不住,看了答案还是不明白。

  我觉得这个问题看不明白一点都不奇怪,我和他深有同感,呵呵Great minds think alike!而且我感觉不知道哪个仁兄给出的标准答案,在我看来tmd简直一点都不靠谱。而我常常参加的莫名其妙的面试题中常常充斥着这样二百五的问题,估计他们的标准答案也是如此的二百五。我不能一一列举出此类题目,但就这一个题目,我想指出一些我的观点。

  “与继承相比,接口有更高的灵活性,因为接口中没有任何实现代码。”这句话的理由充分么?我先不论接口是不是具有灵活性,而是我感觉,这个理由是万万靠不住的。啥叫因为接口中没有任何代码实现?这是灵活性的体现?晕菜。写这句话的,大脑是浆糊做的。算了,我也不一一的说个白痴的回答到底是如何的白痴了。只是表达一下自己的观点吧。

  “Java的接口和C++的虚类的相同和不同处”首先我们先看看这个题目就是很欠扁的。我最讨厌别人拿两个其实比较起来毫无意义的东西来比较了。用王菲式的回答那就是“从语言到名称都不同!”哈哈。

  为什么要用一种语言去比较另一种语言,其实用java的抽象类和java的接口来比一下不是更好么?哦,可能出题者认为,一个新的类继承c++的虚类和或者实现java的接口都是具有一对多的关系的,所以要用c++的虚类来类比java的接口。
  
  如果这个答案是出题者给出的,这人就太欠扁了。现在我们假定出题者和提供答案的人不是一个人。

  其实我认为,c++的虚类和java的接口都有其适用的场合,在某种特别的环境下,比如,一个类,只需要继承一个类,而这个类是个抽象类,里面的每个方法都是抽象的。而且里面的每个属性都是静态的。我们写这样的一个类的时候,把它的上级类写成接口,或者写成抽象类,到底有什么区别呢?在我看来,这两者的效果是一样的。

1# MyAbstractClass.java


public abstract class MyAbstractClass {

  public static String myProperty1;

  public static String myProperty2;

  abstract public void myMethod1();

  abstract public void myMethod2();
}


2# MyInterface.java


public interface MyInterface {

  String myProperty1 = null;

  String myProperty2 = null;

  void myMethod1();

  void myMethod2();
}


3# MyConcreteClass1.java


public class MyConcreteClass1 extends MyAbstractClass {

  public void myMethod1() {
    System.out.println("MyConcreteClass1 myMethod1");
  }

  public void myMethod2() {
    System.out.println("MyConcreteClass1 myMethod2");
  }

}


4# MyConcreteClass2.java


public class MyConcreteClass2 implements MyInterface {

  public void myMethod1() {
    System.out.println("MyConcreteClass2 myMethod1");
  }

  public void myMethod2() {
    System.out.println("MyConcreteClass2 myMethod2");
  }

}


  对于多重继承的,确实是java所不具备的,而在我感觉,确实多重继承是有好处的,而并不像某些java书籍所宣扬的单根继承比多重继承要优秀。在我看来,不具备就是不具备,根本没有必要把自己不具备的别人的优点应要说成自己的优点,那是一种阿Q精神。

  不过,我是喜欢java的,所以我觉得这一点也根本算不得什么致命的弱点,条条大路通罗马,我们自然会有别的方式去应对各种需求,如果说“存在的就是合理的”,那么“不存在的也有不存在的合理性”。java中一个类确实可以实现n多个接口,但是我们却不能是这些接口的属性变成对象的属性,因为它们是static是,它们是类属性!!!如果我们需要对象属性的时候,我们无法通过实现接口来获得。而在c++中,分布在多个虚类中的对象属性确实是可以通过多重继承来获得的。这时候使用java的我们怎么办?very easy,写在自己的具体类中就可以了,如果不能从上级那里获得遗传,那我们就生出自己的对象属性来吧!

  java接口存在的意义,是为了满足不同场合的需要。比如java的某个设计原则“要面向接口编程,而不是面向实现编程。”可是我觉得c++也同样可以“面向虚类编程,不是面向具类编程”来满足这个原则。(本人对c++一点不会,瞎说而已,呵呵)。存在是为了自身的需要,而不是为了和他人的比较。
标签: | edit post
0 Responses