日期:2014-05-20  浏览次数:20702 次

捆饶新手N长时间的问题

abstract   class   Employee   {
       
        abstract   void   fangfa();
        public   static   void   main(String   args[])
        {
                Employee   a;
                zilei   b   =new   zilei();
                zilei2   c=   new   zilei2();
                a=b;
                a.fangfa();
                a=c;
                a.fangfa();

        }
}

class   zilei   extends   Employee
{       int   a=10;
        void   fangfa()
        {
                System.out.println( "啊啊啊啊 "+a);
       
        }
}

class   zilei2   extends   Employee
{       int   a=20;
        void   fangfa()
        {
                System.out.println( "哈哈哈俣 "+a);
       
        }
}

上面这代码里的a=b;   a=c;不知道是什么意思
好像不是赋值吧。   我一直认为它是赋值   所以想不明白     。
请问它到底是什么意思啊   能不能用通俗的语言讲一下   我理解能力不太好!   谢谢!

------解决方案--------------------
子类is-a父类,也就是说一个子类的instance is-a父类的instance。
在给出的程序中,b是一个zilei的instance,同时也是一个Employee的instance。

那zilei和zilei2里的那个变量赋给谁了?
抽像类里的没有变量啊,那它是怎么接收zilei和zilei2里那两个变量的值的?

==> 那些变量和方法没有赋给谁,它们还在自己的instance里面乖乖呆着呢。问题的关键在于怎么才能使用这些变量和方法。

对方法来说,a.fangfa();运行的方法是有a的runtime type,也就是具体instance的类型来决定的,a所reference的值是zilei的一个instance,所以对于方法来说,就是zilei的这个instance的方法会运行。

对于变量来说,a.someValue;是有reference variable type决定的,也就是a的type决定的,也就是Employee。如果Employee里面定义了变量,那么它们可以通过a.someValue;使用,但是不可以通过a使用子类里的变量。

仔细读书,这些都在Java Language Specification里讲得很清楚。
------解决方案--------------------
你说的问题,其实很简单,在声明的时候你的zilei1 b = new zilei1();和zilei2 c = new zilei2();是多余的.你可以直接用Employee a = new zilei1();然后a.fangfa();因为Employee是父类,所以你可以创建他的类型,但是他是抽象类,不能创建实例.但是可以引用实例化过的子类,就像上面那样写.
a = b ; 就是说,本来你b是zilei1 的一个变量,引用了zilei1的对象,也就是你zilei1里的方法,现在却把这个zilei1类型变量b引用给了Employee a类,也就是把new zilei1();这个引用给了a .
在JAVA里面父类类型,可以引用子类类型,因为父类有的东西,子类都有,所以可以直接引用子类,同样,子类类型也可以引用父类的对象,但是这样就需要强制转换了,而且很可能出现异常,导致程序出错,要转换可以这样
fulei a = new fulei();
a.fangfa();
zilei b = (zilei)a.fangfa();