- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在提问之前,让我先解释一下我的理解和看法。
我同意方法重载是静态绑定(bind)(编译时绑定(bind)),但我看不到其中的多态性。
根据javadoc,只有polymorphism 。不存在编译时或运行时多态性。
根据 javadoc 中名为 Defining Methods 的部分,它解释了方法的重载。但是没有关于编译时多态性的内容。
据我所知:
如果你把多态性归入运行时多态性类别,那么当你改变你的JDK版本时,你只能看到“编译时多态性”:
如果您从较高版本的 JDK 切换到较低版本,您将开始看到编译错误。相同的代码在编译时表现不同,例如:lambda 表达式、菱形运算符、switch case 中的字符串、泛型等。
让我详细阐述我的观点,以及我对运行时多态性和编译时多态性如何出现在博客/教程中的预测:
Developer 1: Hey I read about polymorphism today. If you do coding to interface, you can achieve polymorphism. writing codes not tightly coupling to a class but instead writing it to interface by making loose coupling, calling a superclass method or interface method actually invokes method of subclass depending on instance passed.
Developer 2: Sorry, I didn't get you.
Developer 1: It's simple at run time which object instance you will pass, that instance method will be executed.
Developer 2: Ohh! Run Time. I got it.
Developer 1: Yes same piece of code, but at Run Time passed instances are different.
Developer 2: **Run Time! Okay, I got it.
Developer 2: Hey yesterday I've met Developer1, he was telling about some run-time polymorphism. By overriding methods in a sub-class we can achieve it.
Developer 3: Run time polymorphism by overriding methods? Then what is oveloading? Compile time polymorphism?
Developer 2: How do you say overloading as compile time polymorphism?
Developer 3: Because it is decided at compile time only.
Developer 2: Silent!
多态和接口(interface)编码最好的例子是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,依此类推。
上面我们发现相同的代码表现不同。
现在谁能告诉我相同的代码在编译时的行为不同。或者换句话说,向我展示在编译时绑定(bind)到不同方法(其他签名方法)的 add(3,4)
方法?
The Java programming language supports overloading methods, and Java can distinguish between methods with different method signatures.
该方法将根据签名匹配来执行。方法名称相同并不意味着存在多态性,因为调用方法的签名不同:
问题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);
}
问题1:如果方法重载是多态性,那么上述代码块中哪一段代码的行为不同?多态性在哪里?
问题2:方法调用add(3,4);
在什么场景下表现出多态性,除非修改为add(3,4, 5)
?
最佳答案
在Java世界中,多态是指类之间的多态。 IE。引用可能的多个子类及其共同的父类。在Java中,方法之间不存在多态性。
void add(int a, int b)
和 void add(int a, int b, int c)
在 Java 语法中是完全不同的方法。不应该如此 - 例如,在 C++ 中,您可以将它们相互转换 - 但在 Java 中却是如此。
这里要理解的关键概念是 method signature 。方法签名在语言中定义了识别各个方法的内容。 (例如,除了 void add(int a, int b);
之外,您根本无法声明 int add(int a, int b);
方法 -返回值不是Java中方法签名的一部分,因此编译器会将其解释为方法重新定义。)
关于java - 阐述 : Method overloading is a static/compile-time binding but not polymorphism. 将静态绑定(bind)与多态性相关联是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57734601/
我是 F# 的菜鸟,目前正在阅读 F# 3.0 中的专家。 它是我学习的第一种编译语言(我只知道用 R 编程) 在第 6 章第 117 页,我们没有太多仪式性地介绍 静态让和静态成员。我真的不明白它是
我很迷茫。我已经花几个小时广泛地复习了我的两个类(class)。没有什么是静态的,没有什么是静态引用的,但我无法摆脱这个错误。 A 类文件 (ClassA.php) privateVariable =
关于类公共(public)类声明,请看这两段代码: public class Helper { public static void CallMeganFox(string phoneNumb
我如何使用“super”关键字从父类(super class)(类“aa”)引用“a1” class aa { protected static int a1 = 2; } public class
class Perkusja { boolean talerze = true; boolean beben = true; void zagrajNaBebnie() { Sys
我试图在编译 C++ 程序时静态链接库。 g++ (GCC) 4.8.5 20150623(红帽 4.8.5-4) $ g++ -std=c++11 -I/home/jerry/Desktop/tin
$ javac TestFilter.java TestFilter.java:19: non-static variable this cannot be referenced from a sta
这个问题在这里已经有了答案: How do I create a global, mutable singleton? (7 个答案) How can you make a safe static
“覆盖”静态数组时我遇到了一个棘手的问题。我有静态数组(为简单起见),它们在不同的派生类中具有固定长度,但在编译时仍然知道所有大小。我在基类中也有一个虚函数,但我不知道如何解决在派生类中覆盖这些数组和
我刚刚在遗留代码中发现了这一点。我知道使用宏,每当使用名称时,它都会被宏的内容替换。它们最常用于为数字常量提供符号名称。我所知道的是预处理没有类型安全、范围的概念。 这样做的真正好处是什么? #def
将 Singleton 实例声明为 static 还是声明为 static final 更好? 请看下面的例子: 静态版本 public class Singleton { private s
问题: 我观察到的行为是 TypeScript 的预期行为吗? 我观察到的行为是 ECMAScript 6 的预期行为吗? 是否有一种简单的方法可以返回继承层次结构以处理每个级别的“myStatic”
在php中,访问类的方法/变量有两种方法: 1. 创建对象$object = new Class(),然后使用”->”调用:$object->attribute/functi
我尝试向 ExpandoObject 添加一个动态方法,该方法会返回属性(动态添加)给它,但它总是给我错误。 我在这里做错了吗? using System; using System.Collecti
我试图获得一个静态链接到我的程序的音频库。我用 this灵活的包。为了让它运行,我必须按照描述构建 soloud 库 here .下载后不久,我在“build”文件夹中运行了“genie --with
这是我的webpack.prod.config.js代码 const path = require('path'); const { CleanWebpackPlugin } = require('c
我想知道什么时候应该对变量和(或)方法使用静态、最终、静态最终参数。据我了解: final:类似于c++中的const参数。它基本上意味着值(或在方法中 - 返回值)不会改变。 静态:这意味着值(或方
我一直在阅读有关使用静态对象作为锁的内容,最常见的示例如下: public class MyClass1 { private static final Object lock = new Obje
在 Visual Basic 2008 中,我知道有两种不同的方法可以完成同一件事: 成员(member)级别的 Dim: Dim counter1 as integer = 0 Dim counte
static public final int i = 0; public static final int i = 0; 两者都工作正常。 为什么同样的事情可以用两种不同的风格来完成? 最佳答案 因
我是一名优秀的程序员,十分优秀!