Acat是cat类的实例,他通过new tiger();产生一个实例,然后自动转型成cat型的.

解决方案 »

  1.   

    Acat是tiger的实例,但是指向的引用的类型在这句
    cat Acat=new tiger();
    的时候自动upcast到cat类型,upcast是自动并且安全的。
    上面这个例子其实是要说明OOP里面多态在java语言里的特性。
    类tiger里面重载了类act的printCat和printname方法,所以
    Acat.printCat();
    Acat.printname();
    这两句打印出来都是tiger的方法里面的信息(Acat是tiger的实例)。
    最后的cat为什么会打印类cat的name值呢?
    因为在tiger类里面虽然也有一个同名字的成员name,但是实际上他们
    两个的namingspace不是一样的,一个是cat.name,另外一个是tiger.name,
    所以,cat类型的引用Acat便会打印出cat的name出来而不是tiger类的name。
    如果最后一句改成
    System.out.println(((tiger)Acat).name);
    便会打印出tiger来
      

  2.   

    cat Acat=new tiger();
    来自于tiger的实例class tiger extends cat
    tiger继承于cat类一个老虎继承于猫科的类
      

  3.   

    tiger的实例
    类tiger里面重载了printCat和printname方法,把类cat里的这两个方法覆盖了
      

  4.   

    来自于tiger的实例,但在oop中,tiger“is-a”cat,
    所以tiger可以向上转型成cat.
      

  5.   

    cat Acat=new tiger();
    Acat 实际指向 tiger类。
    你调用Acat的方法时是用的tiger类方法,这是动态绑定
    但是如果你调用的是字段,那么它调用的是cat类里的字段
      

  6.   

    动态绑定只绑定方法,不绑定属性cat Acat=new tiger();
    cat类的引用指向了一个tiger类的实例,程序运行中调用的是运行时的类型
    "动态绑定只绑定方法,不绑定属性"这句话记住就可以了
      

  7.   

    在C#中怎么和JAVA的继承不同呢?
    namespace FirstProgram
    {
    using System;
    class Test
    {
     static void Main()
    {
        cat Acat=new cat();
        Acat.printCat();
        Acat.printName();
    cat Atiger=new tiger();
    Atiger.printCat();
        Atiger.printName();
        Console.Read();
    }
    } class cat
    {
    public String name="Cat";
    public void printCat()
    {
    Console.WriteLine("I am a cat!");
    }
    public void printName()
    {
    Console.WriteLine(name);
    }
    } class tiger: cat{
    public new String name="Tiger";
    public new void  printCat()
    {
    Console.WriteLine("I am a tiger!");
    }
    public new  void  printName()
    {
    Console.WriteLine(name);
    }
    }
    }
    结果是:
    I am a cat! 
    cat
    Iam a Cat!
    cat