本教程詳細(xì)講解了如何在java中通過讀取結(jié)構(gòu)化用戶輸入,利用`scanner`和`string.split()`方法解析數(shù)據(jù),并根據(jù)輸入類型(如“plant”或“flower”)創(chuàng)建相應(yīng)的多態(tài)對(duì)象。這些對(duì)象隨后被存儲(chǔ)到`arraylist
在Java應(yīng)用程序開發(fā)中,我們經(jīng)常需要從用戶那里獲取結(jié)構(gòu)化輸入,例如一系列不同類型的數(shù)據(jù)記錄。一個(gè)常見的場(chǎng)景是,我們有一個(gè)基類(如Plant)和它的派生類(如Flower),需要根據(jù)用戶輸入動(dòng)態(tài)創(chuàng)建這些類的對(duì)象,并將它們統(tǒng)一存儲(chǔ)在一個(gè)集合中。ArrayList結(jié)合Java的繼承和多態(tài)特性,為這種需求提供了優(yōu)雅的解決方案。本教程將引導(dǎo)您完成一個(gè)具體的示例,展示如何正確解析用戶輸入,創(chuàng)建多態(tài)對(duì)象,并將其存儲(chǔ)在ArrayList中進(jìn)行管理。
用戶通常以行(line)的形式提供結(jié)構(gòu)化數(shù)據(jù),每行包含多個(gè)由空格分隔的字段。例如:
plant Spirea 10 flower Hydrangea 30 false lilac -1
其中,-1表示輸入結(jié)束。
初學(xué)者在處理這類輸入時(shí),常遇到的一個(gè)陷阱是Scanner類的next()和nextLine()方法的選擇。
立即學(xué)習(xí)“Java免費(fèi)學(xué)習(xí)筆記(深入)”;
如果使用scnr.next()來讀取包含多個(gè)字段的行,例如plant Spirea 10,next()只會(huì)讀取到plant,而忽略了同一行中的Spirea和10。隨后對(duì)這個(gè)單個(gè)詞進(jìn)行split(" ")操作,會(huì)導(dǎo)致String[] info數(shù)組的長度不足,從而在嘗試訪問info[1]、info[2]等元素時(shí)拋出ArrayIndexOutOfBoundsException。
解決方案:使用 Scanner.nextLine()
正確的做法是使用scnr.nextLine()來讀取用戶輸入的整行數(shù)據(jù),然后對(duì)這一整行字符串使用String.split(" ")方法進(jìn)行分割。這樣可以確保所有字段都被正確地捕獲并存儲(chǔ)到字符串?dāng)?shù)組中。
假設(shè)我們已經(jīng)定義了Plant基類和Flower派生類,它們都包含設(shè)置和獲取屬性的方法,以及一個(gè)printInfo()方法用于打印各自的信息。Flower類繼承自Plant類,這意味著Flower對(duì)象可以被視為Plant對(duì)象,從而可以存儲(chǔ)在ArrayList<Plant>中,這是多態(tài)性的體現(xiàn)。
初始化 ArrayList: 創(chuàng)建一個(gè)能夠存儲(chǔ)Plant類型對(duì)象的ArrayList。由于多態(tài)性,它也能存儲(chǔ)Flower對(duì)象。
ArrayList<Plant> myGarden = new ArrayList<Plant>();
循環(huán)讀取并解析輸入: 使用while循環(huán)持續(xù)讀取用戶輸入,直到遇到終止符-1。在循環(huán)內(nèi)部:
統(tǒng)一輸出:利用多態(tài)性 定義一個(gè)printArrayList方法,接收ArrayList<Plant>作為參數(shù)。通過遍歷列表,并對(duì)每個(gè)元素調(diào)用其printInfo()方法,可以實(shí)現(xiàn)統(tǒng)一的輸出。由于多態(tài)性,當(dāng)列表中的元素是Flower對(duì)象時(shí),會(huì)自動(dòng)調(diào)用Flower類中重寫的printInfo()方法,而當(dāng)是Plant對(duì)象時(shí),則調(diào)用Plant類的printInfo()方法。
以下是修正后的PlantArrayListExample.java代碼,它展示了如何正確實(shí)現(xiàn)上述邏輯:
import java.util.Scanner; import java.util.ArrayList; // 假設(shè) Plant 類和 Flower 類已定義如下(為完整性提供示例結(jié)構(gòu)): // class Plant { // private String plantName; // private int plantCost; // // public void setPlantName(String plantName) { this.plantName = plantName; } // public void setPlantCost(int plantCost) { this.plantCost = plantCost; } // public String getPlantName() { return plantName; } // public int getPlantCost() { return plantCost; } // // public void printInfo() { // System.out.println("Plant Name: " + plantName + ", Cost: " + plantCost); // } // } // // class Flower extends Plant { // private boolean isAnnual; // private String colorOfFlowers; // // // 假設(shè) setPlantType 方法用于設(shè)置 isAnnual // public void setPlantType(boolean isAnnual) { this.isAnnual = isAnnual; } // public void setColorOfFlowers(String colorOfFlowers) { this.colorOfFlowers = colorOfFlowers; } // public boolean getIsAnnual() { return isAnnual; } // public String getColorOfFlowers() { return colorOfFlowers; } // // @Override // public void printInfo() { // System.out.println("Flower Name: " + getPlantName() + ", Cost: " + getPlantCost() + // ", Annual: " + isAnnual + ", Color: " + colorOfFlowers); // } // } public class PlantArrayListExample { /** * 打印 ArrayList 中所有植物或花卉的信息。 * 利用多態(tài)性,調(diào)用每個(gè)對(duì)象的 printInfo() 方法。 * @param myGarden 存儲(chǔ) Plant 或 Flower 對(duì)象的 ArrayList */ public static void printArrayList(ArrayList<Plant> myGarden) { for (Plant plant : myGarden) { // 使用增強(qiáng)型 for 循環(huán)提高可讀性 plant.printInfo(); } } public static void main(String[] args) { Scanner scnr = new Scanner(System.in); ArrayList<Plant> myGarden = new ArrayList<Plant>(); System.out.println("請(qǐng)輸入植物或花卉信息 (例如: 'plant Spirea 10', 'flower Hyd
以上就是Java中處理多態(tài)對(duì)象列表:從用戶輸入到ArrayList的實(shí)踐的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)