Ja dopiero zaczynam - kilk apytań o podstawy JAVA

0

Dzień dobry,
dopiero zaczynam moja przygodę z JAVA. Naukę opieram na kilku książkach i zasobach Internetu.
Mam kilka problemów, z którymi nie potrafię sobie poradzić, a są one pewnie banalne. Będę je po kolei dodawał do tego wątku.

Problem nr 1.

Mam dwie klasy A i B umieszczone w jednym pakiecie. Klasa A ma pole publiczne o nazwie aList, które jest tablicą ArrayList. W jaki sposób klasa B może korzystać z tego pola? Klasa A ma też pole prywatne int zmienna, do którego na zasadzie hermetyzacji dorobiłem metody getZmienna() i setZmienna(). Czy aList także podlega hermetyzacji i muszę do niej dorobić metody dostępowe, czy też może dostęp powinien się odbyć przez coś w rodzaju get(0), choc wtedy Eclipse wyświetla komunikat, że nie może zastosować statycznej metody do niestatycznego pola (czy jakoś tak - niestety nie mam Eclipse pod ręką).

Proszę o pomoc.
Pozdrawiam
P.

0

Zobacz tutaj, chyba zgodnie z zasadą enkapsulacji?

0

Hej. Statyczność nie ma nic wspólnego z hermetyzacją dostępu. Powinno wszystko wyglądać mniej więcej tak:

A a = new A()
int i = a.getZmienna()
ArrayList z = a.aList

strzelam, że nie tworzysz obiektu stąd "dziwne" komunikaty.

0

Dopytam, co jednocześnie będzie PROBLEMEM nr 2.

Piszesz, że powinienem utworzyć obiekt klasy A. Jak tak robię, na samym początku metody main, która jest w klasie A.
Czy dobrze zatem rozumiem, że obiekt tworzę raz i powinien on być widoczny dla wszystkich klas w pakiecie? Czy może jednak w każdej klasie muszę utworzyć obiekt na nowo (ale wtedy to będą chyba różne obiekty o takiej samej nazwie?)

0

Bez kodu nie dostaniesz dobrej odpowiedzi, ale spróbuję...

Czy dobrze zatem rozumiem, że obiekt tworzę raz i powinien on być widoczny dla wszystkich klas w pakiecie?

nie
Obiekt tworzysz tam i tylko tam gdzie go potrzebujesz. Jak potrzebujesz nowy, tworzysz nowy, jak stary, używasz wcześniej stworzony.

Czy może jednak w każdej klasie muszę utworzyć obiekt na nowo (ale wtedy to będą chyba różne obiekty o takiej samej nazwie?)

nie
Twój (a w zasadzie mój z postu wyżej) obiekt nie ma nazwy. Nazwę ma zmienna (w tym przypadku). Tworzysz obiekt tam gdzie potrzebujesz ;).

0

Ok, mam teraz dostęp do eclipse, przy czym ograniczmy się do int anie Arraylist:

Kod ma trzy klasy:

package Test;
import java.util.ArrayList;
public class Test {

public int zmiennaInt=9, z=0;
public ArrayList<String> aList = new ArrayList<String>();
public static void main(String[] args) {

	// Tworze obiekt klasaA
	Test klasaA = new Test();
	KlasaB klasaB = new KlasaB();
	klasaB.wyswietl();
	KlasaC klasaC = new KlasaC();
	klasaC.wyswietl();
	
	// PROBLEM NR 3
	klasaA.z = klasaA.zmiennaInt;
	klasaA.z = klasaA.getZmiennaInt();

// this.z = this.getZmiennaInt();
}

public int getZmiennaInt()
{
	return zmiennaInt;
}

public void setZmiennaInt(int a)
{
	zmiennaInt = a;
}	

}

package Test;

public class KlasaB
{
public int a;
public void wyswietl()
{
Test klasaA = new Test();
a = klasaA.getZmiennaInt();
System.out.println(a);
}
}

package Test;

public class KlasaC
{
public int a;
public void wyswietl()
{
Test klasaA = new Test();
a = klasaA.getZmiennaInt();
a++;
System.out.println(a);
}
}

W metodzie main tworzę obiekt klasaA klasy test. Potem korzystam z metody wyświetl z klasyB i klasyC. Żeby to zrobić muszę utworzyć odpowiednie obiekty. To jest dla mnie jasne.
Nie rozumiem czemu, skoro w metodzie main utworzyłem obiekt klasaA, to w metodach wyświetl obiektów klasaB i klasaC muszę na nowo go tworzyć. Czy ja tworzę tylko dodatkowe referencje do tego samego obiektu? Czy jeśli w obiekcie klasaB będę miał dodatkową metodę np wyświetl 2, która także będzie potrzebować pól z obiektu klasaA, to w tej metodzie znowu muszę definiować obiekt klasaA?

Jeszcze jedna rzecz z innej beczki. W klasie Test jest zapis klasaA.z = klasaA.getZmiennaInt();
To jest jasne, wskazuję obiekt i pole tudzież obiekt i metodę.

Dlaczego jednak zapis this.z = this.getZmiennaInt(); wywołuje w Eclipse błąd "Cannot use this in a static context"? Czy this nie odnosi się do obiektu z którego metoda jest wywoływana? czy może jednak mogę go użyć tylko w odniesieniu do pola statycznego?

0
package Test;

import java.util.ArrayList;

public class Test {
   public int zmiennaInt=9, z=0;
   public ArrayList<String> aList = new ArrayList<String>();

   public static void main(String[] args) {

    // Tworze obiekt klasaA
    Test klasaA = new Test();
    KlasaB klasaB = new KlasaB();
    klasaB.wyswietl();
    KlasaC klasaC = new KlasaC();
    klasaC.wyswietl();

    // PROBLEM NR 3
    klasaA.z = klasaA.zmiennaInt;
    klasaA.z = klasaA.getZmiennaInt();
    // this.z = this.getZmiennaInt();
    }

    public int getZmiennaInt() {
        return zmiennaInt;
    }

    public void setZmiennaInt(int a) {
        zmiennaInt = a;
    }   
}
package Test;

public class KlasaB {
    public int a;

    public void wyswietl() {
        Test klasaA = new Test();
        a = klasaA.getZmiennaInt();
        System.out.println(a);
    }
}
package Test;

public class KlasaC {
    public int a;

    public void wyswietl() {
        Test klasaA = new Test();
        a = klasaA.getZmiennaInt();
        a++;
        System.out.println(a);
    }
}

k***aaa, następnym razem, biorę 1zł za spację

0

W języku Java słowo kluczowe this oznacza odniesienie do aktualnego obiektu. Na przykład w konstruktorze poniżej this odnosi się do instancji klasy Test. Ta instancja inicjalizowana jest właśnie przez konstruktor:

public class Test {
    private final int magic;
    
    public Test(int magic) {
        this.magic = magic
    }
}

W przypadku gdy używasz metdo z modyfikatorem static nie masz dostępu do "aktualnego obiektu". Można powiedzieć, że metody statyczne przypisane są do klasy a nie do instancji tej klasy.

Dlaczego jednak zapis this.z = this.getZmiennaInt(); wywołuje w Eclipse błąd "Cannot use this in a static context"?

Tłumacząc błąd otrzymujesz "Nie można używać this w statycznym kontekście. Metoda main "podpięta" jest pod klasę Test a nie instancję tej klasy, dlatego dostajesz taki błąd.

0
trojanus napisał(a):

k***aaa, następnym razem, biorę 1zł za spację

Moja wina, następnym razem kod będzie wklejony cacy.

samouczek napisał(a):

W języku Java słowo kluczowe this oznacza odniesienie do aktualnego obiektu. Na przykład w konstruktorze poniżej this odnosi się do instancji klasy Test. Ta instancja inicjalizowana jest właśnie przez konstruktor:

W przypadku gdy używasz metdo z modyfikatorem static nie masz dostępu do "aktualnego obiektu". Można powiedzieć, że metody statyczne przypisane są do klasy a nie do instancji tej klasy.

Dzięki, rozumiem. Problem nr 3 wynikał z użycia this w metodzie statycznej. Sprawdziłem w metodzie niestatycznej i działa.

A co z tym:

W metodzie main tworzę obiekt klasaA klasy test. Potem korzystam z metody wyświetl z klasyB i klasyC. Żeby to zrobić muszę utworzyć odpowiednie obiekty. To jest dla mnie jasne.
Nie rozumiem czemu, skoro w metodzie main utworzyłem obiekt klasaA, to w metodach wyświetl obiektów klasaB i klasaC muszę na nowo go tworzyć. Czy ja tworzę tylko dodatkowe referencje do tego samego obiektu? Czy jeśli w obiekcie klasaB będę miał dodatkową metodę np wyświetl 2, która także będzie potrzebować pól z obiektu klasaA, to w tej metodzie znowu muszę definiować obiekt klasaA?

matt_z napisał(a):

Obiekt tworzysz tam i tylko tam gdzie go potrzebujesz. Jak potrzebujesz nowy, tworzysz nowy, jak stary, używasz wcześniej stworzony.

No właśnie w KlasaB potrzebuje wykorzystać obiekt klasaA, który został już utworzony w klasie test. Jednak nie mogę z niego skorzystać bez powtórnego utworzenia go w KlasaB. Czemu?
Jest to pewnie banalne, ale jakoś do mnie nie trafia. jednocześnie jest to pewnie podstawa podstaw i bez zrozumienia tego nie mogę sensownie pójść dalej.
Z góry dziękuję za pomoc.

0

Wywołując konstruktor tworzysz nową instancję obiektu klasy. Tworzysz nowy obiekt na stercie. W metodzie wyswietl nie możesz użyć tej samej zmiennej bo wewnątrz tej metody nie do niej masz dostępu. Jeśli chciałbyś użyć tego obiektu musiałbyś go do tem metody przekazać:

class TestA {
    public static void main(String... args) {
        TestA a = new TestA();
        TestB b = new TestB();
        b.wyswietl(a);
    }
}

class TestB {
    public void wyswietl(TestA a) {
        // teraz masz dostep do a
    }
}
0

Rozumiem.
Rozwijając ten temat: jeśli metoda wyświetl to metoda paintComponent, która ma mi odmalować na nowo jakieś komponenty graficzne, a obiekt a zawiera np. tablicę int[][] (wiem, że można użyć point) wpółrzędnych odcinków, to jak z kolei przekazać obiekt do tej metody?

	@Override 
	protected void paintComponent(Graphics g) 
	{ 
		super.paintComponent(g);
		Graphics2D g2d = (Graphics2D) g;
		g.setColor(Color.green);
		g.fillRect(0, 0, 850, 850);

	.
	.
}

Chciałbym np, aby po repaint() w JComponent narysowane zostały odcinki o współrzędnych przekazanych w tej tablicy. Metoda paintComponent przekazuje obiekt g. Czy można do wywołania dorzucić inny obiekt? Albo czy da się to zrealizować w jakiś inny sposób?

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