有一个父类的对象,如果强制类型转换成子类对象,那么转换后的对象能不能调用子类的方法?
比如:
URL url=new URL("www.baidu.com");
HttpURLConnection baiUrl=(HttpURLConnection)url.openConnection();
注:openConnection返回一个URLConnection对象,HttpURLConnection是URLConnection类的子类并且是个抽象类。
这样强制类型转换后,能用baiUrl调用HttpURLConnection类的方法吗?为什么?
具体的调用过程是怎样的?
比如:
URL url=new URL("www.baidu.com");
HttpURLConnection baiUrl=(HttpURLConnection)url.openConnection();
注:openConnection返回一个URLConnection对象,HttpURLConnection是URLConnection类的子类并且是个抽象类。
这样强制类型转换后,能用baiUrl调用HttpURLConnection类的方法吗?为什么?
具体的调用过程是怎样的?
你可以自己写个代码 测试啊public class TestSup {
public static void main(String[] args) {
sub s = (sub) new par();
s.age();
}
}
class sub extends par{
int age= 20;
public void age(){
System.out.println("my age is"+age);
}
}class par{
int age;
String name;
public void callName(String name){
System.out.println("my name is"+name);
}
}具体原因查看 下面两个帖子
http://topic.csdn.net/t/20031201/15/2514406.htmlhttp://topic.csdn.net/t/20030824/16/2182732.html
URLConnection urlcnn = url.openConnection();
HttpURLConnection baiUrl = null;
if(urlcnn instanceof HttpURLConnection)
baiUrl = (HttpURLConnection)urlcnn;
if(baiUrl != null){
// TODO 完成 baiUrl 的使命
} else {
// TODO 汇报 baiUrl 不能完成使命
}
baiUrl.openConnection();子类可以像这样直接调用父类public类方法
java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。什么叫父类引用指向子类对象,且听我慢慢道来.从2个名词开始说起:向上转型(upcasting) 、向下转型(downcasting).举个例子:有2个类,Father是父类,Son类继承自Father。Father f1 = new Son(); // 这就叫 upcasting (向上转型)// 现在f1引用指向一个Son对象Son s1 = (Son)f1; // 这就叫 downcasting (向下转型)// 现在f1还是指向Son对象第2个例子:Father f2 = new Father();Son s2 = (Son)f2; // 出错,子类引用不能指向父类对象你或许会问,第1个例子中:Son s1 = (Son)f1;问什么 是正确的呢。很简单因为f1指向一个子类对象,Father f1 = new Son(); 子类s1引用当然可以指向子类对象了。而f2 被传给了一个Father对象,Father f2 = new Father();子类s1引用不能指向父类对象。总结:1。父类引用指向子类对象,而子类引用不能指向父类对象。2。把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转换。 如:Father f1 = new Son();3。把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转换。 如:f1 就是一个指向子类对象的父类引用。把f1赋给子类引用s1即 Son s1 = (Son)f1; 其中f1前面的(Son)必须加上,进行强制转换。 参考:http://geyubin.javaeye.com/blog/391573
子类型到父类型不用强转 例如
Object obj = new A();
A可以是任何类。
父类型到子类型需要强转
Object obj = new Object();
A a = (A)obj;
这就需要强转了,如果obj不是A类型就会抛出类型转换异常其实这样说也不太贴切,不过差不多意思