捆饶新手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();