黑马程序员技术交流社区

标题: 多态的问题 [打印本页]

作者: 做个有理想的人    时间: 2014-1-20 16:59
标题: 多态的问题
多态这个怎么理解,接口的多种不同的实现方式即为多态,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作,网上查说**方法重载(静态多态)、方法重写(动态多态,对象多态),但是有的人说是错的,现在迷茫了,求解惑,

作者: 宋星    时间: 2014-1-20 17:29
多态:
比如有一个父类superClass,它有2个子类subClass1,subClass2。superClass有一个方法
func(),两个子类都重写了这个方法。那么我们可以定义一个superClass的引用obj,让它指向一个子类的对象,比如superClass obj = new subClass1();那么我们调用obj.func()方法时候,会进行动态绑定,也就是obj它的实际类型的func()方法,即subClass1的func()方法。同样你写superClass obj = new subClass2();obj.func()其实调用的是subClass2的func()方法。这种由于子类重写父类方法,然后用父类引用指向子类对象,调用方法时候会进行动态绑定,这就是多态。多态对程序的扩展具有非常大的作用,比如你要再有一个subClass3,你需要改动的东西会少很多,要是使用了配置文件那就可以不动源代码了。
但是用多态时,例:superClass obj = new subClass1(),注意obj只能调用父类中的方法,虽然实际调用的是被子类复写后的父类方法。如果想调用子类中的特有方法(父类中没有的方法),必须强转为子类,即subClass1 sub=(subClass1) obj;
作者: 午夜b'Boy    时间: 2014-1-20 18:18
老爸买了一条鱼做菜:煎炒油炸不同方法,此为:方法重载(静态多态);
老爸不想做,交给儿子做:儿子1,儿子2,儿子3。。。。。此为:方法重写(动态多态,对象多态)
作者: 姬运涛    时间: 2014-1-20 20:02
1.方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。 Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。
调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
package c04.answer;//这是包名
    //这是这个程序的第一种编程方法,在main方法中先创建一个Dog类实例,然后在Dog类的构造方法中利用this关键字调用不同的bark方法。

不同的重载方法bark是根据其参数类型的不同而区分的。

    //注意:除构造器以外,编译器禁止在其他任何地方中调用构造器。
    package c04.answer;

    public class Dog {
         Dog()
         {
                this.bark();
         }
         void bark()//bark()方法是重载方法
         {
                System.out.println(\"no barking!\");
                this.bark(\"female\", 3.4);
         }
         void bark(String m,double l)//注意:重载的方法的返回值都是一样的,
         {
                System.out.println(\"a barking dog!\");
                this.bark(5, \"China\");
         }
         void bark(int a,String n)//不能以返回值区分重载方法,而只能以“参数类型”和“类名”来区分
         {
                System.out.println(\"a howling dog\");
         }

         public static void main(String[] args)
         {
                Dog dog = new Dog();
                //dog.bark(); [Page]
                //dog.bark(\"male\", \"yellow\");
                //dog.bark(5, \"China\");

2.重写:父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。
但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。
方法重写又称方法覆盖。
重写与重载的区别在于:

重写多态性起作用,对调用被重载过的方法可以大大减少代码的输入量,同一个方法名只要往里面传递不同的参数就可以拥有不同的功能或返回值。

用好重写和重载可以设计一个结构清晰而简洁的类,可以说重写和重载在编写代码过程中的作用非同一般.
重写与重载的区别在于:

重写多态性起作用,对调用被重载过的方法可以大大减少代码的输入量,同一个方法名只要往里面传递不同的参数就可以拥有不同的功能或返回值。

用好重写和重载可以设计一个结构清晰而简洁的类,可以说重写和重载在编写代码过程中的作用非同一般.
作者: 廉伟杰    时间: 2014-1-20 21:25
本帖最后由 廉伟杰 于 2014-1-20 21:27 编辑

编译时的类型由声明变量时使用的类型决定,即编译类型由左边决定

运行类型由实际赋给变量的对象决定,即运行类型由右边决定

如  Person p = new Student();  编译类型是Person  运行类型是Student

把运行类型当做是对象的实际的类型,也就是对象的真正的类型

把编译类型当做是,把对象看成什么类型

如:我把一个真正的学生对象看成一个人

多态原因:如果编译时类型和运行时类型不同就出现多态


静态方法不能被覆写:因为方法的覆写和对象有关,而static修饰的方法和对象无关

希望我的回答对你能够有所帮助







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2