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