我對 Java 完全陌生,并且正在學習一些在線課程。當在線說明在單個 Main 類下完成任務時,我正在執行此任務。我試圖做一些測驗,因為我想嘗試保持我的主類簡單,并且想知道如何將不同的陣列和方法從另一個類引入我的主類。
import java.util.Scanner;
public class Arrays {
public static Scanner scan = new Scanner(System.in);
public static int[] getIntegers(int number) {
System.out.println("Please enter " number " numbers\r");
int[] entered = new int[number];
for(int i = 0; i < entered.length; i ) {
entered[i] = scan.nextInt();
}
return entered;
}
public static void printArray(int[] entered) {
for(int i = 0; i < entered.length; i ) {
System.out.println("Element " i ", typed value was " entered[i]);
}
}
public static int[] sortIntegers(int[] entered) {
int[] sortedArray = new int[entered.length];
for(int i = 0; i < entered.length; i ) {
sortedArray[i] = entered[i];
}
boolean flag = true;
int temp;
while(flag) {
flag = false;
for(int i = 0; i < sortedArray.length - 1; i ) {
if(sortedArray[i] < sortedArray[i 1]) {
temp = sortedArray[i];
sortedArray[i] = sortedArray[i 1];
sortedArray[i 1] = temp;
flag = true;
}
}
}
return sortedArray;
}
}
還有我的主課。
public class Main {
public static void main (String[] args) {
int[] myIntegers = getIntegers(5);
int[] sorted = sortIntegers(myIntegers);
printArray(myIntegers);
printArray(sorted);
}
}
IntelliJ 允許我只匯入靜態類名,但我想在沒有使用 OOP 標準匯入類的方法的情況下嘗試它。
如您所見,我想引入 getIntegers、printArray 和 sortIntegers。
uj5u.com熱心網友回復:
我建議你學習 java 修飾符。這將對您的未來有所幫助。在這種情況下。您可以使用實體方法而不是靜態方法。例子 :-
public class Main {
public static void main(String[] args) {
Arrays arrays = new Arrays();
int[] myIntegers = arrays.getIntegers(5);
int[] sorted = arrays.sortIntegers(myIntegers);
arrays.printArray(myIntegers);
arrays.printArray(sorted);
}
}
class Arrays {
public static Scanner scan = new Scanner(System.in);
public int[] getIntegers(int number) {
System.out.println("Please enter " number " numbers\r");
int[] entered = new int[number];
for(int i = 0; i < entered.length; i ) {
entered[i] = scan.nextInt();
}
return entered;
}
public void printArray(int[] entered) {
for(int i = 0; i < entered.length; i ) {
System.out.println("Element " i ", typed value was " entered[i]);
}
}
public int[] sortIntegers(int[] entered) {
int[] sortedArray = new int[entered.length];
for(int i = 0; i < entered.length; i ) {
sortedArray[i] = entered[i];
}
boolean flag = true;
int temp;
while(flag) {
flag = false;
for(int i = 0; i < sortedArray.length - 1; i ) {
if(sortedArray[i] < sortedArray[i 1]) {
temp = sortedArray[i];
sortedArray[i] = sortedArray[i 1];
sortedArray[i 1] = temp;
flag = true;
}
}
}
return sortedArray;
}
}
uj5u.com熱心網友回復:
您可以使用extends讓 Main 類繼承 Arrays 類,但 Java 不允許多重繼承,因此您將無法擴展任何其他類。除了應該在父類和子類共享邏輯關系的情況下進行繼承這一事實之外。
相反,您可以創建一個通用介面,并且 Arrays 類可以實作您已經擁有的所有方法。然后 Main 類可以實作介面(即 IterableInterface),您甚至可以指定您正在使用的具體型別以及它應該包含的 ivars,但這比您可能試圖實作的作業要多。
老實說,匯入類似的類是沒有問題的。通常你會發現 OOP 的缺點是在應該使用組合或聚合的情況下繼承。這在這種情況下不適用,因為匯入更合適,但請注意。
uj5u.com熱心網友回復:
tl;博士
重新設計您的應用程式以使用物件。
- 寫一個狀態管理類。
- 為用戶界面撰寫一個類。
- 撰寫一個類來運行節目,保存狀態管理器和用戶界面物件的實體,以包含
main方法。
要回答您的問題,“我如何從另一個類中引入一個陣列?”:
- ?? 在這些物件之間傳遞陣列。
- 避免使用
static全域變數。
細節
問題是你并沒有真正從物件的角度思考。您基本上是在進行程序編程,將方法撰寫為子例程,并將static變數用作全域變數。這樣的程序式編程不一定是壞事,至少對于簡單的小應用來說不是。但是你不是在學習 OOP。
提示:避免static. 根據定義static,它不是面向物件的。它的頻繁使用通常是一個很大的警告信號,表明您的 OOP 設計存在缺陷。
對于 OOP,不要考慮輸入 -> 處理 -> 輸出。想想責任,要完成的作業。
在您的應用程式中,我們有兩個主要職責:用戶界面和管理狀態。
- 通過控制臺與用戶互動
- 存盤一些狀態(陣列),并處理該狀態(對這些陣列進行排序)。
與用戶互動的應用程式部分并不關心陣列的存盤方式(在記憶體中作為陣列,在記憶體中作為ArrayList,在資料庫中等)。應用程式的 UI 部分也不關心排序中使用的演算法。
同樣,處理陣列的應用程式部分不需要知道如何與用戶互動。狀態管理不關心用戶是通過控制臺、GUI 桌面應用程式、Web 應用程式還是 Web 服務進行通信。
首先是一個管理狀態的類。
package work.basil.example.maths;
import java.util.Arrays;
import java.util.Objects;
public class NumbersJuggler
{
private final int[] numbersOriginal;
private final int[] numbersSorted;
public NumbersJuggler ( final int[] numbers )
{
this.numbersOriginal = Objects.requireNonNull( numbers );
this.numbersSorted = Arrays.copyOf( this.numbersOriginal , this.numbersOriginal.length );
Arrays.sort( this.numbersSorted );
}
public int[] getNumbersOriginal ( )
{
return Arrays.copyOf( this.numbersOriginal , this.numbersOriginal.length );
}
public int[] getNumbersSorted ( )
{
return Arrays.copyOf( this.numbersSorted , this.numbersSorted.length );
}
@Override
public String toString ( )
{
return "NumbersJuggler{"
"numbersOriginal=" Arrays.toString( numbersOriginal )
", numbersSorted=" Arrays.toString( numbersSorted )
'}';
}
@Override
public boolean equals ( final Object o )
{
if ( this == o ) { return true; }
if ( o == null || getClass() != o.getClass() ) { return false; }
NumbersJuggler that = ( NumbersJuggler ) o;
return Arrays.equals( numbersOriginal , that.numbersOriginal ) && Arrays.equals( numbersSorted , that.numbersSorted );
}
@Override
public int hashCode ( )
{
int result = Arrays.hashCode( numbersOriginal );
result = 31 * result Arrays.hashCode( numbersSorted );
return result;
}
}
請注意NumbersJuggler該類如何對與用戶互動一無所知。它的作業是保存一組數字,并對這些數字進行排序。我們稍后可以重寫這個類以在ArrayList內部使用而不是僅僅使用陣列,并且我們應用程式的其余部分不會中斷,至少不會關心。
還要注意 getter 方法如何return Arrays.copyOf用于回傳陣列的副本。我們不希望其他類有權操作由NumbersJuggler該類管理的內容。
接下來我們需要一個用于用戶界面的類。它唯一的任務:
- 收集數字。
- 報告編號。
package work.basil.example.maths;
import java.time.Instant;
import java.util.Scanner;
public class NumbersConsoleUI
{
private final Scanner scanner;
private final int countOfNumbers;
public NumbersConsoleUI ( final Scanner scanner , final int countOfNumbers )
{
this.scanner = scanner;
this.countOfNumbers = countOfNumbers;
}
public int[] gatherNumbers ( )
{
System.out.println( "Please enter " this.countOfNumbers " numbers:" );
int[] numbers = new int[ this.countOfNumbers ];
for ( int index = 0 ; index < numbers.length ; index )
{
numbers[ index ] = scanner.nextInt();
}
return numbers;
}
public void reportOriginalNumbers ( final int[] numbersOriginal )
{
for ( int index = 0 ; index < numbersOriginal.length ; index )
{
int ordinal = index 1;
System.out.println( "Element # " ordinal ", typed value was " numbersOriginal[ index ] );
}
}
public void reportSortedNumbers ( final int[] numbersSorted )
{
for ( int index = 0 ; index < numbersSorted.length ; index )
{
int ordinal = index 1;
System.out.println( "Element # " ordinal ", sorted value was " numbersSorted[ index ] );
}
}
public void reportAppEnding ( )
{
System.out.println( "App ending at " Instant.now() );
}
}
請注意,NumbersConsoleUI該類對數字的存盤方式一無所知,對排序演算法一無所知。
最后,我們需要一個應用程式類來將這一切整合在一起。它的作業是實體化我們應用程式的其他部分(狀態管理器和 UI)。
這個應用程式類就像管弦樂隊的指揮一樣,向各種樂器演奏者發出信號,何時演奏他們的角色。就像指揮不需要知道雙簧管中簧片的復雜性一樣,這個應用程式類不需要知道存盤和排序數字的復雜性,也不需要知道如何與控制臺互動的復雜性。就像指揮依賴雙簧管來管理他們的雙簧管一樣,app 類依賴NumbersJuggler&NumbersConsoleUI類來管理他們自己的細節。
package work.basil.example.maths;
import java.util.Objects;
import java.util.Scanner;
public class NumbersApp
{
public static void main ( String[] args )
{
Scanner scannner = new Scanner( System.in );
int countOfNumbers = 5;
NumbersConsoleUI ui = new NumbersConsoleUI( scannner , countOfNumbers );
int[] numbers = ui.gatherNumbers();
NumbersJuggler numbersJuggler = new NumbersJuggler( numbers );
ui.reportOriginalNumbers( numbersJuggler.getNumbersOriginal() );
ui.reportSortedNumbers( numbersJuggler.getNumbersSorted() );
ui.reportAppEnding();
}
}
跑的時候。
Please enter 5 numbers:
42
555
105
7
55
Element # 1, typed value was 42
Element # 2, typed value was 555
Element # 3, typed value was 105
Element # 4, typed value was 7
Element # 5, typed value was 55
Element # 1, sorted value was 7
Element # 2, sorted value was 42
Element # 3, sorted value was 55
Element # 4, sorted value was 105
Element # 5, sorted value was 555
App ending at 2022-11-12T09:49:47.231213Z
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/532984.html
標籤:爪哇数组目的哎呀进口
