类Student实现接口Singer;
类Teacher实现接口Singer,Painer;
Singer s1=new Teacher;
Painer p1=(Painer )s1;();//就是这句不明白 我个人认为,强制转换的条件是:父类转子类。可这个例子中s1实现的是p1的接口,应该不用强制转换才对。我不解,望帮助,谢谢
类Teacher实现接口Singer,Painer;
Singer s1=new Teacher;
Painer p1=(Painer )s1;();//就是这句不明白 我个人认为,强制转换的条件是:父类转子类。可这个例子中s1实现的是p1的接口,应该不用强制转换才对。我不解,望帮助,谢谢
解决方案 »
- 可以限制一个方法重载的声明语句(Java)
- 用Graphics2D 做 emf图片 我做了两天没做出来,高手赐教
- Hql语句问题!
- 让我想了很长时间没有想通的问题 JAVA问题
- 请问二进制的10101010表示的byte值是多少?
- 怎么用RandomAccessFile在指定位置追加
- 关于test object equivalence的问题(==与EQUAL())
- 如何在JLabel中显示换行,制表符?
- 怎么用package????
- 怎样做程序启动画面,像word那样的,能否给出源代码
- 跪求哪位高手能帮忙把上面的部分按钮的功能不上呀!我是初学者,只写了放大缩小和还原 这三个按钮的功能。还请各位大大留心下!
- java socket编程问题
类Teacher实现接口Singer,Painer;
1.先讲点知识
s1和p1都是上转型对象,上转型的对象只是隐藏了属性和方法而已,需要强制转换才可以调用里面的方法
2.Singer s1=new Teacher;//s1中有Singer,Painer中的方法和属性,只是不能直接调用。
3.Painer p1=(Painer )s1;();//p1强制转换之后,就可以获得Painer里面的属性和方法
就是这个原因才需要强制转换的。也就是说:其实s1的属性和方法多于p1,所以需要强制转换。
Object o = new String();子类变量可以而且必须经过强制造型到父类,但可能抛出ClassCastException
Object o = new String();
String s = (String)o; //okObject o1 = new Integer();
String s2 = (String)o1;//ClassCastException
关于“面向接口编程”的例子,在java.sql包比比皆是,比如Driver,Connection等等。
之所以可以用Class.forName("....");
DriverManager.getConnection()...
这样获取数据库连接,就是因为数据库厂商提供的驱动实现了上述两个接口
s1编译时的类型是Singer,s1运行时的类型是Teacher
Painer p1=(Painer )s1;
p1编译时的类型是Painer,p1和s1在编译的时候不认识。要强转一下
但是类型Singer和Painer不同 也就是p1不能直接引用s1
执行完这条语句后,s1这个句柄,编译器只会认为它是 Singer类型的对象,尽管它实际上是 Teacher 对象
所有s1 不对当 Painer 使用,要让它可用,只能把 s1再次转为 Teacher,或 painer
即 Teacher t=(Teacher)s1;或 Painer p=(Painer)s1;
这样编译器才能使用对这个对象使用 Painer接口中的方法;
当我,即使s1这个对象不是 Teacher对象,而是Student对象
这样转换,编译的时候也不会报错,只是在运行时报错;