java的多态怎么理解啊,多态有什么用途。

package string;
class Animal
{
public void roar()//roar英文意思‘叫声’
{
System.out.println("动物:...");
}
}

class Cat extends Animal
{
public void roar()
{
System.out.println("猫:喵,喵,喵,...");
}
}

class Dog extends Animal
{
public void roar()
{
System.out.println("狗:汪,汪,汪,...");
}
}

public class AnimalTest
{
public static void main(String args[])
{
Animal am=new Animal();
am.roar();
am=new Dog();
am.roar();
am=new Cat();
am.roar();
}
}
以上代码实现了多态,到底用什么作用,或说有什么好处啊?

多态有编译时多态 和运行时多态。
第一个是通过方法重载实现;第二个是通过方法覆盖实现(子类覆盖父类方法)。
第一种就是我们调用方法是不用区分参数类型,程序会自动执行相应方法,如: 加法运算,可以使int相加,可以是double相加,都是同一个方法名。
第二种就是动态绑定,使用父类引用指向子类对象,再调用某一父类中的方法时,不同子类会表现出不同结果。 这样的作用就是扩展性极好,玩过网游的话应该知道 游戏中有不同的角色,它们都有一个父类,它们做相同动作时表现出来的效果就会不一样,比如跑,魔法师的跑跟战士的跑就不会一样,这就是俩者都覆盖了父类中的跑方法,各自有自己的现实,表现出来多态。 如果有一天你想再加个角色,只用再写一个类继承该父类,覆盖其中的跑方法就行了,其他代码不用怎么改,所以可维护性也很好。

这一个小的程序 或许你体会不到多态的强度作用。其实说到多态就是 面向接口编程,它不和具体类尽心挂钩了
比如 你没用多态的话 ,
你没实例化一个对象 就要new一下,那假如你那天改变了需求了呢?那是不是又要改里面的?这样不好,所以 你可以通过多态,把需要相似的给提出来,然后继承它 这样 以后需要扩展你仅仅只是继承而已。这样就很简单。

这个需要多看代码 才可以更深刻理解。

有问题在讨论。追问

我把am=new Dog();
am.roar();改为

Dog dog=new Dog();
dog.roar();
这实现的功能不是一样吗?

追答

给你个例子吧!。。好好体会体会。
假设有一个类 叫 鸟类,它拥有属性翅膀,拥有方法鸣叫,如下
public class Bird{
private Wing wing;
public void moo(){
System.out.println("鸟叫声");
}
}
鸟类封装了 翅膀类和moo方法;另外有两个类都继承鸟类并重写了moo方法,分别是鹦鹉和麻雀如下:
鹦鹉类:
public class Parrot extends Bird{
public void moo(){
System.out.println("鹦鹉的叫声");
}
}
麻雀类:
public class Sparrow extends Bird{
public void moo(){
System.out.println("麻雀的叫声");
}
}
方法重写应该懂吧,不懂自己找书看吧;然后你有个妻子她想听鸟叫,就有个妻子类
public class Wife{
public void listen(Bird bird){
bird.moo();
}
/*这时多态就很好的体现了,你妻子想听鸟叫,无论什么鸟都可以给她,但是你想让她和鹦鹉
*说话,你就买了一只鹦鹉传给listen方法,结果你妻子听到了鹦鹉的叫声,程序输出:鹦
*鹉的叫声
*/
public static void main(String[] args) {
new Wife().listen(new Parrot());
}
}
多态实现了动态绑定,让程序有了很好的扩展性,比如你以后想买一只燕子送给你妻子,就只需要写个燕子类Swallow继承Bird方法就可以了,而不需要再在妻子类里添加一个方法listen(Swallow swallow)……上面编码没用编译器,可能有错误,请谅解
说得够详细了吧,感谢世界上有我这么好的人吧 ^_^

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-09-03

多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。


JAVA引用变量有两个类型:一个是编译时的类型,一个是运行时的类型,编译时的类型由声明该变量时使用的类型决定,运行时的类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就会出现所谓的多态(Polymorphism)。这和C++里的类似。

class BaseClass                   //父类 

      public int book =6;   
      public void base()    { 
          System.out.println("父类的普通方法");   
      }   
      public void test()    { 
          System.out.println("父类的被覆盖的方法");         
      }

public class SubClass extends BaseClass { 
        //重新定义一个book实例属性覆盖父类的book实例属性         
        public String book = "Hello!";   
        public void test()   { 
            //也叫方法的重写或方法的覆盖
            System.out.println("子类覆盖父类的方法")         
        }   
        public void sub()    { 
            System.out.println("子类的普通方法");   
        }   
        //下面给出主方法的入口 
        public static void main(String[ ] args)   { 
            //下面编译时类型和运行时类型完全一样,因此不存在多态                   
            BaseClass   bc = new BaseClass();       
            //创建父类对象                   
            //输出6 
            System.out.println(bc.book);   
            //下面两次调用将执行BaseClass(父类)的方法                    
            bc.base();                    bc.test();   
            //下面编译时类型和运行时类型完全一样,因此不存在多态                    
            SubClass sc = new SubClass();        
            //创建子类对象                     
            //输出"Hello!" 
            System.out.println(sc.book);   
            //下面调用将执行从父类继承到的base方法                    
            sc.base();   
            //下面调用将执行从当前类的test方法                     
            sc.test();   
            //下面编译时类型和运行时类型不一样,多态发生                    
            BaseClass ploymophicBc = new SubClass();                    
            //输出6----表明访问的是父类属性 
            System.out.println(ploymophicBc.book);   
            //下面调用将执行从父类继承到的base方法                     
            ploymophicBc.base();   
            //下面调用将执行从当前类的test方法                     
            ploymophicBc.test();  
            //因为ploymophicBc的编译类型是BaseClass,BaseClass 类没有提供资金SUBYYIF 
            //所以下面代码编译时会出现错误                    
            //ploymophicBc.sub();             
            } 
}

第2个回答  2014-02-25
多态你可以从字面上去理解,一个类表现出多种形态。它是一种编码的技巧而不是写代码的格式或者方式。 要想理解多态你需要从需求入手。伪代码例子:void method(Father instance): instance.callmethod();现在有两个子类 girl 和 boy . 如果我传入给method的对象是girl,那么instance.callmethod()是否就等同于girl.callmethod(),如果传入的是boy,就等同于boy.callmethod().但是对于程序而言,表达式一直都是 void method(Father instance): instance.callmethod();没有改变过只不过通过传入不同的子类对象使这样一个表达式表现出了多种“类的形态”。这样的现象就叫做多态。 多态在软件结构设计上是非常重要的一个抽象意识1:多态用于解决if,else 现代的编程技巧要求对于某一个函数专注于解决一类型的事情。这就要求一个函数中要尽量的避免出现>1个if,那么如果程序出现了分支而又要避免使用if应该怎么办呢。那就是多态最经常出现的场景。看下面的一个2:多态用于隐藏函数的具体内容在面向对象高度结构化的开发中,软件根据功能的不同需要分为各种模块分别交给不同的人开发。那么如果同一个接口描述一类情况显然是非常高明的。最明显的例子就是大家最常用的System,out.println(Object).初学者可能每天都在使用这样一个多态,但是却不知道这个是多态。System,out.println();无论你输入的是一个string,object,int,array,float都可以正常输出内容。为什么,因为所有的你string,Intege,array,Float都是Object的子类,根据填入参数的类型,System,out,println()就表现出了各种输出功能的形态。 说了这么多希望你能够理解。 多态可以通过接口和继承来实现。 一个接口可以对应多个实现 (1vN : 多态的数学描述,1个形态代表多个形态)继承:一个父类可以有多个子类 (1vN : 多态的数学描述,1个形态代表多个形态)
第3个回答  2014-02-25
多态,就是重载和重写.重载发生在一个类中.重写发生在子类,意思就是子类重写父类相同名称的方法.刚学语言有的东西,不必搞得那么清楚,只有知道怎么用就行了,有的问题你要想真正把它搞得很懂,短时间是不可能的,比如说接口,没有几年工作经验你根本不可能真正理解什么是接口,甚至有的人工作四,五年也没搞明白什么是接口,不要花太多时间去搞这些不容易搞懂的问题.
重载的特性,方法名相同.返回类型,传入方法的参数不同(包括个数和类型).
重写的特性,方法名相同,返回类型,参数均相同,必须发生在子类.
第4个回答  2015-09-12
  多态(Polymorphism)按字面的意思就是“多种状态”。
  在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。
  简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

java多态是什么意思?
Java多态是一种OOP的特性,即同一种方法或对象可以根据不同的情况表现出不同的行为。简单来说,就是同一个接口可以有不同的实现。这种特性使得Java在面向对象编程方面更加灵活,使代码更加可复用并且降低了代码的复杂度。与多态相关的概念还包括继承和重写。从父类继承下来的方法可以被子类重写,子类可以...

java的多态怎么理解啊,多态有什么用途。
多态有编译时多态 和运行时多态。第一个是通过方法重载实现;第二个是通过方法覆盖实现(子类覆盖父类方法)。第一种就是我们调用方法是不用区分参数类型,程序会自动执行相应方法,如: 加法运算,可以使int相加,可以是double相加,都是同一个方法名。第二种就是动态绑定,使用父类引用指向子类对象,...

java多态性是什么?怎么理解和使用多态?
深入浅出讲解Java多态性,剖析其概念、作用、分类、必要条件与实现方式,以及拓展补充内容,旨在帮助你理解和运用多态概念。多态性使得面向对象编程更加灵活、易于扩展。一、多态性简介 1. **概念**:多态性源于生物学,指生物在形态和状态方面的多样性。在Java中,多态性意味着同一个行为可以有不同的表...

java的多态是什么意思
Java的多态是指同一个方法调用会根据调用对象的不同而产生不同的行为。具体地说,它包括两种形式:重写和重载。重写指的是在子类中重写父类中的方法,对于同样的方法调用,子类将覆盖父类的实现;而重载指的是在同一个类中定义多个同名但参数不同的方法,可以根据不同的参数列表来调用不同的方法。多...

java中的多态怎么理解
Java中的多态是一种非常重要的面向对象编程特性,它的作用主要有以下几个方面:1、代码复用:多态可以将不同类的对象当做同一类型处理,使得代码可以更加简洁、可读性更高,也可以减少代码的冗余和重复。2、扩展性和灵活性:由于多态可以使得程序在不同的对象上表现出不同的行为,因此可以很方便地扩展和...

在java中什么是多态。。 什么时候用多态
Java是面向对象的语言,多态性是面向对象程序设计代码重用的一个最强大机制,动态性的概念也可以被说成“一个接口,多个方法”。Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制, 1.可替换性。多态对已存在的代码具有可替换性。 2.可扩充性。多态对代码具有可扩充性。

什么是多态?
一、多态的基本概念 多态意味着可以将子类的对象当作父类的对象来使用。在程序中,不同对象对于同一消息会做出不同的响应,这就是多态性的体现。在Java等面向对象的编程语言中,多态通过继承和接口实现。子类可以重写父类的方法,当调用该方法时,会根据对象的实际类型来确定使用哪种实现方式。二、多态的...

java中多态性什么意思?
在JAVA中有两种多态是指:运行时多态和编译时多态。多态性是面向对象的核心特征之一,类的多态性提供类中成员设计的灵活性和方法执行的多样性。多态指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)实现多态的技术称为:动态...

java中的多态的定义是什么啦 什么情况下使用多态啊?多态有什么作用
多态就是让我们制造出自己想要的东西。写一个画图的类DrawA,定义一个画图的方法a()。我想画个正方形,这时候定义一个正方形类DrawSquare extends DrawA,重写a();方法,方法里边去画正方形。我想去画个圆形,这时候定义一个圆形类DrawCircular extends DrawA,重写a();方法,方法里边去画圆形。这就...

谈谈你对Java中的多态的理解.(为什么要使用多态,有什么好处,一般用在...
Java实现多态有三个必要条件:继承、重写、向上转型。 继承:在多态中必须存在有继承关系的子类和父类。 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。 只有满足了上述三个条...

相似回答