站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题java太差劲,居然不能将父类强制为子类!

java太差劲,居然不能将父类强制为子类!

摘要: java太差劲,居然不能将父类强制为子类!


比如过来一个人,你要判断他是教师还是工人,当然是先假定他是教师或者工人,然后用教师或者工人的标准去判断了。
而教师或者工人的标准,当然是在教师或者工人这个类中,而不该在人这个类中啊,要知道人的分法有很多种,不可能都在人这个父类中预先做好判断的啊!

  java的这一改变,完全就破坏了面向对象的自然规则,弱化了语言的功能。
  
恼火死,想给有很多成员的javabean做个适配器,来适用特殊应用场合,结果遇上java的这一特性。难道得自己在适配器里把那么多成员方法一一实现么?!


不知道你是真不理解呢,还是装的。
不知道你所说的类是不是对象?
类和对象完全是两个概念。给你说个小例子吧。
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作比较,他们适用的地方是不一样的,各自有各自的领域,不能说谁好谁坏的。



instance of


楼上说得对,JAVA中无法把一个父类型转换成一个子类型,因为子类里添加了什么新方法和域,父类根本无法知道,这种转换非常危险,而且不确定性,反过来,子类型可以当作父类型用,前提是损失子类型的一些自有特性,这个是大范围转换成小范围,这个是安全的确定的,这个在JAVA中被允许。

JAVA这样设计大概是想去掉一些出错的可能性吧,在C++中可以这样作,也许凭借程序员个人的能力可以避免出错,但这同时也增加了语言的出错几率以及复杂性


父类转化为子类出错也是在运行时候出错,编译器什么时候不让你这么做?


转来转去伦理都乱了,老子还能当儿子了?!

C++的做法很诡异


呵呵,什么都不说了,自己看书去。


钻了牛角尖


向上转型和向下转型的问题
难道C++允许向下转吗?不明白

简单一个instanceof 就可以了


看楼主的名字
从c++转过来的?


楼上的是拖?


什么意思 ?


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


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


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


...


标题就说得不明白...还反MS呢...


LZ的意思好像是子类转化为父类.


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


不说什么。顶一个。。


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


大白痴,简直就是个大白痴的问题


绝对BS那些在编程时碰到难题就怨天尤人的垃圾


晕!


教师----+
|----人
工人----+


适配器中传递的是人,不是教师也不是工人,
人可以使用抽象类,也可以使用接口.



教师----+
    |----人
工人----+


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


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


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");

}

}


穿个三角裤就来这里吆喝,哈哈
---------------
改天打你老婆,你老婆就变成我老婆了


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


路过


啥也不想说了。


无语


LZ你把你老爸强制转换一下,是不是就变成你了


不会,乱说,后果是很严重滴...


ding


过来的这个人,他其实已经是一个对象了!
你可以把这个对象用instanceof分被跟工人和老师比较,哪一个类别的比较中得到true,就是说明这个人是这个类别的!


如一楼所说:
---------------------------------------
Object o1 = new String("abc");
String o2 = new String("124");
对于这种情况,大家知道,o1和o2从引用类型上看,是两种类型,而从本质上看,他们
都是String类型的对象,所以,如果进行如下转换:
o2 = (String)o1;
这在java中是完全充许的,而这样的转换在实际应用中也是经常用到的。java并没有限制什么。
------------------------------------------
java的这种做法是很有作用的!


↑返回目录
前一篇: 菜鸟提问:如何用数组构成链表实现数三退一
后一篇: java中日期计算问题-求解---请帮帮忙