Wątek przeniesiony 2015-09-08 09:10 z Java przez bogdans.

Obiekt oraz String

0

Gdy tworzymy obiekt to piszemy:

NazwaKlasy obiekt = new NazwaKlasy()

Jak to jest ze Stringiem (przecież String to nazwa klasy), tam nie pisze sie :

String obiekt = new String()

tylko piszemy np:

String tekst = "ble ble ble"

i mamy obiekt: "tekst"

i na obiekcie "tekst" możemy wykonywać jakieś metody np. length()

np. tekst.length()

Czy tworzenie obiektów klasy String należy do wyjątków (tzn inaczej tworzymy niż wszystkie pozostałe)??

(ucze sie i mam mały mętlik albo coś źle zrozumiałem prosze o wytłumaczenie)

0

Trochę tak, trochę nie. Możesz utworzyć stringa poprzez new String(); albo new String("ala ma kota");. Analogicznie jest np. z klasą Integer - możesz zrobić Integer x = 1; a możesz new Integer(1);. Niemniej są tu pewne różnice. Jeśli przypisujesz literał to JVM może sobie te wartości wygodnie cacheować. Popatrz np. na to:
http://ideone.com/48rgmw
niby tworzę dwa stringi ale w rzeczywistości obie referencje odnoszą się do tego samego obiektu! Jeśli użyjesz new to taka sytuacja nie wystąpi - zawsze dostniesz nowy obiekt.
Ze stringami czy integerami można tak robić, bo są immutable - niezmienne. Jeśli np. dodasz coś do stringa to w rzeczywistości utworzysz nowy string z tą połączoną wartością. W efekcie można (*prawie) bezpiecznie współdzielic sobie takie obiekty.

* prawie, bo warto rozumieć, że synchronizowanie się na takim Stringu, Integerze czy Booleanie może sie bardzo źle skończyć, bo skoro mogą być współdzielone to możemy złapać jakiś deadlock jak ktoś w zupełnie innym miejscu w systemie postanowi też sie na takim obiekcie synchronizować.

0

Nie zbyt zrozumiałem twoja wypowiedź.
Powiedz mi co w zapisie np:
String tekst = "ble ble ble"
jest obiektem a co zmienną? (pomieszało mi sie w głowie i teraz nie wiem co jest obiektem a co zmienną w Stringu.

Shalon ja sie uczę proszę używaj prostych słów podczas tłumaczenia (tak na chłopski rozum, czasem zamiast nazywać coś to wskaż dokładnie o co ci chodzi, i nie nawiązuje do czegos innego tylko skupmy sie na danej rzeczy, tak żeby mi sie w głowie nie mieszało.)

I mam prośbę jak ktoś z Was tłumaczy to piszcie cała budowę składni, lepiej mi sie wtedy uczy.

Mam kolejna prośbę, można jeszcze raz o wytłumaczenie prostym językiem i jak juz coś piszecie/opisujecie oraz porównujecie ze sobą to lepiej pokazać to na przykładzie i z cała składnią

0

I może jeszcze frytki do tego? o_O

Pytasz o rzecz nietrywialną i nic nie poradzę na to że trzeba mieć jakąś podstawową wiedzę żeby to zrozumieć. Jeśli jest za trudne to kariera piekarza czeka.
Java, w przeciwieństwie do C++, nie pozwala na automatyczną konwersję za pomocą konstruktora implicit niemniej dla niektórych standardowych klas Javy taka konwersja jest możliwa, czego przykładem jest między innymi String oraz klasy do boxingu prymitywów (Integer, Float, Double, Boolean...). W Javie taki zapis z przypisaniem literału do referencji do obiektu zawiera dodatkową logikę, oprócz standardowego tworzenia nowej instancji -> pozwala na użycie cache dla wartości zgodnie z wzorcem Flyweight. W efekcie jeśli postanowisz stworzyć sobie milion Integerów o wartości 1 to w rzeczywistości będzie tylko jeden taki obiekt, współdzielony wszędzie.

nie wiem co jest obiektem a co zmienną w Stringu

Ja też nie bo w ogóle nie rozumiem o co pytasz. String to klasa, a instancja tej klasy to obiekt. Z racji braku w Javie słowa const, wszystko jest zmienną (ewentualnie można by uznać zmienne final za stałe, ale nie jest to całkiem poprawne).

0

Ja się uczę i doszedłem do pewnego momentu gdzie troszke zrobił mi sie mętlik w głowie. Moment to tworzenie obiektów.
I gdy napisze:
NazwaKlasy ogorek = new NazwaKlasy()

to wiem że obiektem jest ogorek.

Gdy napisze:
String y = "ble ble ble"

to w tym przypadku co jest obiektem a co zmienną: y czy ble ble ble ???


Bez obrazy ale tak trudnym językiem [ostatni post] jak ty tłumaczysz i używasz pojęć których początkujący nie znają na pewno nikt by sie Cie nie zrozumiał, fajnie że masz dużą wiedzą ale jak zaczynałeś to też nie znałeś wszystkiego tylko maluczkimi kroczkami dochodziłeś po kolei do wszystkiego. Jeśli masz chęc a chyba masz bo sie wypowiadasz to ujmij to prostymi słowami jak dla początkującego.

0
golec2604 napisał(a):

Ja się uczę i doszedłem do pewnego momentu gdzie troszke zrobił mi sie mętlik w głowie. Moment to tworzenie obiektów.
I gdy napisze:
NazwaKlasy ogorek = new NazwaKlasy()

to wiem że obiektem jest ogorek.

Gdy napisze:
String y = "ble ble ble"

to w tym przypadku co jest obiektem a co zmienną: y czy ble ble ble ???

Ściślej mówiąc ogorek nie jest obiektem, tylko referencją do obiektu klasy NazwaKlasy. W przypadku stringa jest tak samo, y jest referencją obiektu String, który w tym przypadku jest literałem i zostanie dodany do pool'a. A to znaczy, że

String y = "ble ble ble"
String x = "ble ble ble"

x == y  da true

 
0

Czytam ksiażke Java podstawy wydanie IX - Gary Cornell oraz http://java-krok-po-kroku.readthedocs.org/pl/latest/obiekty.html#klasy-i-obiekty i tam inaczej piszą. Niż Wy tutaj tłumaczycie. Nie używaja pojęci Referencja.
Ale znalazłem wytlumaczenie w necie:
Referencje to innymi słowy zmienne typów obiektowych.
Mam rozumieć że y to zmienna obiektowa do której przypisano obiekt "ble ble ble"
i jest ono równoważne z String y = new String('"ble ble ble")
a zapis String y = "ble ble ble" jest skrócona wersją?

0

Nie widzę tam czegoś innego niż my tłumaczymy. Jest sobie klasa 'Car',

Car c = new Car()

utworzy OBIEKT klasy Car na stercie a na stosie będziesz posiadał referencję do tego obiektu w zmiennej c. Słowo kluczowe new tworzy nową intsancję obiektu klasy Car.

0

@golec2604 bzdura, nie czytasz dokładnie. Pod podanym linkiem autor wspomina o tym że przypisanie wartości z new wykonuje sie do referencji.
Rzecz w tym że w Javie nigdy nie operujesz bezpośrednio obiektami a jedynie referencjami do nich. Możesz to widzieć trochę tak jak wskaźnik, tzn adres w pamięci gdzie się coś znajduje. Jak robisz:
MojaKlasa x = new MojaKlasa();
to w pamieci komputera tworzy się obiekt typu MojaKlasa ale "zmienna" x przechowuje jedynie adres w pamieci komputera gdzie ten obiekt sie znajduje. Widać to wyraźnie jeśli zrobisz np.

Integer x = new Integer(1);
Integer y = x;

Obie referencje, x oraz y, pokazują na ten sam obiekt, ale jak zrobisz teraz:

y = new Integer(2);

to będą pokazywać na dwa różne obiekty. Zauważ że obiekt na który pokazywały te dwie referencje się nie zmienił! Zmienił sie tylko adres w pamięci komputera na który pokazuje referencja y. To jest wyraźna różnica między obiektami i referencjami a prymitywami. Bo jak zrobisz:

int x = 1;
x = 2;

To zmieniłeś wartość zmiennej x.

0
public class Shop {
    public static void main(String[] args) {
        Product product1 = new Product();
        product1.name = "Samsung Syncmaster";
        product1.price = 700.0;

        Product product2 = new Product();
        product2.name = "HP Probook 450";
        product2.price = 3000.0;

        System.out.println("Produkty w sklepie: ");
        System.out.println(product1.name + ":" + product1.price);
        System.out.println(product2.name + ": " + product2.price);
    }
}

Może na przykładzie.
Co w tym programie jest obiektem???

Różnie pisza w tych książkach i materiałach i nie pokazują dokładnie co jest obiektem a co zmienną. Mieszaja w pojeciach i mi w głowie. FAjnie jak by było napisane kokretnie to jest obiekt a to zmienna wskazująca na ten obiekt itd

0

Ech. Masz tu dwa obiekty klasy Product. Każdy z nich zawiera obiekt klasy String. Nie wiem jak z price, jeśli to Float albo Double to też obiekty a jak float albo double to nie, bo prymitywy nie są obiektami.
Oprócz tego masz tu dwie referencje product1 i product2.

0
Product product1 = new Product();

To jest referencja do obiektu, ale każdy programista javy to wie i skrótowo mówi się o obiekcie po prostu.

0

Nie wiem jak z price, jeśli to Float albo Double to też obiekty a jak float albo double.

Co, nie rozumie, jest jakas róznica miedzy Float , Double pisane duzymi literami a float, double pisane małymi literami??
Ja zawsze spotykałem sie z float, double pisane małymi literami i wiem że to są typy proste, nie mam na razie pojecia co oznaczaja te same słówka pisane duzymi literami.

=================================================================

Ech. Masz tu dwa obiekty klasy Product.

Skoro product1 i product2 sa referencjami/zmiennymi obiektowymi, to właśnie chciałem żeby dokładnie pokazać w którym miejscu w kodzie są obiekty.

0

W kodzie nie ma obiektów. W kodzie widać że obiekty zostały utworzone na stercie poprzez new a ich "adresy" zostały zapamiętane w odpowiednich referencjach.
Float, Double czy Integer to są obiektowe opakowania na prymitywy takie jak float, double i int.

0

Spróbujmy od tej strony:
JVM (wirtualny maszyna Javy) ma dwa wydzielone obszary pamięci - heap i stack.

Zmienna:

	Type name; // deklaracja zmiennej o typie Type

Typy prymitywne, czyli te pisane z małej (boolean, char, int, long, float, double) są trzymane w stack'u.
przykładowo:

public int foo(){
	int i = 1; // w stack'u tworzona jest zmienna, której wartością będzie 1
	// do smth
	
	return -1; // po wykonaniu tej instrukcji zmienna i jest usuwana z stack'a
}

Obiekty - w zależności od widzimisię kompilatora, trafiają do heap'a lub stack'u. Zazwyczaj do tego pierwszego, do drugiego mogą trafić tylko w sytuacjach szczególnych (jak maszyna uzna, że tak będzie szybciej i prościej). I tak:

public MyPojo foo(){
	MyPojo pojo = new MyPojo(); // w heap'ie tworzony jest obiekt
	
	return null; // w tym miejscu nie musi on zostać usunięty, jedynie zostanie oznaczony jako "do usunięcia"
}

Obiekt pojo zostanie usunięty z pamięci dopiero w momencie, w którym GC przeskanuje heap w celu usunięcia zbędnych danych.

Referencja to taki szczególny typ obiektu, którego zadaniem jest przechowywać zależność pomiędzy zmienną, a obszarem w pamięci, pod którą kryje się obiekt. Czyli:

	MyPojo pojo; // tworzona jest zmienna

	pojo = new MyPojo(); // w tym miejscu tworzony jest obiekt MyPojo, i referencja do obiektu. Nastpnie do zmiennej "pojo" przypisana jest referencja do utworzonego obiektu

Wrappery to szczególne typy obiektów, które "opakowują" typy prymitywne. Typy są pisane wielką literą, np. Integer, String, Double itp. Tak jak już tutaj było napisane, można je tworzyć poprzez operator "new":

	Integer myInt = new Integer(1); // tworzony jest nowy obiekt Integer o wartości 1, do tej zmiennej przypisywana jest referencja do tego obiektu.

Jak wiemy można obiekty typu Integer tworzyć bezpośrednio przez operator przypisania. Jest to pewna metoda mająca na celu zwiększenie wydajności i de facto jest to po prostu łatwiejszy sposób na wywołanie Integer.valueOf, tj.

	   
	Integer int1 = 1;
    Integer int2 = Integer.valueOf(1);
    Integer int3 = new Integer(1);
    Integer int4 = 1;

    System.out.println(int1 == int2); // true, zmienne int1 i int2 posiadają referencje wskazujące na ten sam obiekt w pamięci
    System.out.println(int1 == int3); // false
    System.out.println(int1 == int4); // true

Ot, takie usprawnienie dla developerów.

0

Panowie dużo wyjaśniliście, chodź z początku wydawało się że mnie olejecie. Ja teraz przerabiam ksiażke Java podstawy wydanie IX - Gary Cornell zacząłem rozdział 4, miejcie dla mnie wyrozumienie bo nie znam jeszcze dużo rzeczy. Mam tez prośbę jak tłumaczycie coś to nie wykraczajcie z tłumaczeniem ponad mój poziom bo i tak nie zrozumie a dodatkowo zrobi mi sie mętlik w głowie. Przykład to te Wrappery. Kiedyś do nich dojde ale na razie chce małymi kroczkami isc.

=======

Nie za bardzo rozumie pojecie referencja, dlatego że czytając różne artykuły można natrafić na różne określenia. Np. :
http://naukajavy.pl/kurs-jezyka-java/86-referencje

po tym wnioskuje że referencja to zmienna obiektowa, wskaźnik ale znowu na poczatku tego artykułu pisze wartością referencji jest wskaźnik.

U ciebie:

MyPojo pojo; // tworzona jest zmienna

pojo = new MyPojo(); // w tym miejscu tworzony jest obiekt MyPojo, i referencja do obiektu. Następnie do zmiennej "pojo" przypisana jest referencja do utworzonego obiektu

Tak to brzmi jak by jak by referencja była czymś innym niż zmienna a dopiero później sie ją przypisywało do zmiennej.
Naprawdę miesza mi sie w głowie bo pojęć jest kilka i nie wiem czy chodzi o to samo.
Może ktoś ujednolici to i wyjaśni po kolei jak to właściwie jest, bo myla mi się te pojecia i nie wiem czy w końcu oznaczają one to samo czy to są pojęcia oznaczające coś innego.

0
golec2604 napisał(a):

Nie za bardzo rozumie pojecie referencja, dlatego że czytając różne artykuły można natrafić na różne określenia.

Wyobraź sobie, że obiekt to balon. Referencja to sznurek przywiązany jednym końcem do tego balona. Jeśli trzymasz drugi koniec sznurka, to potocznie mówiąc, trzymasz balon.

golec2604 napisał(a):

Tak to brzmi jak by jak by referencja była czymś innym niż zmienna a dopiero później sie ją przypisywało do zmiennej.

No bo - mniej więcej - tak jest.

Pod zmiennymi mogą kryć się typy proste (int, double, boolean itp.) jak i referencje do obiektów.

0

Panowie znalazłem coś co wszystko fajnie wyjaśnia: http://edu.pjwstk.edu.pl/wyklady/ppj/scb/ObRef/ObRef.html
A wiec referencja to wartość zmiennej typu obiektowego czyli adres który posiada zmienna typu obiektowego do swojego obiektu.
O coś takiego jak w tym moim podanym linku który znalazłem mi chodziło, teraz to mi rozjaśniło w głowie.

Mam tylko jedno pytanie do tego linka. Tam przy pokazaniu deklaracji liczby int x =4 pisze że potrzeba 4 bajty.
Bajt to 8 bitów a na rysunku pokazano na jednego bajta 4 bity. Pomyłka???

0

Jest napisane* i nie myl deklaracji z deklaracja + inicjacją. Warto rozróżniać te pojęcia. Myślę, że autor po prostu chciał pokazać jak przebiega przypisanie na rysunku, więc to nie ma znaczenia ile tych zer tam jest narysowane. Krok 1 to właśnie deklaracja a 2 inicjacja, czyli przypisanie do zmiennej(x) jakiejś wartości(4).

1
pedegie napisał(a):

(...) nie myl deklaracji z deklaracja + inicjacją. Warto rozróżniać te pojęcia.

Inicjację oraz inicjalizację też warto rozróżniać ;-)

0

Myślę, że autor po prostu chciał pokazać jak przebiega przypisanie na rysunku, więc to nie ma znaczenia ile tych zer tam jest narysowane

Wydaje mi się że jednak powinno być na rysunku tyle zer ile jest w rzeczywistości aby pokazać poprawny obraz.

Wartosc null:
w ksiazce Java podstawy Gary Cornel pisze, że : Zmienne obiektowe nie są automatycznie inicjowane wartością null.
A w linku http://edu.pjwstk.edu.pl/wyklady/ppj/scb/ObRef/ObRef.html pisze że po deklaracji zmiennej obiektowej dostaje ona automatycznie wartość null. Jak to jest w naprawdę??

Tworzenie obiektu:

Date birthday = new Date();

Zastanawia mnie że przy tworzeniu obiektu musimy określić jakiego on jest typu skoro w dalszej części składni i tak używamy konstruktora danej klasy z którego sie on wywodzi a nazwa konstruktora jest taka sama jak nazwa klasy. Czy nie można by było uprościć tego do takiej składni:

birthday = new Date();

Co wy na to??

hmmm???

0

Nie da się czegoś takiego zrobić w Javie, jako że jest językiem statycznie typowanym i podczas kompilacji MUSI zostać określony typ danej zmiennej. To co ty chciałbyś osiągnąć to dynamiczne typowanie spotykane np. w Python, Ruby

0

@golec2604 a co jak zrobię w kodzie:

reference = null;
if((new Random()).nextBoolean()){
  reference = new ClassOne();
}else{
  reference = new ClassTwo();
}
reference.metoda();

To co wtedy? Nadal uważasz że to takie oczywiste jakiego typu jest reference? I jak kompilator może sprawdzić czy reference.metoda() jest poprawnym wywołaniem skoro ta metoda jest w ClassOne a nie ma jej w ClassTwo? Powinien wg ciebie sygnalizować błąd czy nie?

Są dwa rodzaje języków które pozwalają na takie pisanie bez deklaracji typów.
Masz języki takie jak python które sprawdzają typy w czasie wykonania programu. Python w zasadzie w ogóle nie przejmuje się typami jako jakimi tylko sprawdza sobie czy dany obiekt ma wymagane pole/metode.
Z drugiej strony masz języki (głównie funkcyjne) które korzystają z inferencji typów (np. https://en.wikipedia.org/wiki/Hindley–Milner_type_system ), tzn interpreter/kompilator analizuje program i dedukuje sobie typy zmiennych. Czyli teoretycznie robi to o czym pisałeś, niemniej o ile w języku funkcyjnym da sie to zrealizować o tyle w Javie byłoby to raczej trudne.

0

Jeszcze to:
Wartosc null:
w ksiazce Java podstawy Gary Cornel pisze, że : Zmienne obiektowe nie są automatycznie inicjowane wartością null.
A w linku http://edu.pjwstk.edu.pl/wyklady/ppj/scb/ObRef/ObRef.html pisze że po deklaracji zmiennej obiektowej dostaje ona automatycznie wartość null. Jak to jest w naprawdę??

(zrobiłem nawet mały test w drJava zdeklarowałem zmienna typu obiektowego i potem wywołałem zmienna i pokazało mi wartość null a wiec wydaje mi sie że po samej deklaracji zmiennej obiektowej ma ona wartość null.)

0
Random r1;
Random r2 = null;

Obie zmienne mają wartość null, ale zmienna r1 jest przez kompilator uważana za zmienną niezainicjowaną i nie pozwala jej używać.

0

Pola obiektu inicjalizowane są domyślnymi wartościami dla tego pola i tak np. pole o typie boolean ma wartość false. Typy referencyjne zawsze są nullami. Zmienne lokalne musisz zainicjalizować przed pierwszym użyciem.

0

Zmienne obiektowe nie są automatycznie inicjowane wartością null. Trzeba je własnoręcznie
inicjować za pomocą operatora new lub ustawiać ich wartość na null.

Powyższe zdanie z książki mnie zmyliło.
Ponieważ w tym linku http://edu.pjwstk.edu.pl/wyklady/ppj/scb/ObRef/ObRef.html pisze w miejscu pod schematem ideowym pisze tak:
pkt1. Przydzielenie pamięci zmiennej p do przechowania referencji do obiektu (4 bajty w pamięci). Referencja jest nieustalona, ma wartość null, co oznacza, że nie odnosi się do żadnego obiektu.

I myślałem że to z automatu ma ona inicjacje null.

Tak to właśnie jest jak w pewnym źródle czegoś brakuje człowiek szuka w innym a w tym innym źródle wytłumaczono to co szukałem ale znowu zapomniano o jednej ważnej informacji.

Gdyby napisano takie cos jak tutaj:

bogdans napisał(a):
Random r1;
Random r2 = null;

Obie zmienne mają wartość null, ale zmienna r1 jest przez kompilator uważana za zmienną niezainicjowaną i nie pozwala jej używać.

człowiek by zrozumiał o co chodzi.

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