我一直以来对多态的理解是在一个类里面,几个方法名相同,但参数不同,或者返回值不同,如
class ClassName{
void method1(int i){
Systme.out.println(i);
}
void method2(String s){
Systme.out.println(s);
}
String method3(String d){
return d;
}
}
然后这几个方法就体现了多态性,
然后如
List a=new ArrayList();
和List b=new LinkList();
这也体现了多态性,
然今天请教一位同事,他跟我说
上面的并不能全部正确正确的理解应该是
//假如有动物这样一个对象,也可以说类吧,姑且叫class Animal {
void jump() {
System.out.println("Animal is jump");
}
// 然后有具体的猪、狗继承动物这个类,也就是class Pig extends Animal {
void jump() {
System.out.println("pig is jump");
}
}class Dog extends Animal {
void jump() {
System.out.println("dog is jump");
}
}
public class PP {
public static void main(String args[]) {
Animal p=new Pig();
p.jump();
Animal d=new Dog();
d.jump; //这样理解才叫多态,是这样的吗???望高手解惑
}
}
class ClassName{
void method1(int i){
Systme.out.println(i);
}
void method2(String s){
Systme.out.println(s);
}
String method3(String d){
return d;
}
}
然后这几个方法就体现了多态性,
然后如
List a=new ArrayList();
和List b=new LinkList();
这也体现了多态性,
然今天请教一位同事,他跟我说
上面的并不能全部正确正确的理解应该是
//假如有动物这样一个对象,也可以说类吧,姑且叫class Animal {
void jump() {
System.out.println("Animal is jump");
}
// 然后有具体的猪、狗继承动物这个类,也就是class Pig extends Animal {
void jump() {
System.out.println("pig is jump");
}
}class Dog extends Animal {
void jump() {
System.out.println("dog is jump");
}
}
public class PP {
public static void main(String args[]) {
Animal p=new Pig();
p.jump();
Animal d=new Dog();
d.jump; //这样理解才叫多态,是这样的吗???望高手解惑
}
}
解决方案 »
- Serializable这个接口起啥作用啊??
- Graphics2D 与 Graphics
- 请教一个java的输出问题,我实在是想的快死了
- 请教一个Swing的问题(功能是在JPanel添加19X19的按钮),请帮我解决代码中的异常
- 求救:Java的 DateFormat 和NumberFormat类
- 谁能教教我,怎么在一个java程序打开一个dwg文件(AutoCad生成的文件)
- 如何测试一个socket连接是否仍然有效?
- 请问在CMP中如何处理自动增长的主键?
- java 反编译软件哪个最好?误差最少?
- 我想什么叫寻侄
- ApplicationFrame这个类是什么类?
- 快来帮忙:Math.floor()用来干什么????
override找本书看看估计比大家几句话讲的清楚
楼主那 以前一直以来的 看法是错误的,你最开始说的是 重载 overload , 而且 overload 返回值不能作为 参考,
overload
override找本书看看估计比大家几句话讲的清楚
++++++++++++++
这是正解建议
好好去看看thing in java
class ClassName{
void method(int i){
System.out.println(i);
}
void method(String s){
System.out.println(s);
}
String method(String d){
return d;
}
}
但是这里面还是有一个问题,void method(String s)方法和String method(String d)方法恐怕也不能这么放在一起,因为你已经定义过了method(String s)这个方法,而编译器会认为method(String d)是重复定义method(String s)方法而楼主的同事的理解,应该是override至于List a=new ArrayList();
和List b=new LinkList();
这个准确的讲应该叫做向下转型,《thinking in java》把向下转型也放在了多态的那一章
override多态是不同类(当然有继承关系)之间相同的方法重载是同一个类中的同名方法(参数不同)
简单说来,就一爸爸有两个孩子继承了他会跳舞的能力,一个跳现代舞,一个跳民族舞.
而爸爸跳舞的方法叫DANCE(),两个孩子继承DANCE()这个方法,他们跳舞也叫DANCE(),
然后别人用爸爸的原形实例化了两个孩子对象,然后叫这两个对象做DANCE()这个方法,而这两个对象一个会跳现代舞,一个会跳民族舞,这个就是多态吧.
你所说的动态其实是overload即重载
如:
class A{
public void f(){ System.out.println("class A");};
};class B extends A{
public void f(){ System.out.println("class B");};
};class C extends A{
public void f(){ System.out.println("class C");};
};public class D
{
public static void f(A obj)
{
obj.f();
}
public static void main(String args[])
{
A a = null;
f(new A());
f(new B());
f(new C());
}
}看一下打印结果你就知道了。
D中的f()参数类型是A,但是它同时可以接收B类和C类的对象,因为他们同时也是A类的(继承自A),就像男人和女人都是人一样,人就是A,男人女人分别是B和C。这里f()会根据对象不同自动选择执行哪一个类的f()方法。
实际上这是一种动态绑定。通常我们写的程序都是静态绑定的,就像C,在编译时调用哪一个方法已经确定了,而动态绑定是在程序执行时才确定的。
public class Persion{
public void eat(){
}
} public class Student extends Persion{
public void doSomething(){
Persion p = new Student();// 这里就是个继承多态了吧
p.eat();
}
}