java中假设B继承A,C继承B 下面A a=new C();与C a=new C()有区别吗?多态到底是什么意思。
5个回答
展开全部
当然有区别,如果C中某方法是新的,并非继承自某个A或B中的方法,那你对A a=new C();中的a无法调用此方法,编译就通不过,而对C a=new C();中的a就可以调用此方法。
如果此方法继承自A或B,那么即使在C中重写了此方法,这两个句子产生出来的a调用此方法产生的结果都是一样的,这就是多态性。
但上面这话不适合于静态成员和静态方法,比如你可以在A,B,C中都定义
public static String getS()
并返回不同值,这几个getS()之间不是重写的关系而是各管各的。如果是
A a=new C();
那么a.getS()返回的是A下的那个结果(所以一般不建议这么写,而是应该写A.getS()以减少误解的可能性)
而
C a=new C();那么a.getS()返回的是C下的那个结果。
如果此方法继承自A或B,那么即使在C中重写了此方法,这两个句子产生出来的a调用此方法产生的结果都是一样的,这就是多态性。
但上面这话不适合于静态成员和静态方法,比如你可以在A,B,C中都定义
public static String getS()
并返回不同值,这几个getS()之间不是重写的关系而是各管各的。如果是
A a=new C();
那么a.getS()返回的是A下的那个结果(所以一般不建议这么写,而是应该写A.getS()以减少误解的可能性)
而
C a=new C();那么a.getS()返回的是C下的那个结果。
展开全部
主要是类型上的区别,A a=new C();调用了类C的构造器,创建了A的对象a,
C c=new C();调用了类C的构造器,创建了c的对象c,因为继承关系C是A的间接子类,所以c对象可以获得a对象的所有public方法,a表现了c的行为,有自己的行为,不是相同的,要注意。
多态:表现为同一个类中方法的重载使相同的方法名有不同的表现。以及子类继承父类,子类重写了父类的方法,在子类中与父类同名的方法就不能表现出父类方法的行为,而是由自己的行为
你自己仔细的体会重写和重载。慢慢就会明白的
C c=new C();调用了类C的构造器,创建了c的对象c,因为继承关系C是A的间接子类,所以c对象可以获得a对象的所有public方法,a表现了c的行为,有自己的行为,不是相同的,要注意。
多态:表现为同一个类中方法的重载使相同的方法名有不同的表现。以及子类继承父类,子类重写了父类的方法,在子类中与父类同名的方法就不能表现出父类方法的行为,而是由自己的行为
你自己仔细的体会重写和重载。慢慢就会明白的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
【C a=new C()】
这个你好像写错了吧?java允许这样写吗?这个我也不确定
多态就是----不同的对象,接收到同一指令,做出不同的反应,这是我的理解
for example:如果听到上课的铃声,有的学生在翻开书本,有的学生从教室外进来,老师带着课本和教案来到教室铃声是相同的,但每个人的反应都不同,这个就是多态
楼下回答的比我专业多了,仔细看看他的回答吧!
这个你好像写错了吧?java允许这样写吗?这个我也不确定
多态就是----不同的对象,接收到同一指令,做出不同的反应,这是我的理解
for example:如果听到上课的铃声,有的学生在翻开书本,有的学生从教室外进来,老师带着课本和教案来到教室铃声是相同的,但每个人的反应都不同,这个就是多态
楼下回答的比我专业多了,仔细看看他的回答吧!
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
多态有两种表现形式:重载和覆盖
首先说重载(overload),是发生在同一类中。与什么父类子类、继承毫无关系。
标识一个函数除了函数名外,还有函数的参数(个数和类型)。也就是说,一个类中可以有两个或更多的函数,叫同一个名字而他们的参数不同。
他们之间毫无关系,是不同的函数,只是可能他们的功能类似,所以才命名一样,增加可读性,仅此而已!
再说覆盖(override),是发生在子类中!也就是说必须有继承的情况下才有覆盖发生。
我们知道继承一个类,也就有了父类了全部方法,如果你感到哪个方法不爽,功能要变,那就把那个函数在子类中重新实现一遍。
这样再调用这个方法的时候,就是执行子类中的过程了。父类中的函数就被覆盖了。(当然,覆盖的时候函数名和参数要和父类中完全一样,不然你的方法对父类中的方法就不起任何作用,因为两者是两个函数,毫不关系)
A a=new C();
创建的是父类A的对象,调用的方法是A中的方法
C a=new C()
创建子类C的对象,调用的方法是C中的方法
多态有两种表现形式:重载和覆盖
首先说重载(overload),是发生在同一类中。与什么父类子类、继承毫无关系。
标识一个函数除了函数名外,还有函数的参数(个数和类型)。也就是说,一个类中可以有两个或更多的函数,叫同一个名字而他们的参数不同。
他们之间毫无关系,是不同的函数,只是可能他们的功能类似,所以才命名一样,增加可读性,仅此而已!
再说覆盖(override),是发生在子类中!也就是说必须有继承的情况下才有覆盖发生。
我们知道继承一个类,也就有了父类了全部方法,如果你感到哪个方法不爽,功能要变,那就把那个函数在子类中重新实现一遍。
这样再调用这个方法的时候,就是执行子类中的过程了。父类中的函数就被覆盖了。(当然,覆盖的时候函数名和参数要和父类中完全一样,不然你的方法对父类中的方法就不起任何作用,因为两者是两个函数,毫不关系)
A a=new C();
创建的是父类A的对象,调用的方法是A中的方法
C a=new C()
创建子类C的对象,调用的方法是C中的方法
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
两种方式都实例化了C类的对象,但是引用不同,第一种只能调用A类里定义了方法,第二种A/B/C三个类里面定义的方法都可以调用。将第一种new出来的对象a进行强转为C类应用后即可调用A/B/C类的所有方法,因为他自己本来就是C类对象。多态是指,如果A类定义了方法fun()而后B类或C类重写了方法fun(),则new的C类对象只会调用最后重写的fun()方法,即B类或C类的fun()方法。示例:
public class 车(){
public void 发动(){靠某种动力发动};
public void 运行(){可以跑};
public void 装载(){可以装物品};
}
public class 汽车() extends 车{
public void 发动(){靠发动机发动};
public void 装载(){可以载人};
}
public class 公交车() extends 汽车{
public void 装载(){可以载很多人};
public void 报站(){到公交站可以报站让乘客下车};
}
车 a = new 公交车();//实例化了一个公交车,但是我们只知道它是车;
公交车 c = new 公交车();//实例化了一个公交车,而且我们知道它是公交车;
a.发动();//a是车,可以调用“车”类定义的“发动”方法,实际上它是公交车,公交车也是汽车,所以是靠发动机发动;
c.发动();//c是公交车,公交车是汽车,可以调用继承自“汽车”类的重写的“发动”方法,靠发动机发动;
a.运行();//a是车,可以调用“车”类定义的“运行”方法,可以跑;
c.运行();//c是公交车,公交车也是车可以调用继承自“车”类定义的“运行”方法,可以跑;
a.装载();//a是车,可以调用“车”类定义的“装载”方法,实际上它是公交车,所以它可以载很多人;
c.装载();//c是公交车,可以调用“公交车”类重写的“装载”方法,可以载很多人;
c.报站();//c是公交车,到公交站可以报站让乘客下车;
((公交车)a).报站();//a本来是公交车,但是我们只知道它是车,不一定会报站,现在把它强转为公交车,那我们就知道他是公交车了,可以报站,到公交站可以报站让乘客下车。
总体而言就是:对象能调用哪个方法是根据我们所知道的它是哪个类来看,而调用该方法实际执行的操作是根据它实际上是哪个类来看。子类继承父类就有了父类的方法,而重写父类的方法就改掉了实际执行的操作。这就是多态。
希望对你有帮助。
public class 车(){
public void 发动(){靠某种动力发动};
public void 运行(){可以跑};
public void 装载(){可以装物品};
}
public class 汽车() extends 车{
public void 发动(){靠发动机发动};
public void 装载(){可以载人};
}
public class 公交车() extends 汽车{
public void 装载(){可以载很多人};
public void 报站(){到公交站可以报站让乘客下车};
}
车 a = new 公交车();//实例化了一个公交车,但是我们只知道它是车;
公交车 c = new 公交车();//实例化了一个公交车,而且我们知道它是公交车;
a.发动();//a是车,可以调用“车”类定义的“发动”方法,实际上它是公交车,公交车也是汽车,所以是靠发动机发动;
c.发动();//c是公交车,公交车是汽车,可以调用继承自“汽车”类的重写的“发动”方法,靠发动机发动;
a.运行();//a是车,可以调用“车”类定义的“运行”方法,可以跑;
c.运行();//c是公交车,公交车也是车可以调用继承自“车”类定义的“运行”方法,可以跑;
a.装载();//a是车,可以调用“车”类定义的“装载”方法,实际上它是公交车,所以它可以载很多人;
c.装载();//c是公交车,可以调用“公交车”类重写的“装载”方法,可以载很多人;
c.报站();//c是公交车,到公交站可以报站让乘客下车;
((公交车)a).报站();//a本来是公交车,但是我们只知道它是车,不一定会报站,现在把它强转为公交车,那我们就知道他是公交车了,可以报站,到公交站可以报站让乘客下车。
总体而言就是:对象能调用哪个方法是根据我们所知道的它是哪个类来看,而调用该方法实际执行的操作是根据它实际上是哪个类来看。子类继承父类就有了父类的方法,而重写父类的方法就改掉了实际执行的操作。这就是多态。
希望对你有帮助。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询