Autor Wątek: Początki Javy i Androida  (Przeczytany 1572 razy)

Offline TDM

  • Użytkownik

# Wrzesień 24, 2011, 14:41:51
Witam!

Uczę się ostatnio Javy aby pisać coś pod androida no i napotkałem taki problem z pewnym prostym kodem, patrze się na niego i nie wiem co się dzieje:
public class MainActivity extends Activity{
     
    private Button button;
 
    private OnClickListener listener = new OnClickListener(){
 
        public void onClick(View v){
            EditText tekst = (EditText)findViewById(R.id.entry);
             
            CharSequence text = (CharSequence)tekst.getText();
            Context context = getApplicationContext();
            int duration = Toast.LENGTH_SHORT;
             
            Toast toast = Toast.makeText(context,text,duration);
            toast.show();
        }
    };
     }

   Ze strony androida to o rozumiem ale ze strony javy to już nie. Chodzi mi głównie o tą linijke:
   private OnClickListener listener = new OnClickListener(){Deklaracja prywatnego obiektu klasy OnClickListener do którego zostaje przypisany nowo utworzony obiekt tej o to klasy operatorem new. No ale zaraz obiekt klasy OnClickListener to nie jest wskaźnik czyli że na ten obiekt przez operator = zostaną przeniesione tylko wartości zmiennych,
no a tutaj jest tak jak by definicja klasy OnClickListener a dokładniej jej metody onClick, rozumiem że w tej klasie jest taka funkcja virtual no i jakoś to ma sens. No ale co się dzieje z tym obiektem utworzonym przez operator new ? Przecież on jest gdzieś tam w pamięci i nigdzie tu nie jest usuwany...
Nie wiem może mam za dużo przyzwyczajeń z C++...

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Wrzesień 24, 2011, 15:00:10
Cytuj
No ale zaraz obiekt klasy OnClickListener to nie jest wskaźnik
W Javie wszystkie obiekty są przez wskaźnik. W takim sensie, że jak zmienna nie jest intem, charem, czy innym typem prostym, to jest wskaźnikiem. Po prostu w Javie gwiazdek się nie pisze i zakłada się, że są one wszędzie. Jeżeli chodzi o możliwość osadzenia jednej klasy w drugiej - Java tego nie wspiera (w sensie łączenia struktur w jedną - trzeba przez wskaźnik).

EDIT:
A co do wycieków pamięci, to w Javie jest Garbage Collector i wszystko, co by się potencjalnie zgubiło, jest usuwane (na dodatek zgubienie obiektu to jedyna możliwość pozbycia się go).
« Ostatnia zmiana: Wrzesień 24, 2011, 15:01:42 wysłana przez Krzysiek K. »

Offline deadeye

  • Użytkownik

# Wrzesień 24, 2011, 15:28:35
Tak jak krzysiek napisał. Ta linia o którą pytasz tworzy nową klasę (wraz z wpisaną implementacją), i od razu tworzy jej instancje, przypisując ją do listener. Zostanie usunięta automatycznie, gdy zostanie usunięta zawierający ją obiekt.

Tak, masz za dużo przyzwyczajeń z c++ :P

Offline vashpan

  • Użytkownik
    • Strona

# Wrzesień 24, 2011, 16:10:30
Jak dla mnie, to jedno z dziwactw Javy ktore ma na celu zastapienie wyspecjalizowanych elementow z innych jezykow jakimis ogolnymi konstrukcjami "na okolo"

Ne lubie tego w tym jezyku....

Offline Shusty

  • Użytkownik

# Wrzesień 25, 2011, 01:10:52
Jak dla mnie to wygląda spoko.
A dla uściślenia w JAVIe nie wskaźniki, tam wszędzie są referencje ;D

Jeżeli chodzi o możliwość osadzenia jednej klasy w drugiej - Java tego nie wspiera
Przecież można osadzić jedną klasę w drugiej i jest to po prostu klasa wewnętrzna, ale dla ułatwienia sobie życia mamy anonimowe klasy wewnętrze i wewnętrzne klasy lokalne.I takie tam różne.


Offline Xirdus

  • Redaktor

# Wrzesień 25, 2011, 01:50:59
A dla uściślenia w JAVIe nie wskaźniki, tam wszędzie są referencje ;D
Referencje to są właśnie takie wykastrowane wskaźniki.

Przecież można osadzić jedną klasę w drugiej i jest to po prostu klasa wewnętrzna, ale dla ułatwienia sobie życia mamy anonimowe klasy wewnętrze i wewnętrzne klasy lokalne.I takie tam różne.
Bardziej chodziło o to, że obiekt jest w obiekcie trzymany przez referencję, a nie przez wartość (czyli jak np. w klasie A są trzy inty i obiekt klasy B, a w klasie B pięć intów, to obiekt klasy A ma w sobie 8 intów, a nie 3 inty i referencję).
« Ostatnia zmiana: Wrzesień 25, 2011, 01:56:52 wysłana przez Xirdus »

Offline DamianDev

  • Użytkownik

# Wrzesień 25, 2011, 12:51:54
a nie lepiej ci w pliku main.xml wpisac do naprzyklad button android:onClick="funckja"

i potem w pliku src zrobic funkcje

public void funkcja(View view)
{
//tutaj kod po klikneciu
}

jak dla mnie ten sposob szybszy jest :)