关于多态
2007-08-14 13:07
169 查看
package net.qday.test;
public class Shape {
public Shape(){
System.out.println("create a new shape");
}
public void draw(){
System.out.println("shape drawing");
}
}
package net.qday.test;
public class Circle extends Shape{
public Circle(){
System.out.println("create a new circle");
}
public void draw(){
System.out.println("circle drawing");
}
public static void main(String[] args){
Circle c = new Circle();
c.draw();
System.out.println("------------------");
Shape s = new Circle();
s.draw();
}
}
运行结果如下(没看出来什么区别):
create a new shape
create a new circle
circle drawing
------------------
create a new shape
create a new circle
circle drawing
问题补充:我在Circle里面增加了另一个方法draw2(),确实,在main里,s.draw2不可以,c.draw2可以。还有其它区别吗?
还有一点,我就更不明白了,即然Shape s = new Circle()不可以用Circle里面新加的一些方法,那为什么我看别人的代码经常还都这么写,而不是Circle c = new Circle()?这么写的目的到底是为了干什么?
hape c = new Circle()和Circle c = new Circle()有何区别??
怎么说 Shape c = new Circle()来说吧
Shape c 创建一个Shape 的对象 c 但是他的实例也是是Shape 类的.因为Circle是继承自Shape 的. 但是c只能调用到所有Shape 中的方法.而Circle中间的方法是没有办法调用到的..要是如果Circle重写了Shape 中间的方法的话调用执行的还是子类的方法.
Shape c = new Circle();
在理解一下...Shape 不光可以是一个类.也可以是一个虚类.或者说说一个接口.而Circle是必须继承或者实现了Shape 的一个类.
补充一下..个人认为多态不一定是必须只有继承才可以实现的
public void draw(){
System.out.println("circle drawing");
}
public void draw( int a){
System.out.println("circle drawing"+a);
}
我想这也是多态的一种表现吧..通过方法的重写..
至于为什么...我想想要..我也经常这么用但还没有总结过..
一般我是用接口去进行这种操作.因为接口没有办法实例化..
所以要实例化一个他的实现..
xxpniu 说的到有那么点点感觉..例子很不错..
我复述一下..学校是一个类.一个老师就是一个接口.N个老师就是N个接口.这个学校实现n个老师和其他的接口.但是你得到学校就能得到老师这是肯定的.老师 c = new 学校();就好比用学校直接得到了老师..
省心啊..不用在学校里面去辛辛苦苦的去找一个老师出来了..直接就能得到了老师...差不多这意思吧..
我想问一下你到底知道什么叫多态吗?
多态的意思就是多种形态,也就是同样的一个消息,
发送给不同的对象导致不同的行为,实际上,你给出的例子就是
典型的多态的例子,在Java中,多态是基于继承的基础上的,在C++中还
需要虚函数的支持。
有了继承,也就有了向上类型转换,
所以一个继承了Shape类的Circle类所产生的对象可以直接
赋给Shape,这是因为原型也是一种图形。多态采用的是动态联编,也就是
在运行时候才确定所调用的行为。
Circle s = new Circle();
这里产生了一个Circle类,同时调用的是默认的Circle()构造函数,
在该构造函数中会自动调用super(),也就是父类的构造函数,所以
执行顺序为
create a new shape
create a new circle
最后调用了draw方法,执行下列行为
circle drawing
Shape s = new Circle();
这里也是同样道理,new Circle()也是产生了一个Circle对象,所以
执行的前两句结果跟上面的那个例子一样,关键就是Shape的引用所调用
的方法draw,这就体现了多态了,通过动态联编,在运行时确定了它所指向
的对象是Circle,所以调用的自然也就是Circle中的draw方法啦。
public class Shape {
public Shape(){
System.out.println("create a new shape");
}
public void draw(){
System.out.println("shape drawing");
}
}
package net.qday.test;
public class Circle extends Shape{
public Circle(){
System.out.println("create a new circle");
}
public void draw(){
System.out.println("circle drawing");
}
public static void main(String[] args){
Circle c = new Circle();
c.draw();
System.out.println("------------------");
Shape s = new Circle();
s.draw();
}
}
运行结果如下(没看出来什么区别):
create a new shape
create a new circle
circle drawing
------------------
create a new shape
create a new circle
circle drawing
问题补充:我在Circle里面增加了另一个方法draw2(),确实,在main里,s.draw2不可以,c.draw2可以。还有其它区别吗?
还有一点,我就更不明白了,即然Shape s = new Circle()不可以用Circle里面新加的一些方法,那为什么我看别人的代码经常还都这么写,而不是Circle c = new Circle()?这么写的目的到底是为了干什么?
hape c = new Circle()和Circle c = new Circle()有何区别??
怎么说 Shape c = new Circle()来说吧
Shape c 创建一个Shape 的对象 c 但是他的实例也是是Shape 类的.因为Circle是继承自Shape 的. 但是c只能调用到所有Shape 中的方法.而Circle中间的方法是没有办法调用到的..要是如果Circle重写了Shape 中间的方法的话调用执行的还是子类的方法.
Shape c = new Circle();
在理解一下...Shape 不光可以是一个类.也可以是一个虚类.或者说说一个接口.而Circle是必须继承或者实现了Shape 的一个类.
补充一下..个人认为多态不一定是必须只有继承才可以实现的
public void draw(){
System.out.println("circle drawing");
}
public void draw( int a){
System.out.println("circle drawing"+a);
}
我想这也是多态的一种表现吧..通过方法的重写..
至于为什么...我想想要..我也经常这么用但还没有总结过..
一般我是用接口去进行这种操作.因为接口没有办法实例化..
所以要实例化一个他的实现..
xxpniu 说的到有那么点点感觉..例子很不错..
我复述一下..学校是一个类.一个老师就是一个接口.N个老师就是N个接口.这个学校实现n个老师和其他的接口.但是你得到学校就能得到老师这是肯定的.老师 c = new 学校();就好比用学校直接得到了老师..
省心啊..不用在学校里面去辛辛苦苦的去找一个老师出来了..直接就能得到了老师...差不多这意思吧..
我想问一下你到底知道什么叫多态吗?
多态的意思就是多种形态,也就是同样的一个消息,
发送给不同的对象导致不同的行为,实际上,你给出的例子就是
典型的多态的例子,在Java中,多态是基于继承的基础上的,在C++中还
需要虚函数的支持。
有了继承,也就有了向上类型转换,
所以一个继承了Shape类的Circle类所产生的对象可以直接
赋给Shape,这是因为原型也是一种图形。多态采用的是动态联编,也就是
在运行时候才确定所调用的行为。
Circle s = new Circle();
这里产生了一个Circle类,同时调用的是默认的Circle()构造函数,
在该构造函数中会自动调用super(),也就是父类的构造函数,所以
执行顺序为
create a new shape
create a new circle
最后调用了draw方法,执行下列行为
circle drawing
Shape s = new Circle();
这里也是同样道理,new Circle()也是产生了一个Circle对象,所以
执行的前两句结果跟上面的那个例子一样,关键就是Shape的引用所调用
的方法draw,这就体现了多态了,通过动态联编,在运行时确定了它所指向
的对象是Circle,所以调用的自然也就是Circle中的draw方法啦。
相关文章推荐
- (C#)一道看似简单却很难答得完全正确的关于多态的问题
- 软件设计本质论(Essential Design) —白话面向对象 (转注:关于c语言实现封装继承多态的一堆博文)
- 一道关于继承和多态的题目
- 关于继承的多态
- 关于封装,继承,多态三个概念的简单理解
- 关于C++中私有继承后虚函数的访问权限与私有继承后多态的问题
- 黑马程序员——关于多态
- 一个关于继承和多态的问题(提问篇)
- 一个关于继承和多态的问题(思索篇)
- JavaSE面向对象多态中关于被static修饰的方法不存在被重写
- 关于C++多态的理解
- JAVA关于继承、多态和接口
- 经典关于多态的demo
- 关于C++中的 多态 问题
- 关于C++中的重载和多态
- 关于多态
- 关于多态,隐藏,覆盖的理解
- 关于JAVA多态的通俗解释
- 关于多态的理解,有助于理解TStream抽象类的多态机制。
- 关于继承、封装、多态、抽象和接口