Ja dopiero zaczynam - kilk apytań o podstawy JAVA

Ja dopiero zaczynam - kilk apytań o podstawy JAVA
MH
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 4 lata
  • Postów:5
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.

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:3 minuty
  • Postów:4886
0

Zobacz tutaj, chyba zgodnie z zasadą enkapsulacji?


matt_z
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 7 lat
  • Postów:56
0

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

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

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


MH
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 4 lata
  • Postów:5
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?)

matt_z
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 7 lat
  • Postów:56
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 ;).


edytowany 1x, ostatnio: matt_z
MH
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 4 lata
  • Postów:5
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?

edytowany 2x, ostatnio: MHz
Hispano-Suiza
Weź sformatuj ten kod znacznikami bo za cholerę się nie można połapać... Gdybyś w klasie B miał 5 metod to po inicjacji w main możesz odwoływać się do tych metod (chyba, że źle zrozumiałem pytanie...) Odnośnie this - http://stackoverflow.com/questions/3728062/what-is-the-meaning-of-this-in-java
TR
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 lata
  • Postów:731
0
Kopiuj
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;
    }   
}
Kopiuj
package Test;

public class KlasaB {
    public int a;

    public void wyswietl() {
        Test klasaA = new Test();
        a = klasaA.getZmiennaInt();
        System.out.println(a);
    }
}
Kopiuj
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ę


musica curat corpus at animam
samouczek
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 7 lat
  • Postów:67
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:

Kopiuj
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.

edytowany 1x, ostatnio: samouczek
MH
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 4 lata
  • Postów:5
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.

samouczek
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 7 lat
  • Postów:67
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ć:

Kopiuj
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
    }
}
MH
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 4 lata
  • Postów:5
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?

Kopiuj
	@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?

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)