比如过来一个人,你要判断他是教师还是工人,当然是先假定他是教师或者工人,然后用教师或者工人的标准去判断了。  
       而教师或者工人的标准,当然是在教师或者工人这个类中,而不该在人这个类中啊,要知道人的分法有很多种,不可能都在人这个父类中预先做好判断的啊!  
 
  java的这一改变,完全就破坏了面向对象的自然规则,弱化了语言的功能。  
    
       恼火死,想给有很多成员的javabean做个适配器,来适用特殊应用场合,结果遇上java的这一特性。难道得自己在适配器里把那么多成员方法一一实现么?!

解决方案 »

  1.   

    不知道你是真不理解呢,还是装的。
    不知道你所说的类是不是对象?
    类和对象完全是两个概念。给你说个小例子吧。
    Object o1 = new Object();
    String o2;
    在上面这种情况下,Object 是String的父类,按你说的,如果进行下列转换:
    o2 = (String)o1;
    这是错误的,因为o1本身是Object类的对象,没有String类的特性。我不知道这种
    对象转换过去后会有什么用,只会出一个什么也不是的结果,而这些在C++中是可以的。第二个:
    Object o1 = new String("abc");
    String o2 = new String("124");
    对于这种情况,大家知道,o1和o2从引用类型上看,是两种类型,而从本质上看,他们
    都是String类型的对象,所以,如果进行如下转换:
    o2 = (String)o1;
    这在java中是完全充许的,而这样的转换在实际应用中也是经常用到的。java并没有限制什么。我承认,在有些语法上,功能上,java是比C++限制的更多了一些,但是这些限制本身都是有目的
    的,比如说,为了提高程序的安全性,java中不可以对内存地址真接操作。而这些也恰恰是java的特性。
    再一个,不要拿C++和java作比较,他们适用的地方是不一样的,各自有各自的领域,不能说谁好谁坏的。
      

  2.   

    楼上说得对,JAVA中无法把一个父类型转换成一个子类型,因为子类里添加了什么新方法和域,父类根本无法知道,这种转换非常危险,而且不确定性,反过来,子类型可以当作父类型用,前提是损失子类型的一些自有特性,这个是大范围转换成小范围,这个是安全的确定的,这个在JAVA中被允许。JAVA这样设计大概是想去掉一些出错的可能性吧,在C++中可以这样作,也许凭借程序员个人的能力可以避免出错,但这同时也增加了语言的出错几率以及复杂性
      

  3.   

    向上转型和向下转型的问题
    难道C++允许向下转吗?不明白简单一个instanceof 就可以了
      

  4.   

    呵呵,好像lz对java不太了解啊。
      

  5.   

    java是纯面向对象,所以很差劲,建议LZ用汇编
      

  6.   

    楼主怎么用JAVA这么差劲的语言啊,建议楼主用0101010101
      

  7.   

    一看就知道楼主没有学过java的
      

  8.   

    恼火死,想给有很多成员的javabean做个适配器,来适用特殊应用场合,结果遇上java的这一特性。难道得自己在适配器里把那么多成员方法一一实现么?!
    ---------------------------------------------------
    您可以先做个抽象类,然后在抽象类里面做个空的实现
    这样就不必再实现每一个方法了
      

  9.   

    晕死
    楼主先搞清楚JAVA的基本概念再说吧
    要不然,自己发明一种语言,想怎么来就怎么来
    否则,用别人的语言就要遵守别人的规范
      

  10.   

    我觉得JAVA对于客观世界的抽象还是合理的,我是这么认为的,C++是从语法级分析世界,java是从对象级(也就是客观世界的眼光)分析世界,我觉得这是很好的做法.个人意见
      

  11.   

    public class People { public static void main(String[] args){
    Person oneperson;
    oneperson=new PersonA();
    if (oneperson instanceof Worker)
    {
    ((Worker)oneperson).working();
    }else
    {
    System.out.print("i am not a worker");
    }
    oneperson=new PersonC();
    if (oneperson instanceof Worker)
    {
    ((Worker)oneperson).working();
    }else if (oneperson instanceof Teacher)
    {
    System.out.print("i am not a teacher");
    }
    }
    }
    class Person{
    public void eat()
    {
    System.out.print("i can eat");
    }
    }
    interface Worker{
    public void working();
    }
    interface Teacher{
    public void teaching();
    }
    class PersonA
    extends Person
    implements Worker{ public void working() {
    System.out.print("i am a worker do my working");

    }

    }class PersonB extends Person implements Teacher { public void teaching() {
    System.out.print("i am a teacher do my teaching");

    }}class PersonC extends Person implements Teacher,Worker{ public void teaching() {
    System.out.print("i am a teacher do my teaching");

    } public void working() {
    System.out.print("i am a worker do my working");

    }

    }
      

  12.   

    怎么会呢,JAVA可以强制啊,只不过允许它报错
      

  13.   

    过来的这个人,他其实已经是一个对象了!  
    你可以把这个对象用instanceof分被跟工人和老师比较,哪一个类别的比较中得到true,就是说明这个人是这个类别的!
    如一楼所说:
    ---------------------------------------
    Object o1 = new String("abc");
    String o2 = new String("124");
    对于这种情况,大家知道,o1和o2从引用类型上看,是两种类型,而从本质上看,他们
    都是String类型的对象,所以,如果进行如下转换:
    o2 = (String)o1;
    这在java中是完全充许的,而这样的转换在实际应用中也是经常用到的。java并没有限制什么。
    ------------------------------------------
    java的这种做法是很有作用的!