强制转换和父类引用指向子类对象的区别

chenxue1011 2015-02-09 12:18:50
class Father{
private int i=0;
public void f(){
System.out.println("Father()");
}
}
class Son extends Father{
public void f(){
System.out.println("Son()");
}
}
public class NullAbstract{

public static void main(String[] args){
Son s=new Son();
((Father)s).f();
////////////Son()
Father f=new Son();
f.f();
///////////Son(
}
}

为什么我的子类对象已经强制转换成父类的对象了,输出的结果还是Son()呢?这个是因为多态的存在吗?如果是那和后面的写法在执行上有和不同呢?求解答
...全文
190 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
healer_kx 2015-02-09
  • 打赏
  • 举报
回复
是的,多态。 你必须得搞清楚多态了,Java最基本的东西。
言不由衷煦 2015-02-09
  • 打赏
  • 举报
回复
确实,上面的是多态,你可以简单的而理解为一种事物多种形态。实际上(Father)s和Father f=new Son();是一样的效果,都是子类对象指向父类引用,都发生了向上转型,这样导致的结果就是当子类有和父类同样的非静态方法的话编译的时候会看父类,运行的时候看子类,也就是上边仁兄所说的 编译看左边运行看右边,当相同的是静态方法或者是成员变量的时候就不存在编译看左边运行看右边的说法了,此时都看父类的
fank123456 2015-02-09
  • 打赏
  • 举报
回复
编译看左边,运行看右边。记住这句话
捏造的信仰 2015-02-09
  • 打赏
  • 举报
回复
楼主要学会贴代码
public class Demo {
    public static void main(String[] args) {
        if (args.length == 0) {
            System.out.println("no args.");
        }
    }
}
像楼主的代码层级多,又没有排版,没法看。
chengxu2011 2015-02-09
  • 打赏
  • 举报
回复
父类引用指向子类对象 说的是 向上转型是安全的 而父类像子类强制转化 是向下转型,是不安全的

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧