Obiekt oraz String

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

G2
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 7 lat
  • Postów:215
0

Gdy tworzymy obiekt to piszemy:

Kopiuj
NazwaKlasy obiekt = new NazwaKlasy()

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

Kopiuj
String obiekt = new String()

tylko piszemy np:

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

edytowany 3x, ostatnio: bogdans
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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ć.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
G2
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 7 lat
  • Postów:215
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ą

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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).


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Wizzie
jako poprawne stałe można by uznać obiekty immutable z final, tego się nie da już zmienić :P
G2
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 7 lat
  • Postów:215
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.

edytowany 1x, ostatnio: golec2604
Sarrus
nie oczekuj, że będziemy tutaj tworzyć słownik pojęć. Shalom napisał posta dość prostym językiem i jeżeli nie rozumiesz pojęć w nim użytych, to powinieneś poszukać w necie, albo zapytać w prost co oznacza literał na przykład.
NoZi
  • Rejestracja:około 16 lat
  • Ostatnio:25 dni
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

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

x == y  da true

 

Hate the sin, love the sinner
edytowany 1x, ostatnio: NoZi
G2
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 7 lat
  • Postów:215
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ą?

edytowany 2x, ostatnio: golec2604
Sarrus
przeczytaj jeszcze raz pierwszy post @Shalom'a
NoZi
  • Rejestracja:około 16 lat
  • Ostatnio:25 dni
0

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

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


Hate the sin, love the sinner
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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.

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

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

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

Kopiuj
int x = 1;
x = 2;

To zmieniłeś wartość zmiennej x.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 2x, ostatnio: Shalom
G2
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 7 lat
  • Postów:215
0
Kopiuj
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

edytowany 3x, ostatnio: bogdans
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:11 dni
  • Postów:2512
0
Kopiuj
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.

G2
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 7 lat
  • Postów:215
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.

edytowany 5x, ostatnio: golec2604
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:20 minut
  • Postów:3592
0

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

Zmienna:

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

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

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

Kopiuj
	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":

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

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

G2
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 7 lat
  • Postów:215
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.

edytowany 1x, ostatnio: golec2604
W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:20 minut
  • Postów:3592
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.

edytowany 1x, ostatnio: wartek01
G2
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 7 lat
  • Postów:215
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???

edytowany 1x, ostatnio: golec2604
NoZi
generalnie wszyscy Ci to samo piszą od 2 posta, ale fajnie że w końcu jako tako rozumiesz.
pedegie
  • Rejestracja:około 11 lat
  • Ostatnio:ponad rok
  • Postów:204
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).

IM
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 9 lat
  • Postów:46
1
pedegie napisał(a):

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

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

G2
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 7 lat
  • Postów:215
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???

edytowany 1x, ostatnio: golec2604
NoZi
  • Rejestracja:około 16 lat
  • Ostatnio:25 dni
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


Hate the sin, love the sinner
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

@golec2604 a co jak zrobię w kodzie:

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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
Wizzie
rozumiesz coś z tego systemu H-M? :D
Shalom
Oczywiście, przecież to są podstawy!
G2
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 7 lat
  • Postów:215
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.)

edytowany 1x, ostatnio: golec2604
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0
Kopiuj
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ć.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
NoZi
  • Rejestracja:około 16 lat
  • Ostatnio:25 dni
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.


Hate the sin, love the sinner
G2
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 7 lat
  • Postów:215
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):
Kopiuj
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.

edytowany 4x, ostatnio: golec2604

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.