package com.dd;public class ExtendsTest { public static void main(String[] args) {
A a = new A();
B b = (B)a;
b.func1();
b.func2();
}
}class A {
public void func1(){
System.out.println("ddd");
}
}
class B extends A {
public void func2(){
System.out.println("eeee");
}
}这个程序我要的结果是: ddd
eeee但总报错,Exception in thread "main" java.lang.ClassCastException: com.dd.A
at com.dd.ExtendsTest.main(ExtendsTest.java:7)是什么原因?望高手解答。谢谢!
A a = new A();
B b = (B)a;
b.func1();
b.func2();
}
}class A {
public void func1(){
System.out.println("ddd");
}
}
class B extends A {
public void func2(){
System.out.println("eeee");
}
}这个程序我要的结果是: ddd
eeee但总报错,Exception in thread "main" java.lang.ClassCastException: com.dd.A
at com.dd.ExtendsTest.main(ExtendsTest.java:7)是什么原因?望高手解答。谢谢!
解决方案 »
- 接口不就是interface吗?怎么还要写一个接口啊
- 线程并发的问题
- API的解析
- 请教各位 我的线程wait()了 为什么还继续运行???(100分)
- 用动态代码来批量验证Http代理问题[有点难度,感兴趣的进来看看吧,100分]
- 在事务中,往数据库批次更新多条记录,如何再取得更新的记录?
- 小问题,进来看看,风光这边独好!!!
- java.lang.IllegalAccessError这是什么错误?
- 怎么将class做成可执行的文件呢?
- java多线程读取文件夹中的多个文件问题,新手多谢!
- 如果发现需要的模块,就立刻执行,该怎么办?
- java 中向文件写东西,为什么最后结果里没有东西,已经调用flush()le
这句有错误a是父类对象的引用,他是不能强制转换为B类的类型,因为B类是A类的子类
B b = (B)a;
这样导致类型转换错误,比如一个动物类,一个dog类,动物有很多子类,怎么就知道一定是dog呢
然后b.func1();
b.func2();
就打印出两句了
A a = new B();
a.func1();
a.func2();
}
}
A b = new B();b.func1();
b.func2();
}
}class A {
public void func1(){
System.out.println("ddd");
}
}
class B extends A {
public void func2(){
System.out.println("eeee");
}
} 向上塑形,不要向下塑型
这样写没有问题,典型的多态
B b = new B();
这样写也没有问题,正常写法
A a = new A();
B b = (B)a;
可是为什么要这样写哪?觉得没什么必要
因为A a = new A();
这时候的a引用是一个A类的对象,并不是它的子类B的对像啊.
如果是
A a = new B();
再B b = (B)a;这才是对的,因为a实际引用的是一个B的对像.你还可以这样子.
Object o = new B();
B b = (B)o;
因为这个o实际引用的是一个new B();对象.
为什么
Object o = new B();这个可以,那就是因为Object是所有类的超类了
b.func1();
b.func2();
就可以了不用upcasting也不用downcastiong。
事实上A b = new B();那b只能看见fun1(),看不见fun2();
LZ是不是不理解继承的意思呢。A,B类没有重写方法。B类继承A类非私有的东西。
直接创建子类的对象,2个方法都可访问。
public class ExtendsTest {public static void main(String[] args) {
B b = new B();
//B b = (B)a;
b.func1();
b.func2();
}
}class A {
public void func1(){
System.out.println("ddd");
}
}
class B extends A {
public void func2(){
System.out.println("eeee");
}
}
a.func1();也不会像有的人像的那样,会动态调用B类的方法func2()输出eeee;Lz 直接这样用就是了B b = new B();//用不着再创建一个A类对象了 b.func1();//B类继承了A类 A类中的方法当然能够用
b.func2();//B类同时扩展了A类 增加了一个方法func2();
func1()和func2()屁关系都没有。这样写你会不会好理解多了呢
class A {
public void func1(){
System.out.println("ddd");
}
}
class B {
public void func1(){
System.out.println("ddd");
}
public void func2(){
System.out.println("eeee");
}
}
转化也只是类型的转化,对象还是那个对象,不会因为转化而使对象本身改变
JAVA资料太多?选中想收藏的文字(图片),右键选“收录到易载”,搞定!
B b = (B)a;
}或者if(a.getClass()==B.class){
B b = (B)a;
}这样可以避免一些非法转换。
B b = new B();
这样写对你有啥损失呀