class A
{
void jj(B b)
{
System.out.println("success");
}
public static void main(String args[])
{
A a=new A();
B b=new B();
a.jj(a);//向下转型.失败!,我想问一下,为什么向上转型会成功?而向下转型不成功.请各位说一下其中的原理,谢谢了.
}
}
class B extends A
{}

解决方案 »

  1.   

    class A
    {
    String name="张三";
    void jj(B b)
    {
    System.out.println("success");
    }
    public static void main(String args[])
    {
       A x=new B();
       System.out.println(x.getClass().getName()); //返回B
       System.out.println(x.age);//不明白,既然x为B类的实例变量,B类中又有成员变量age.些时为什么会出错呢?
       System.out.println(x.name);
    }
    }
    class B extends A
    {
    int age=20;
    }
      

  2.   

    第一个问题
    A为B的父类,不可以这么直接用的,
    即使在这里a.jj(a);//
    强制进行转换a.jj(B(a))也不行
    打个比方说,动物类是哺乳动物类的父类,
    你不可以说动物都是哺乳动物,所以不可以把一个动物强制转换成哺乳动物,
    除非你一开始就知道它是哺乳动物
      

  3.   

    第二个问题记不清楚了
    好像是因为x是虽然是B类的实例,但它使用的是A类的引用
      

  4.   

    谢谢你回答我的第一个问题,我明白了,不过第二个问题,还是要请您指教:问题如下:
    (同时也希望路过的朋友能指点一下:)class A
    {
    String name="张三";
    void jj(B b)
    {
    System.out.println("success");
    }
    public static void main(String args[])
    {
       A x=new B();
       System.out.println(x.getClass().getName()); //返回B
       System.out.println(x.age);//不明白,既然x为B类的实例变量,B类中又有成员变量age.些时为什么会出错呢?
       System.out.println(x.name);
    }
    }
    class B extends A
    {
    int age=20;
    }
      

  5.   

    第二个问题中B的age没有访问修饰符,默认是包内可访问的,A和B你是写在一个文件,所以是同一个包,但问题是B是A的子类,A在B出生前就出生了,A怎么会知道B里面有什么呢?main方法在A里面,同样就不知道了,你把main方法调到B里,应该就可以了。
      

  6.   

    x虽然是子类B的实例,它将实现父类,它具有对B类的引用
      

  7.   

    djsl6071 你的解释真是太有意思了,哈哈,你是不是喝多酒了,?
    把main方法调到B里,难道就是不是先有A了吗?
      

  8.   

    class A
    {
    void jj(B b)
    {
    System.out.println("success");
    }
    public static void main(String args[])
    {
    A a=new A();
    B b=new B();
    a.jj(a);//向下转型.失败!,我想问一下,为什么向上转型会成功?而向下转型不成功.请各位说一下其中的原理,谢谢了.
    }
    }
    class B extends A
    {}胡说二句:我认为向上和向下转型,主要是对方法而言,参数并不能。不知道胡说得对不。
    a.jj(a); 改为 a.jj(b)就可以。