亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索
首頁 > Java > java教程 > 正文

Java中處理多態(tài)對(duì)象列表:從用戶輸入到ArrayList的實(shí)踐

霞舞
發(fā)布: 2025-10-16 14:27:01
原創(chuàng)
177人瀏覽過

Java中處理多態(tài)對(duì)象列表:從用戶輸入到ArrayList的實(shí)踐

本教程詳細(xì)講解了如何在java中通過讀取結(jié)構(gòu)化用戶輸入,利用`scanner`和`string.split()`方法解析數(shù)據(jù),并根據(jù)輸入類型(如“plant”或“flower”)創(chuàng)建相應(yīng)的多態(tài)對(duì)象。這些對(duì)象隨后被存儲(chǔ)到`arraylist`中,并通過統(tǒng)一的`printinfo()`方法進(jìn)行輸出,展示了面向?qū)ο缶幊?/a>中多態(tài)性的實(shí)際應(yīng)用。

引言:處理結(jié)構(gòu)化用戶輸入與多態(tài)集合

在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)行管理。

核心挑戰(zhàn):精確解析用戶輸入

用戶通常以行(line)的形式提供結(jié)構(gòu)化數(shù)據(jù),每行包含多個(gè)由空格分隔的字段。例如:

plant Spirea 10 
flower Hydrangea 30 false lilac 
-1
登錄后復(fù)制

其中,-1表示輸入結(jié)束。

初學(xué)者在處理這類輸入時(shí),常遇到的一個(gè)陷阱是Scanner類的next()和nextLine()方法的選擇。

立即學(xué)習(xí)Java免費(fèi)學(xué)習(xí)筆記(深入)”;

  • Scanner.next():只讀取輸入流中的下一個(gè)“詞”(token),直到遇到空白符(空格、Tab、換行符等)。它不會(huì)讀取行尾的換行符。
  • Scanner.nextLine():讀取輸入流中的當(dāng)前行的剩余部分,直到行尾的換行符。它會(huì)消費(fèi)掉行尾的換行符。

如果使用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。

飛書多維表格
飛書多維表格

表格形態(tài)的AI工作流搭建工具,支持批量化的AI創(chuàng)作與分析任務(wù),接入DeepSeek R1滿血版

飛書多維表格26
查看詳情 飛書多維表格

解決方案:使用 Scanner.nextLine()

正確的做法是使用scnr.nextLine()來讀取用戶輸入的整行數(shù)據(jù),然后對(duì)這一整行字符串使用String.split(" ")方法進(jìn)行分割。這樣可以確保所有字段都被正確地捕獲并存儲(chǔ)到字符串?dāng)?shù)組中。

構(gòu)建多態(tài)對(duì)象并存儲(chǔ)到ArrayList

假設(shè)我們已經(jīng)定義了Plant基類和Flower派生類,它們都包含設(shè)置和獲取屬性的方法,以及一個(gè)printInfo()方法用于打印各自的信息。Flower類繼承自Plant類,這意味著Flower對(duì)象可以被視為Plant對(duì)象,從而可以存儲(chǔ)在ArrayList<Plant>中,這是多態(tài)性的體現(xiàn)。

  1. 初始化 ArrayList: 創(chuàng)建一個(gè)能夠存儲(chǔ)Plant類型對(duì)象的ArrayList。由于多態(tài)性,它也能存儲(chǔ)Flower對(duì)象。

    ArrayList<Plant> myGarden = new ArrayList<Plant>();
    登錄后復(fù)制
  2. 循環(huán)讀取并解析輸入: 使用while循環(huán)持續(xù)讀取用戶輸入,直到遇到終止符-1。在循環(huán)內(nèi)部:

    • 首先使用scnr.nextLine()讀取完整的一行輸入。
    • 對(duì)讀取到的行字符串調(diào)用split(" "),將其按空格分割成字符串?dāng)?shù)組。
    • 根據(jù)數(shù)組的第一個(gè)元素(info[0])判斷是“plant”還是“flower”,從而決定創(chuàng)建哪種類型的對(duì)象。
    • 從info數(shù)組中提取相應(yīng)的字段,并進(jìn)行必要的類型轉(zhuǎn)換(例如,將字符串轉(zhuǎn)換為整數(shù)Integer.parseInt()或布爾值Boolean.parseBoolean())。
    • 實(shí)例化對(duì)應(yīng)的Plant或Flower對(duì)象,設(shè)置其屬性,然后將其添加到myGarden列表中。
  3. 統(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
登錄后復(fù)制

以上就是Java中處理多態(tài)對(duì)象列表:從用戶輸入到ArrayList的實(shí)踐的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!

最佳 Windows 性能的頂級(jí)免費(fèi)優(yōu)化軟件
最佳 Windows 性能的頂級(jí)免費(fèi)優(yōu)化軟件

每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。

下載
來源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn
最新問題
開源免費(fèi)商場(chǎng)系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長!
關(guān)注服務(wù)號(hào) 技術(shù)交流群
PHP中文網(wǎng)訂閱號(hào)
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時(shí)隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號(hào)
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)