在我提出问题之前,让我先解释一下我的理解和看法。
我同意方法重载是静态绑定(编译时绑定),但我看不到多态。
根据javadoc,只有多态。没有编译时或运行时多态性。
根据javadoc在一个名为定义方法的部分中的说法,它解释了方法的重载。但是编译时多态没有任何意义。
据我说:
如果将多态性放入运行时多态性类别,则只有在更改JDK版本时才能看到“编译时多态性”:
如果您从更高的JDK版本切换到更低的版本,您将开始看到编译错误。在编译过程中,相同的代码表现不同,例如: lambda表达式、菱形操作符、开关情况下的字符串、泛型等等。
让我阐述一下我的观点,我对运行时多态性和编译时多态性的预测是如何出现在博客/教程中的:
Conversation1
Developer 1:嘿,我今天读到了关于多态性的文章。如果对接口进行编码,则可以实现多态性。编写代码不是紧密耦合到类,而是通过松散耦合将其写入接口,调用超类方法或接口方法实际上根据传递的实例调用子类方法。 开发者2:对不起,我没收到你的消息。 Developer 1:在运行时简单地传递了哪个对象实例,该实例方法将被执行。 Developer 2:噢!运行时。这样啊,原来是这么回事。 Developer 1:是同一段代码,但在运行时传递的实例是不同的。 Developer 2:**运行时!好了,我明白了。
Conversation2
开发人员2:嘿,昨天我遇到了Developer1,他告诉我们一些运行时多态。通过重写子类中的方法,我们可以实现它。 Developer 3:通过重写方法实现运行时多态性?那么,什么是速度?编译时间多态性? Developer 2:,如何将重载称为编译时多态性? Developer 3:,因为它只在编译时决定。 开发者2:沉默!
多态性和接口编码最好的例子是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实例的方法。也就是说,它执行重写的方法。如果您注册了Oracle驱动程序,那么它可以用于Oracle,依此类推。
上面我们发现相同的代码行为不同。
现在,有人可以在编译时向我展示相同的代码的不同行为吗?或者换句话说,在编译期间向我展示与不同方法(其他签名方法)相结合的add(3,4)
方法?
Java编程语言支持重载方法,Java可以区分具有不同方法签名的方法。
该方法将根据匹配的签名执行。方法的同名并不意味着存在多态性,因为调用方法签名是不同的:
Queestion1:如果您不更改调用方法签名,它会调用不同的方法,而不是匹配哪种签名的方法?在任何情况下,它的行为会有所不同吗?
让我们看一下方法重载:
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);
}
问题1:如果方法重载是多态的,那么在上面的代码块中,哪一段代码的行为是不同的?多态在哪里?
问题2:方法调用add(3,4);
在什么场景中显示出多态性,除非它被修改为add(3,4,5)
编辑
@FutureVisitor由于这个线程没有发现支持方法重载作为一种多态类型的答案(即使在被问了一个月的问题之后),在没有任何理由的情况下接受有利于方法重载的答案并不是多态,如果在我的方法重载不是多态的论点中有任何答案点问题将被接受并支持他们的观点。
发布于 2019-09-01 13:09:44
在Java世界中,多态性意味着类之间的多态性。例如,引用可能的多个子类及其共同的父类。在Java中,方法之间没有多态性。
void add(int a, int b)
和void add(int a, int b, int c)
在Java语法中是完全不同的方法。不应该是这样的--例如,在C++中,您可以将它们相互转换为-,但在Java中是这样的。
这里要理解的关键概念是方法签名。方法签名在一种语言中定义了识别工业方法的内容。(例如,除了一个void add(int a, int b);
之外,您根本不能声明一个int add(int a, int b);
方法-返回值不是Java中方法签名的一部分,因此编译器会将其解释为方法重新定义。)
发布于 2019-10-04 19:59:14
人们说
都错了.
只有重写才不是多态。但是重写有助于实现多态性。如果没有向上转换,则无法实现多态性。
重载是一个概念,它使用方法名称和参数签名将方法调用绑定到方法主体,并且只能在编译时进行预测。但这与多态性无关。在方法重载的情况下,不存在行为更改。只有在更改调用方法签名(即只有将代码修改为add(3,4);
为add(3,4,5);
,因此方法重载不是多态)时,才能在今天编译或一年后进行编译。
https://stackoverflow.com/questions/57734601
复制相似问题