Java中的多态性和动态绑定
来源:DZone 多态性是面向对象编程的核心概念之一。无论您是 Java 编程新手还是经验丰富的开发人员,您都应该知道什么是多态性及其工作原理。大多数开发人员声称精通该主题,但当涉及静态和动态绑定等其他复杂功能时,他们中的许多人就失去了信心。Java中的多态性是什么?
多态性意味着具有多种形式。在编程中,这是指信号或消息以多种形式出现的能力。现实生活中的例子
一个人可以同时表现出多种特征。例如,母亲可以同时是妻子、女儿、姐妹、公司员工等。因此,一个人在不同的条件下可能表现出不同的特征。这称为多态性。多态性的重要性
多态性是任何面向对象编程语言(例如 Java)最重要的特性之一。借助多态性,可以以不同的方式执行相同的任务。多态性的类型
在Java中,多态可以分为两类:- 编译时多态性(静态链接)
- 运行时多态(Runtime、动态绑定)
编译时多态性
编译时多态性也称为静态链接。这种类型的多态性可以通过函数重载或运算符重载来实现。但在 Java 中,这仅限于函数重载,因为 Java 不支持运算符重载。 函数重载 当至少有两个函数或方法具有相同的函数名,但要么它们包含的参数个数不同,要么对应参数的至少一种数据类型不同(或两者都有),则称为函数或方法重载,这些函数称为重载函数。 示例 1 到目前为止我们已经研究了什么是函数重载。现在让我们尝试演示软件功能重载。class Main {
// Method 1
// Method with 2 integer parameters
static int Addition(int a, int b)
{
// Returns sum of integer numbers
return a + b;
}
// Method 2
// having the same name but with 2 double parameters
static double Addition(double a, double b)
{
// Returns sum of double numbers
return a + b;
}
public static void main(String args[]) {
// Calling method by passing
// input as in arguments
System.out.println(Addition(12, 14));
System.out.println(Addition(15.2, 16.1));
}
}
您可以在此处 运行上述程序。 程序说明:
-
上面的程序由两个同名的静态函数组成:Addition。
-
这里,两个函数包含相同数量的参数,但它们对应的参数不同。
-
方法 1接受两个整数参数,而方法 2接受两个双精度参数。
-
在主函数中,我们首先调用Addition(12, 14)函数。传递的参数是整数(12和14),所以这里会调用方法1 。
-
然后我们调用Addition(15.2, 16.1)函数。由于传递的参数是double数据类型(15.2和16.1),所以这次会调用方法2。
-
这就是Java中根据不同的参数数据类型来实现函数重载的。
class Main {
// Method 1
// Method with 2 integer parameters
static int Addition(int a, int b)
{
// Returns sum of integer numbers
return a + b;
}
// Method 2
// having the same name but with 3 integer parameters
static double Addition(double a, double b)
{
// Returns sum of integer numbers
return a + b;
}
public static void main(String args[]) {
// Calling method by passing
// input as in arguments
System.out.println(Addition(12, 14));
System.out.println(Addition(15.2, 16.1));
}
}
您可以在此处 运行上述程序。 程序说明:
-
上面的程序由两个同名的静态函数组成:Addition。
-
这里,两个函数包含不同数量的参数,但前两个对应参数的数据类型相同(整数)。
-
方法 1采用两个整数参数,方法 2采用三个整数数据类型参数。
-
在主函数中,我们首先调用Addition(2, 3)函数。由于传递的参数是整数(2和3),所以这里会调用方法1。
-
然后我们调用Addition(4, 5, 6)函数。传递的参数是double数据类型(4,5,6),所以这次会调用方法2。
-
这就是 Java 中函数根据不同数量的参数进行重载的方式。
class Main {
// Method 1
// Method with 2 integer parameters
static int Addition(int a, int b)
{
// Return the sum
return a + b;
}
// Method 2
// having the same name but with 3 parameters
// 1st parameter is of type double and other parameters
// are of type integer
static double Addition(double a, int b, int c)
{
// Return the sum
return a + b + c;
}
public static void main(String args[]) {
// Calling method by passing
// input as in arguments
System.out.println(Addition(2, 4));
System.out.println(Addition(4.2, 6, 10));
}
}
您可以在此处 运行上述程序。 程序说明:
-
上面的程序由两个同名的静态函数组成:Addition。
-
两个函数包含不同数量的参数,并且第一个对应元素的数据类型也不同。
-
方法 1采用两个整数参数,而方法 2采用三个参数 - 第一个参数为double 类型,另外两个参数为整数数据类型。
-
在主函数中,我们首先调用Addition(2, 4)函数。由于传递的参数是整数(2和4),所以这里会调用方法1。
-
然后我们调用Addition(4.2, 6, 10)函数。传递的第一个参数是整型,其余参数都是double (4.2,6,10)数据类型,所以这次会调用方法2。
-
这就是Java根据不同参数个数以及对应参数不同数据类型来实现函数重载的方法。
运行时多态性
此选项也称为动态链接。在此过程中,仅允许在运行时调用为另一个函数创建的函数。我们可以在Java中使用方法重写来实现动态绑定。方法重写
当基类中的方法在派生类中具有定义时,Java 中的方法重写就会发生。基类方法或函数称为重写方法。// Class 1
class Parent {
// Print method
void Print()
{
// Print statement
System.out.println("Inside Parent Class");
}
}
// Class 2
class Child1 extends Parent {
// Print method
void Print() { System.out.println("Inside Child1 Class"); }
}
// Class 3
class Child2 extends Parent {
// Print method
void Print()
{
// Print statement
System.out.println("Inside Child2 Class");
}
}
class Main {
public static void main(String args[]) {
// Creating an object of class Parent
Parent parent = new Parent();
parent.Print();
// Calling print methods
parent = new Child1();
parent.Print();
parent = new Child2();
parent.Print();
}
}
您可以在此处 运行上述程序。 程序说明:
-
上面的程序由三个类组成:Parent(类1)、Child1(类2)和Child2(类3)。类 2和类 3继承类 1。
-
Parent有一个名为Print()的方法。在此函数内,我们打印“ Inside Parent Class ”。Child1和Child2也有Print()函数,它们基本上重写了Parent类的Print()函数,并分别将“ Inside Child1 Class ”和“ Inside Child2 Class ”打印到控制台。
-
从main函数中,我们首先创建一个名为parent的父类对象。然后我们使用这个对象来调用父类的print方法。因此控制台上会打印“ Inside Parent Class ”。
-
之后,我们调用Child1类的默认构造函数并调用Print()函数。请注意,现在将调用Child1类中定义的Print()方法,因为我们已经重写了父类的Print()方法。因此,控制台上将打印“ Inside Child1 Class ”。
-
最后,我们调用Child2类的默认构造函数并调用Print()函数。这里将调用Child2类中定义的Print()方法,因为我们重写了父类的Print()方法。因此,控制台上将打印“ Inside Child2 Class ”。
-
这就是Java中方法重写的实现方式。
结果
在这篇文章中,我们学习了Java中的多态性。然后我们更深入地研究了这个主题,讨论了 Java 中的两种类型的多态性:编译时多态性和运行时多态性。我们通过程序演示了如何在Java中实现静态和动态绑定。Java中的for循环+forEach循环语法示例
来源:FreeCodeCamp 编程中的循环是连续执行直到满足特定条件的指令序列。在本文中,我们将了解Java 中的for和forEach循环。Java 中的 For 循环语法
以下是创建for循环的语法:for (initialization; condition; increment/decrement) {
// code to be executed
}
我们看一下代码中的一些关键字:
-
for表示我们将创建一个循环。它后面是括号,其中包含使循环工作所需的所有内容。
-
初始化将初始变量定义为循环的起点,通常是整数。
-
条件指定循环应执行多少次。
-
每次运行循环时递增/递减都会递增/递减初始变量的值。随着变量值的增加/减少,它趋向于指定的条件。
-
请注意,每个关键字均以分号 ( ; ) 分隔。
for(int x = 1; x <=5; x++) {
System.out.println(x);
}
/*
1
2
3
4
5
*/
在上面的示例中,起始变量是值为 1 的x。只要x的值小于或等于 5,循环就会继续运行 - 这是条件。x++在每次运行后递增x的值。我们继续打印x的值,它在 5 后停止,因为满足了条件。增加到 6 是不可能的,因为它大于且不等于 5。在下面的示例中,我们将使用 for循环打印出数组中的所有值。
int[] randomNumbers = {2, 5, 4, 7};
for (int i = 0; i < randomNumbers.length; i++) {
System.out.println(randomNumbers[i]);
}
// 2
// 5
// 4
// 7
这与上一个例子几乎相同。这里我们使用数组的长度作为条件,并且变量的初始值为零,因为数组的第一个元素的序数为零。
Java 中的 forEach 循环语法
forEach循环专门用于迭代数组的元素。它的语法如下:for (dataType variableName : arrayName) {
// code to be executed
}
您会注意到这里的语法比for循环短。forEach循环也以for关键字开始。我们不是用值初始化变量,而是首先指定数据类型(它必须与数组的数据类型匹配)。接下来是变量的名称和数组的名称,用冒号分隔。这是一个帮助您更好地理解语法的示例:
int[] randomNumbers = {2, 5, 4, 7};
for (int x : randomNumbers) {
System.out.println(x + 1);
}
/*
3
6
5
8
*/
在此示例中,我们迭代了每个元素并将其初始值增加 1。默认情况下,循环在迭代完数组的所有元素后停止。这意味着我们不需要向变量传递任何值或指定循环结束的任何条件。
GO TO FULL VERSION