在提问之前,我先阐述一下我的理解和看法。
- 除非有向上转换,否则仅通过重写无法实现多态性。由于它只能在运行时看到,人们可能将其命名为运行时多态性。 (我不反对打电话多态性 as 运行时多态性)
-
我有异议打电话方法重载 as 编译时多态性 or 多态性.
我同意方法重载是静态绑定(编译时绑定),但我看不到其中的多态性。
根据javadoc,只有多态性。不存在编译时或运行时多态性。
根据 javadoc 中的一个名为定义方法,它解释了方法的重载。但是没有关于编译时多态性的内容。
据我说:
如果你把多态性归入运行时多态性范畴,那么当你改变你的JDK版本时,你只能看到“编译时多态性”:
如果您从较高版本的 JDK 切换到较低版本,您将开始看到编译错误。相同的代码在编译时表现不同,例如:lambda 表达式、菱形运算符、switch case 中的字符串、泛型等。
让我详细阐述我的观点,以及我对运行时多态性和编译时多态性如何出现在博客/教程中的预测:
对话1
开发商1:嘿,我今天读到了多态性。如果对接口进行编码,就可以实现多态性。编写不与类紧密耦合的代码,而是通过松散耦合将其写入接口,调用超类方法或接口方法实际上会根据传递的实例调用子类的方法。
开发者2:抱歉,我没听懂你的意思。
开发商1:在运行时很简单,您将传递哪个对象实例,将执行该实例方法。
开发者2: Ohh! Run Time。我得到了它。
开发商1:是的,同一段代码,但在运行时传递的实例是不同的。
开发人员 2:**运行时!好的,我明白了。
对话2
开发者2:嘿,昨天我遇到了 Developer1,他讲述了一些运行时多态性。通过重写子类中的方法我们可以实现它。
开发商3:通过覆盖方法实现运行时多态性?那么什么是超载呢?编译时多态?
开发者2:你怎么说重载作为编译时多态性?
开发商3:因为它仅在编译时决定。
开发者2: Silent!
多态性 and 编码到接口最好的例子是 java.sql:
java.sql.Connection conn = DriverManager.getConnection(DB_URL,USER,PASS);
java.sql.Statement stmt = conn.createStatement();
java.sql.ResultSet rs = stmt.executeQuery(sql);
根据注册的驱动程序,同一段代码的行为有所不同。这意味着,如果我们注册 Mysql 驱动程序,由于多态性,该代码将执行 mysql 实例的方法。 IE。它执行重写的方法。如果您注册了 Oracle 驱动程序,它就适用于 Oracle,等等。
上面我们发现相同的代码表现不同。
现在任何人都可以向我展示相同的代码在编译时的行为不同。或者换句话说,告诉我add(3,4)
方法在编译时绑定到不同的方法(其他签名方法)?
根据javadoc,
Java编程语言支持重载方法,并且Java可以区分具有不同方法签名的方法。
该方法将根据签名匹配来执行。方法具有相同的名称并不意味着存在多态性,因为调用方法的签名不同:
问题1:如果不更改调用方法签名,它会调用除签名匹配的方法之外的其他方法吗?在任何情况下它的行为都会有所不同吗?
我们来看看方法重载:
public void add(int a, int b)
{
System.out.println(a+b);
}
public void add(int a, int b, int c)
{
System.out.println(a+b+c);
}
public static void main(String[] args)
{
add(3,4);
add(3,4,5);
}
问题一:如果方法重载是多态性,那么上述代码块中哪一段代码的行为不同?这里的多态性在哪里?
问题2:方法调用add(3,4);
在什么场景下才表现出多态性,除非修改为add(3,4,5)
?
EDIT
@FutureVisitor since this thread found no answers in favor of method overloading as a type of polymorphism(Even after a month of question being asked), without any justification accepting answer in favor of
Method overloading is not a polymorphism, if any answer points problem in my argument of method overloading is not polymorphism will be accepted and supported their views.