多态的的实现机制

                                        多态的的实现机制


目录

                                        多态的的实现机制

 

一:概述

二:多态的表现方式

1.方法重载(overload)

2.方法覆盖(override)

三:重载与覆盖的区别

1.重载:

2.覆盖:

3.总结:

一:概述

多态作为Java面向对象程序设计开发的一大特性,是面向对象程序设计中实现代码重用(复用)的一个重要的机制,它主要体现在,当我们操作对象的时候,同样的操作针对于不同的对象,会产生不同的效果,从而实现不同的功能。

比如String类中的“+”操作,“1+2”用来实现两个整数型数字的相加,而“1”+“2”实现的却是两个字符串的连接操作。同样的对象,产生的结果却是不相同的。

二:多态的表现方式

在Java中多态的表现方式有两种:重载(overload)、覆盖(override)。

1.方法重载(overload)

既然说到了重载,那么什么是重载(重载的具体实现)呢?重载就是指在同一个类中,有多个方法的方法签名相同,但是它们方法的参数类型,参数个数不一样,方法的返回类型可以不相同,方法的修饰符也可以不相同。演示如下:

class Demo{
    int NUMBER;
    Demo() {
        System.out.println("无参构造函数");
        NUMBER = 4;
    }
    Demo(int i) {
        System.out.println("i的值为: " + i );
        NUMBER= i;
    }
    void info() {
        System.out.println("NUMBER的值为: " + NUMBER);
    }
    void info(String s) {
        System.out.println("i的值为: "+ s + ";NUMBER的值为: " + NUMBER);
    }
}
public class DemoMain {
    public static void main(String[] args) {
        Demo t = new Demo(3);
        t.info();
        t.info("重载方法");
        //重载构造函数
        new Demo();
    }
}

因此在编译时就可以确定该调用的方法。所以说重载可以看做是一个类中方法的多态性。

2.方法覆盖(override)

在之前的继承与组合中就已经提到了覆盖,当子类中定义的成员变量与父类中的成员变量重名,子类中的方法签名与父类中的方法签名相同(重名)时都会出现覆盖。

子类可以覆盖父类的方法,所以在父类与子类中同样的Math却有着不同的表现形式。在Java中,基类(父类)的引用变量不仅指向基类(父类)的实例化对象,也可以指向其派生类(子类)的实例化对象;同样,接口的引用变量也可以指向其实现类的实例化对象。方法的覆盖原则如下:

覆盖方法必须和父类中被覆盖的方法有着相同的方法签名、参数和返回值类型(继承与组合提到过)。 覆盖方法不能有着比父类中被覆盖的方法更严格的访问权限(非私有性)。 覆盖方法不能比父类中被覆盖方法抛出更多的异常。如下:

class Demo{
    public Demo(){
        Stringinfo();
    } 
    public void info(){
        System.out.println("Demo info()");
    }
    public void Stringinfo(){
        System.out.println("Demo Stringinfo()");
    }
}
class IDemo extends Demo{
    public void info(){
        System.out.println("IDemo info()");
    }
    public void Stringinfo(){
        System.out.println("IDemo Stringinfo()");
    }
}
public class Test{
    public static void main (String [] args){
        Demo demo = new IDemo();
        demo.info();
        demo.Strnginfo();
    }
}

由于子类中的IDemo的info()方法和Strnginfo()方法与父类Demo的方法同名,因此,IDemo中的方法会覆盖Demo中的方法,在main方法中调用Demo demo = new IDemo();语句时会调用Demo类中的构造函数,但是因为Java语言的多态性,此时会调用子类(IDemo)中的Stringinfo()方法,而并非父类(Demo)中的Stringinfo()方法。(注意:只有类中的方法才会有多态的概念,类中的成员是没有多态概念的)举例如下:

class Demo{
    public int i = 1;
}
class IDemo extends Demo{
    public int i = 2;
}
public class Test{
    public static void main (String[] args){
        Demo demo = new IDemo();
        System.out.println(demo.i);
    }
}

当程序运行后产生的结果依然是i = 1;所以说,成员变量是无法实现多态的,成员变量的值是父类还是子类并不取决于创建对象的类型,而是取决于所定义变量的类型。demo所属的类型是Demo,所以demo.i的值是Demo中定义的i,而不是IDemo中的i的值,所以i的值仍未1。

三:重载与覆盖的区别

1.重载

(1):重载通过不同的方法参数来区分(个数、参数类型、参数顺序)。

(2):不能通过方法的访问权限、返回值类型、抛出的异常类型来进行重载。

(3):在继承中,如果父类的访问权限为private(私有的),那么就不能在子类中对父类中的方法进行重载,如果此时子类也定义了一个与父类方法签名相同的函数,此时新定义的这个函数只是一个新的方法,并不会达到重载的目的。

2.覆盖:

(1):子类中的覆盖方法必须要跟父类中的被覆盖方法有着相同的函数名和参数。

(2):子类中的覆盖方法的返回值必须和父类中的被覆盖方法的返回值类型相同。

(3):子类中的覆盖方法抛出的异常跟父类或其子类中的被覆盖方法所抛出的异常相同。

(4):父类中覆盖方法的权限不能为private。

3.总结:

(1)覆盖是子类与父类之间的关系,重载是同一个类中方法之间的关系。

(2)覆盖只能由一个方法或者一对方法产生关系,重载是多个方法之间的关系。

(3)覆盖要求参数列表相同,重载要求参数列表不同。

(4)覆盖中调用方法体是根据对象的类型来决定的,重载是根据调用的形参列表(参数)来选择方法体的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值