java中的多态性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的多态性相关的知识,希望对你有一定的参考价值。

java中的多态是怎么实现的!一个简单的例子我明白啦。!
比如一个 Aniaml 的基类! 派生了一个 Cat 的子类!

那么在子类的一个方法中 比如
public void fn(Animal an)

这里有调用了一个重载的方法! 就比如是 print()吧! 输出一段字符串!

传递了一个Cat对象!

那么这时候an 等于 Cat 的对象吗!而an 应该只能看到Animal的 print()方法! (是这样吗? 是这样吧!)
那这样不是就会调用基类的
print()方法了吗!
就这里不明白!
是如何实现的多态的! 谢谢 。。 新手

先纠正一下楼主的说法,函数重载和函数重写是不一样的,重载的函数:函数名相同,参数个数不同,返回类型可以不同。重写是函数名、参数类型和参数个数都完全相同,返回类型也要相同,且重写的方法抛出的异常范围不能大于基类!
至于多态,以楼主的例子为例,我写了两个简单的类:
class Animal

public void print()"I am amimal";--输出函数就不写了


class Cat extends Animal

public void print"I am cat";

pulbic void print(String name)"my name is"+name

以上的Cat继承了Animal,并重写和重载了print方法,以下是方法调用:
public void fn(Animal an) //这里假设传入的参数都是Cat对像

an.print();

输出结果是:I am cat
可如果是这样调用:
public void fn(Animal an)

an.print("mimi");

就会报语法错误!为什么呢!因为指向这个Cat的引用是Animal类型的,这个引用就看不到Cat重载的函数,所以会报语法错误,就像老板给你张单子去买东西,你只能买单子上买的东西,单子以外的东西你不能买!这里的引用用像这张单子!对于重写,由于Cat也是Animal,所以这张单子(引用)上面当然写找得到print()方法,但要主意,虽然引用是Animal类型的,但引用的实际对象是Cat类型,如果Cat重写了该方法,那么基类的方法就被覆盖了,调用到的就是子类重写后的方法!就像你单子上写有要买一台iphone,但里到商店后发现没用美国原版的卖了,但有港版的,于是你就买港版的咯!如果用大陆行的,也可以选择买大陆行的,或者联通版的,想当于多个继承了基类的子类表现出的不同特征!这就是多态了,不知道楼主理解了没!!!求 分哈!
参考技术A 多态就是一个函数多个形态
如题:看到的是的Cat的print()方法。调用哪个print()取决于你所传入的对象。试想如何不论你传入的是哪个对象都总调用了基类的print(),那么要多态有什么用?跟你传入的对象是没有关系的。

java中的多态分为两种:静态多态和动态多态.静态多态就是指基类中有多个构造函数,而这些构造函数是同名的。为什么说它是静态的呢,因为我的构造函数定义好了之后,外界不论是谁在调用,那调用的都是同一个构造函数,如Animal这个类它可能有多个构造函数:
public Animanl()
public Animanl(String name,String color),
在Cat类中和在Animal类中调用new Animal();其调用的都是一样的。
动态多态则是指子类继承父类的方法因为重写而呈现不同的形态。假如:Animal 有子类Cat和Dog,这两类中的fn都继承至基类Animal中的fn,但是它他打印出的信息是不一样的。cat.fn()将打印Cat类中的print();dog.fn()将打印Dog类中的print()
参考技术B java中实现多态的机制是: 靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。 参考技术C 只要你传递进来的是子类cat对象,都不会执行父类的print方法,这是重写造成的而不是其他原因。

Cat cat = new Cat();//此时cat实质为cat,但是同时也是animal,不过本质是cat
cat.fn(cat);父类中的方法被重写,所以只会跑父类的方法,这个
Animal animal = new Cat();//此时的animal实质为cat,所以只会跑子类的方法
animal.fn(animal);
Animal anm = new Animal();//此时的animal实质为animal,所以不会调用到子类的方法
anm.fn(anm);
如果要强行调用父类的,别忘了super关键字。。super.fn(animal)
参考技术D 举个例子,跑一下就明白了
class A
public void print()
System.out.println("A");


class B extends A
public void print()//重写父类的方法
System.out.println("B");


public class C extends A
public void print()//重写父类的方法
System.out.println("C")

public static void main(String[] args)
A a1 = new A();//new A,则会调用A的print();
a1.print();
A a2 = new B();//new B,则会调用B的print();
a2.print();
A a3 = new C();//new C,则会调用C的print();
a3.print();

以上是关于java中的多态性的主要内容,如果未能解决你的问题,请参考以下文章

Java中的多态性

Java中的多态

Java中的多态

java中的多态 到底怎么使用

Java_基础java中的多态性

多态分为哪两中