problem z prostym zadaniem - przeglądanie elementów tablicy

0

mam do napisania następujący program:
Proszę napisać program, w którym zdefiniowana zostanie klasa Statek posiadająca co najmniej jedno publiczne pole nr do numerowania statków. Klasa Start ma natomiast utworzyć tablicę o rozmiarze SEA_SIZE (SEA_SIZE to stała całkowitoliczbowa o wartości 50) i umieści w niej, na losowo wybranych pozycjach, SHIPS statków (SHIPS to stała całkowitoliczbowa o wartości 10). Pozostałe pola tablicy mają nie mieć przypisanych obiektów klasy Statek. W trakcie tworzenia statków mają zostać one ponumerowane. Tablicę należy następnie przesłać do metody znajdującej się w klasie Start. Metoda ta ma przeglądnąć całą tablicę i wypisać na ekranie położenie i numer statku.

Na pozycji 5 jest statek 2
Na pozycji 7 jest statek 8
Na pozycji 13 jest statek 6
Na pozycji 16 jest statek 4
itd.

na razie stworzyłam coś takiego:

 import java.util.*;
     
    class Statek
    {
       public int nr;
    }
     
     
    class Start
    {
        final static int SEA_SIZE = 50;
        final static int SHIPS = 10;
        public static void main(String[] args)
        {
            Statek[] tab = new Statek[SEA_SIZE];
            Random generate = new Random();
            Statek naszstatek = new Statek();
            Start a = new Start();
            int i;
            for(i = 0; i < SHIPS; i++)
               
            {  
                tab[generate.nextInt(SEA_SIZE)] = naszstatek;
                naszstatek.nr = i;
            }
            a.wypisz(tab);
        }
       
        public static void wypisz(Statek[] tablica)
        {
            for(int i = 1; i < tablica.length; i++)
            {
                if(tablica[i] != null)
                {
                    System.out.println("Na pozycji " +i+ " jest statek  " +tablica[i].nr);
                }
            }
        }
     
    }
 

co jest źle.

wynik działania programu jest następujący:

Na pozycji nr: 6 jest statek o numerze: 9
Na pozycji nr: 13 jest statek o numerze: 9
Na pozycji nr: 18 jest statek o numerze: 9
Na pozycji nr: 19 jest statek o numerze: 9
Na pozycji nr: 25 jest statek o numerze: 9
Na pozycji nr: 30 jest statek o numerze: 9
Na pozycji nr: 40 jest statek o numerze: 9
Na pozycji nr: 43 jest statek o numerze: 9
Na pozycji nr: 47 jest statek o numerze: 9
Na pozycji nr: 49 jest statek o numerze: 9

a więc program nie pokazuje na jakiej pozycji jest każdy ponumerowany satek, tylko każdej pozycji przypisuje ten sam statek.
nie umiem tego naprawić. czy mógłby mi ktoś pomóc?

0

Bo alokujesz pamięć tylko na jeden statek. Z każdym obrotem pętli, nowy numer jest przypisywany do tego samego statku.

for(i = 0; i < SHIPS; i++){    
    Statek statek = new Statek();
    statek.nr = i;
    tab[generate.nextInt(SEA_SIZE)] = statek;  
}
0

Wszędzie jest 9, bo masz tylko jeden statek.

Zapamiętaj:
W Javie wszystkie byty, które dziedziczą po Object są dostępne tylko za pomocą referencji. Tzn String coś to jest referencja. Typy proste (a więc te co nie dziedziczą po Object) są dostępne tylko jako wartość. A więc int coś to już nie jest referencja, tylko wartość wprost. Zarówno referencje jak i wartości są przekazywane przez wartość, a więc po wykonaniu string = string2 będziesz miał dwie zmienne zawierające tą samą referencję, a więc z obu będziesz miał dostęp do tego samego obiektu, natomiast po wykonaniu int1 = int2 dostaniesz kopię int2 w int1 i te wartośc nie będą w żaden sposób powiązane, tzn zmiana int1 nie wpłynie na int2 i vice versa.

edit:
Za późno.

0

dzięki, ale nie rozumiem. co jest za późno?

0

hmm

tworzysz obiekt
Statek naszstatek = new Statek();
a potem do każdego elementu tablicy przypisujesz ten sam obiekt, ergo masz cały czas tylko jeden statek (9) i każdy element tablicy na niego wskazuje.

0

@misiakufal, jesteś trzeci w kolejce.
@lalamido, @Wibowit za późno napisał mail, @allocer go wyprzedził.

1 użytkowników online, w tym zalogowanych: 0, gości: 1