[Tablica] Problem z wywołaniem konstruktorów

0

Witam, dostałem ostatnio następujące zadanie związane z tablicami:

Zdefiniować klasę Tablica, która zawiera prywatne atrybuty:

x - tablicę liczb typu int,
n – ilość elementów.

Zdefiniować następujące konstruktory:

  • Tablica( ) – tworzący tablicę 10-elementową oraz wypełniający ją wartościami
    wygenerowanymi za pomocą metody random z klasy Math; trzeba je rzutować do typu
    int; można też wykorzystać metodę round z klasy Math,
  • Tablica( int n ) - tworzący tablicę n-elementową oraz wypełniający ją zerami,
  • Tablica( int n, int x[ ] ) - tworzący tablicę n-elementową oraz wypełniający ją
    elementami z listy argumentów.

Zdefiniować następujące metody:
.
// to teraz nieistotne :)
.
Zdefiniować statyczną metodę main, w której utworzyć 3 tablice – za pomocą każdego z
konstruktorów i wywołać dla nich wybrane metody.

No i zbudowałem konstruktory:

public class Tablica
{
    private static int x[];
    private static int n;

    
    Tablica(){
        n=10;
        x = new int[n];        
        for(int i=0; i<x.length; i++){ 
            x[i] = (int)(Math.random()*10);
        }
    }
    
    
    Tablica(int n){
        x = new int[n];
        for(int i=0; i<x.length; i++){ 
            x[i] = 0;
        }
    }
    

    Tablica(int n, int y[]){
        x = new int[n];
        for(int i=0; i<x.length; i++){ 
            x[i] = y[i];
        }
    }
}

Napisałem również wszystkie metody i teraz czas na wywołanie tych konstruktorów w main - i tu się pojawiaja problemy:

  • Osobne wywołanie konstruktora Tablica(); działa elegancko (czyli po wywołaniu metody "wyswietlTablice" dla danego obiektu w konsoli pokazuje się 10 losowych liczb)
  • Podobnie Tablica(n); (pokazuje sie n liczb 0)
  • Wywołanie konstruktora Tablica(n, y[]) już nie działa, program wywala błąd - '.class' expected
  • Przy jednoczesnym wywołaniu Tablica() i Tablica(n) już się coś kisi (konkretnie po wywołaniu metody "wyswietlTablice" w konsoli pokazuje się 2 razy po n liczb 0 :) )

Poniżej przykładowa klasa main, próbowałem juz wszystkiego co mi do głowy przyszło i ni nie chce tego ruszyć:

    public static void main(int n, int y[]){
        Tablica tab1 = new Tablica(n, y[]);        
        tab1.wyswietlTablice();
    }

Zapewne cos ostro namieszałem, zapewne w wielu miejscach - ale nie jestem po prostu w stanie tego znaleźć, więc będe wdzięczny za wszelką pomoc :)

Edit:
Dodam jeszcze, że wszystko (konstruktory, main, metody) są w jednej klasie, więc prosze się nie sugerować tym, że wszystko jest wklejone osobno, po prostu jako całość kod byłby nieco za długi :)

Edit2:
Zrobiłem tak:

    public static void main(int n, int y[]){
        Tablica tab1 = new Tablica();
        Tablica tab2 = new Tablica(n);
        Tablica tab3 = new Tablica(n, y);
        tab1.wyswietlTablice();
        tab2.wyswietlTablice();
        tab3.wyswietlTablice();
    }

I w konsoli dostałem następujący wynik dla n=3 i y[]={4, 8, 12}:
4 8 12
4 8 12
4 8 12
Czyli jakby 3 razy wywołało mi ostatni konstruktor.

0

Po mojemu (trochę spekuluję, bo widzę tylko część kod) tab1, tab2 to trzy różne referencje do tej samej tablicy. Napisz tak:

    public static void main(int n, int y[]){
        Tablica tab1 = new Tablica();
         tab1.wyswietlTablice(); 
        Tablica tab2 = new Tablica(n);
        tab2.wyswietlTablice();
        Tablica tab3 = new Tablica(n, y);       
        tab3.wyswietlTablice();
    }

IMO, pomysł by tworzyć metodę o sygnaturze

public static void main(int n, int y[])

jest idiotyczny.
Budowa klasa winna być raczej taka (kolejność składników dowolna)

public class Tablica
{
    // definicje pól
    // definicje metod
    // definicja konstruktorów
   public static void main(String[] args)
   {
        Tablica tab1 = new Tablica();
         tab1.wyswietlTablice(); 
        Tablica tab2 = new Tablica(23);
        tab2.wyswietlTablice();
        int[] tab={2,5,7};
        Tablica tab3 = new Tablica(3, tab);       
        tab3.wyswietlTablice();
   }
}

Zadanie jest dość kiepsko sformułowane: Co ma zrobić trzeci konstruktor gdy przekazane parametry "nie pasują" do siebie: n=124, tablica ma długość 11.
Dość naturalna reakcja na niedopasowanie parametrów jest następująca: jeśli przekazana tablica jest za krótka, to tworzona tablicę uzupełniamy zerami, jeśli przekazana tablica jest za długa, to do tworzonej tablicy przepisujemy tylko początek tablicy przekazanej. Twój konstruktor wyrzuci wyjątek gdy przekazana tablica jest za krótka.

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