黑马程序员技术交流社区
标题:
关于多态的问题
[打印本页]
作者:
杨博
时间:
2013-3-13 21:36
标题:
关于多态的问题
本帖最后由 杨博 于 2013-3-15 20:24 编辑
/*
关于运算操作程序
*/
class Test8
{
public static void main(String[] args)
{
int a=4;
int b=1;
Operation op=OpeationFactory.getOperation('-');
int result=op.oper(a,b); 。
System.out.println(result);
}
}
class OpeationFactory
{
public static Operation getOperation(char c){
Operation op=null;
switch(c){
case '+': op=new Add();break; <FONT color=red> //这块的作用,为什么是Operation类,有什么用,不能设置为calss Add吗?</FONT>
case '-': op=new Sub();break;
case '*': op=new Mul();break;
case '/': op=new Div();break;
case '%': op=new Mod();break;
}
return op;
}
}
abstract class Operation
{
abstract int oper(int a,int b);
}
class Mod extends Operation
{
int oper(int a,int b){
return a%b;
}
}
class Add extends Operation
{
int oper(int a,int b){
return a+b;
}
}
class Sub extends Operation
{
int oper(int a,int b){
return a-b;
}
}
class Mul extends Operation
{
int oper(int a,int b){
return a*b;
}
}
class Div extends Operation
{
int oper(int a,int b){
return a/b;
}
}
复制代码
问题见代码红色部分,这块说用到父类引用指向了子类对象,具体在代码中是怎么做的,求指导
作者:
我自信我很牛
时间:
2013-3-13 21:42
这个其实主要理解引用类型和基本类型一样,都是有高级和低级,父类比子类就高,你的代码23行,定义了一个父类的引用,并赋予初值为null,后面的switich语句中选择结果是new Add()这个是子类Add的对象,所以就把子类的对象赋值给了父类的引用,这就是多态的最常见的表现形式,其实在赋值过程隐含了低等级的引用自动转向高级。
这是我自己的理解,希望对楼主有帮助!
作者:
杨博
时间:
2013-3-13 21:45
烟磊磊 发表于 2013-3-13 21:42
这个其实主要理解引用类型和基本类型一样,都是有高级和低级,父类比子类就高,你的代码23行,定义了一个父 ...
见解很精辟啊,茅塞顿开,太感谢你了
作者:
张雪萍
时间:
2013-3-15 09:55
你这是说的是对象的上转型对象吧,
我们经常说老虎是哺乳动物,狗屎哺乳动物,如果说哺乳动物是老虎类的父类,这样说当然正确,但是 当说老虎是哺乳动物时,老虎将失掉老虎所有的属性和功能,下面给你说一下对象的上转型对象
假设A类是B类的父类,当用子类创建一个对象,并把这个对象的引用放到父类的对象中时,如A a=new B();
这时称对象a是对象b的上转型对象
其特点
1,上转型对象不能操作子类新增的成员变量(失掉这部分属性)和新增的方法(失掉这部分功能),
2,上转型对象可以访问子类继承或隐藏的成员变量,也可以调用子类继承的方法或子类重写的方法,
因此,如果子类重写了父类的某个方法后,当对象的上转型对象调用这个方法时一定是调用了子类重写的方法。
可以将对象的上转型对象再强制转换到一个子类对象,这时,该资料对象又具备了子类所有的属性和功能,
切记:
不可以将父类创建的对象的引用赋值个子类声明的对象(不能说哺乳动物是老虎)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2