⑴ java为什么要用多态,什么是多态
多态性在Java编程中是一种核心概念,它允许使用同一类名的变量引用多种不同类型的对象,从而实现代码的复用和灵活性。多态性主要分为两种类型:重载和重写。
重载式多态,也称为编译时多态,指的是在同一类中方法的重载。通过不同的参数列表来区分不同的方法,编译器在编译时就能确定调用哪个方法。例如,一个类可以有多个同名的方法,但参数不同,编译器会根据传入的参数类型和数量自动选择相应的方法调用。
重写式多态,也称为运行时多态或动态多态,指的是子类继承父类后,重写父类中的方法。在运行时,父类引用指向子类对象时,会根据实际的对象类型动态调用相应的方法。这种多态性是通过动态绑定(dynamic binding)实现的,即在执行期间根据实际对象类型调用方法,确保调用的是子类的特定实现。
实现多态性需要满足三个条件:继承、接口和方法重写。当父类引用指向子类对象时,通过向上转型(upcasting)可以访问到子类继承自父类的方法。然而,向上转型丢失了子类特有的方法,因此,若想调用子类独有的方法,需要进行向下转型(downcasting)。
以下是一个简单的示例,展示了多态性在Java中的应用。通过代码,我们可以看到不同对象调用相同方法时的动态行为:
在示例中,我们创建了一个`Animal`类和两个子类`Cat`和`Dog`。当使用父类引用调用`eat()`方法时,会根据实际对象类型调用相应的子类实现。向上转型允许使用父类引用访问子类对象,但会丢失子类特有的方法。向下转型则可以通过强转`cast`恢复子类特有的方法。最后,我们通过一个面试题进一步加深对多态性的理解,展示了向上转型和向下转型的用法以及它们各自的限制。
总的来说,多态性是Java中一种强大的特性,它允许我们编写更加灵活、易于维护和扩展的代码。通过合理利用多态,我们可以避免硬编码特定对象类型,提高代码的复用性和适应性。
⑵ java中重载,继承,重写和多态的区别
(1)方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。
(2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具
有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型
来决定具体使用哪个方法, 这就是多态性。
(3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。
然后我们再来谈谈 重写(Overriding)
(1)父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某
方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
(2)若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,
则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键 字引用了当前类的父类。
(3)子类函数的访问修饰权限不能少于父类的;
⑶ JAVA中的多态与重载有什么区别
多态性
通过继承,一个类可以用作多种类型:可以用作它自己的类型、任何基类型,或者在实现接口时用作任何接口类型。这称为多态性
重载
每个类型成员都有一个唯一的签名。方法签名由方法名称和一个参数列表(方法的参数的顺序和类型)组成。只要签名不同,就可以在一种类型内定义具有相同名称的多种方法。当定义两种或多种具有相同名称的方法时,就称作重载。即重载时相同名称成员的参数列表是不相同的(参数顺序和类型)。
继承,重写和隐藏成员
派生的类型继承其基本类型的所有成员;也就是说,这些成员是在派生类型之上定义的,并可用于派生类型。继承成员的行为和质量可以通过以下两种方式来修改:
1、派生类型可通过使用相同的签名定义一个新成员,从而隐藏继承的成员。将先前的公共成员变成私有成员,或者为标记为 final 的继承方法定义新行为时,可以采取这种方法。
2、派生类型可以重写继承的虚方法。重写方法提供了对方法的一种新定义,将根据运行时的值的类型,而不是编译时已知的变量类型来调用方法。只有当虚方法没有标记为 final 且新方法至少可以像虚方法一样进行访问的情况下,成员才能重写虚方法。
方法名,参数相同形成重写,重写的方法不能降低原方法的"可见度",也不能改变原方法的返回值类型。
方法名相同,参数不同(个数、类型)形成重载,重载的方法可看成一个全新的方法,与原方法相比它可以有不同的"可见度"和“返回值类型”。如下例:
class A {
protected int method1(int a, int b) { return 0; }
}
public class B extends A{
public int method1(int a, int b) { return 0; } //正确,重写父类方法,可以扩大访问权限
//private int method1(int a, int b) { return 0; } //错误,重写父类方法,不能降低了访问权限
//private long method1(int a, int b) { return 0; } //错误,重写父类方法,不能改变返回值类型
public short method1(int a, long b) { return 0; }//正确,重载自身的方法,可以有不同的访问权限和返回值类型
private int method1(int a, long b) { return 0; }//正确,重载自身的方法,可以有不同的访问权限和返回值类型
}
但这里 方法public short method1(int a, long b) { return 0; }和 方法private int method1(int a, long b) { return 0; }不能同时存在,因为在同一类中,不允许存在相同名字和参数类型的方法(重写的方法)。
⑷ java里,方法重载是不是多态的一种实现
是。
什么是多态:
1、面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是最重要的知识点。
2、多态的定义:指允许不同类的对轿判散象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
3、实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的冲慧类型调用其相应的方法。
4、多态的作用:消除类型之闭氏间的耦合关系。
多态存在的三个必要条件:
一、要有继承;
二、要有重写或重载;
三、父类引用指向子类对象。
java实现多态的方式:
1、在同一类中多个同名函数同时存在,具有不同的参数个数/类型,实现重载
2、在继承关系中,实现同名函数的重写。子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法