[TYPY] Podstawy - byte itp

0

Zaczynam przygodę z Java i korzystam sobie z książki 'Jacek Rumiński – Język JAVA' Jestem na rozdziale związanym z typami i mam pewien problem ze zrozumieniem wyników działania poniższego kodu:

public class Typy {

    /**
     * aplikacja ukazująca różne typy danych podstawowych i klasy typów danych.
     */
    public static void main(String[] args) {
        boolean prawda[] = new boolean[2];
        prawda[0]=true;
        byte bajt = (byte)0;
        int liczba = 127;
        long dluga = 123456789L;
        char znak1 = '\u0104';  //w Unicodzie kod litery ‘Ą’
        char znak2 = 'ą';
        char znaki[] = {'M', 'O', 'C'};
        System.out.println("Oto zmienne: ");
        System.out.println("boolean[0]= "+prawda[0]);
        System.out.println("boolean[1]= "+prawda[1]+" wartość domyślna, bezdeklaracji");
        System.out.println("byte= "+bajt);
        System.out.println("int= "+liczba);
        System.out.println("long= "+dluga);
        System.out.println("char= "+znak1);
        System.out.println("char= "+znak2);
        Integer liczba1 = new Integer(liczba);
        //liczba1 = 100;
        bajt = liczba1.byteValue();
        System.out.println("byte= "+bajt);
        String str = new String(znaki);
        System.out.println(str);
    }

}

Wynikiem działania tego kodu jest:
Oto zmienne:
boolean[0]= true
boolean[1]= false wartość domyślna, bezdeklaracji
byte= 0
int= 127
long= 123456789
char= Ą
char= ą
byte= 127
MOC

I to rozumiem bo zmienna bajt jest typu byte:

typ liczbowy, jednobajtowy za znakiem. Wartości tego typu mieszczą
się w przedziale: -128 do 127.

Co prawda nie rozumiem tego zapisu

byte bajt = (byte)0;

po co to (byte)0 nie mogłoby być samo zero od razu?

Ale zacząłem sobie kombinować i wpisałem 128 czyli powyżej zakresu byte czyli

byte bajt = (byte)128;

wynikiem tego jest byte= -128 i tu juz nie wiem dlaczego tak? Jeśli teraz zwiększe znowu liczbę o jeden to wynik zmniejszy się o jeden czyli dla 129 będzie -127 itd? Jak to rozumieć?
Teraz dalej jest taki fragment kodu:

Integer liczba1 = new Integer(liczba);
bajt = liczba1.byteValue();

Powiedzcie mi czy dobrze rozumiem: Tworzymy obiekt liczba1 klasy Integer przez konstruktor Integer(liczba) gdzie liczba to nasza wcześniej zadeklarowana zmienna:

int liczba = 127;

czyli obiekt liczba1 w jakimś swoim wewnętrznym polu zapamięta wartość liczba czyli w tym przypadku 127.
Następnie do zmiennej bajt też już wcześniej zadeklarowanej przypisujemy nową wartość liczba1.byteValue() i tu mam pytanko, ja rozumiem to tak, że obiekt liczba1 korzystając z metody byteValue():

Returns the value of this Integer as a byte.

Zwróci wartość Integer jako byte, czyli dokona konwersi typu Integer na typ byte?

'\u0104' czy to jest w hex?

Sorki że trochę przydługie ale wytłumaczcie i to.

0
Passenger napisał(a)

A ja mam kłopot ze zrozumieniem dlaczego tyle razy zamieściłeś kod?

Zrobiłem to na chwile bo chciałem zobaczyć różnice w zapisie a nie zauważyłem podglądu posta sorry [browar]

0

Stała 128 jest typu int (4-bajtowa), zatem jest zapis dwójkowy wygląda tak:
00....0010000000 (z przodu są 24 zera). Po zrzutowaniu na typ byte powstanie liczba 1-bajtowa
10000000, a to jest właśnie -128.
Podobnie dla 129 = 00....0010000001, po zrzutowaniu 10000001, a to jest -127.

0
Passenger napisał(a)

Stała 128 jest typu int (4-bajtowa), zatem jest zapis dwójkowy wygląda tak:
00....0010000000 (z przodu są 24 zera). Po zrzutowaniu na typ byte powstanie liczba 1-bajtowa
10000000, a to jest właśnie -128.
Podobnie dla 129 = 00....0010000001, po zrzutowaniu 10000001, a to jest -127.

No niby cos zaczyna mi świtać ale
hmmm.... Dlaczego zakładasz że zapis

byte bajt = (byte)128;

to te 128 jest typu integer 4 bajty a nie np: short 2 bajty?

Nie rozumiem jak pojawia się ten minus przy liczbie bo 10000000 binarnie to 128 dec a nie -128, a 10000001 b to 129 dec a nie -127. Nie rozumiem tego rzutowania :-(

0
  1. Fragment dokumentacji języka:

An integer literal is of type long if it is suffixed with an ASCII letter L or l (ell); otherwise it is of type int.

  1. Ciąg bitów akak-1...a0 (k=7,15,31,63) jest dla typów signed (a Java ma tylko typy signed) interpretowany jako -ak2k + ak-12k-1 + ... +a121 + a020
0

@yeeezooo, 128 to binarnie dwa bajty. łatwiej zrozumiesz to tak:
1 0000000
| └ wartość 7 młodszych bajtów
└ znak najstarszy bajt

W Javie nie ma typu unsigned, czyli bez znaku. Jeżeli chcesz upchnąć na 8 bitach liczbę ze znakiem to musisz poświęcić jeden bit na zapis znaku. Wymyślono więc, że znak - będzie oznaczany przez 1 na początku. 0 na początku oznacza liczbę dodatnią.
teraz na 7 bitach możesz zapisać 128 kolejnych liczb zaczynając od 0. I to jest najważniejsze w tym wszystkim. Zaczynasz numerację od 0, bo
0 0000000 = 0
0 0000001 = 1
0 0000010 = 2
...
0 1111111 = 127
i teraz jeżeli chcesz zapisać 128 to rozsądne jest:
1 0000000 = 128
ale jako, że jedynka z przodu oznacza liczbę ujemną więc masz "ujemne zero"
1 0000000 = -0
Głupota... Oczywiście 0 nie jest ujemne, a zostało już uwzględnione w liczbach dodatnich, więc zapis
1 0000000 = -128
jest rozwiązaniem tego problemu.
Dlaczego 128, a nie tak jak w przypadku dodatnich 127?
Ponieważ na 7 bitach masz do dyspozycji nadal 128 liczb, ale numerację zaczynasz od 1, a nie od 0.

0

@Koziołek bez obrazy, ale to co napisałeś jest może zrozumiałe dla informatyka, ale dla matematyka to bełkot.

0

@passenger, nie jestem informatykiem, a taką metodę kilkukrotnie stosowałem nawet w stosunku do dzieciaków na korepetycjach i działa. Jest obrazowa i zrozumiała (zauważ, że prowadzi za rączkę), a nie ścisła.

Jeszcze jedna rzecz zapis \u0104 to zapis znaku w kodowaniu UTF-8.

0
yeeezooo napisał(a)

Teraz dalej jest taki fragment kodu:

Integer liczba1 = new Integer(liczba);
bajt = liczba1.byteValue();

Powiedzcie mi czy dobrze rozumiem: Tworzymy obiekt liczba1 klasy Integer przez konstruktor Integer(liczba)

Dokładniej jest tak:

  1. Tworzysz jakiś obiekt o którym wiesz tylko tyle, że jest klasy Integer oraz jego konstruktor przyjął argument int o wartości 3. Możemy go nazwać ENIGMA.
  2. Przypisujesz referencję obiektu ENIGMA do zmiennej liczba1 przechowującej referencje do obiektów klasy Integer.
    Zapamiętaj. liczba1 nie jest obiektem - jest zaledwie zmienną referencyjną przechowującą referencję do czegoś. Obiektem nie jest nawet "new Integer(3)" - jest tylko przydzieleniem pamięci o niezbędnym rozmiarze i wywołaniem dla niej konstruktora tego obiektu. Ostatecznie to ta pamięć staje się obiektem.
    Poza tym Integer, to bardzo specyficzny przypadek klasy. Definicja tej klasy jest zaszyta w kompilatorze Java, a sam kompilator potrafi obecnie przerabiać obiekty opakowujące takie jak Integer na liczby int oraz odwrotnie: tworzyć Integer z liczb int tam gdzie jest taka potrzeba. Dlatego Integer, to nie najlepszy przykład obiektu bo nie zachowuje się jak zwykły obiekt zwyczajnie zdefiniowanej klasy.

ja rozumiem to tak, że obiekt liczba1 korzystając z metody byteValue() [...] Zwróci wartość Integer jako byte, czyli dokona konwersji typu Integer na typ byte?

Nie. byteValue() zwraca wartość byte, ale ponieważ w Javie wszelkie wartości są rozszerzane albo do wartości int, albo do wartości long (jeżeli choć jedna wartość long pojawi się jako argument operatora matematycznego), to byteValue() momentalnie stanie się typem int (lub long).
Obecnie wartości byte mają sens i jakieś znaczenie tylko w tablicach bajtów, gdzie są upychane bajt po bajcie oraz przy zapisie do pliku gdzie liczy się każdy konkretny bajt.

W pozostałych przypadkach konwersja na byte mogłaby służyć wyłącznie obcięciu zakresu liczb do -128..+127. Ale nie ma to praktycznego znaczenia ponieważ w żadnym z języków wysokiego poziomu od 40 lat nie ma wyjątków arytmetycznych takich jak przepełnienie lub nadmiar. Skoro więc nie są wykrywane błędy arytmetyczne, to takie obcięcia do niczego nie mogą się przydać. No, ale to tylko ciekawostka.

ps. Co do Koziołkowego łopatologicznego wytłumaczenia zapisu uzupełniowego do 2 (U2) dodać warto, że liczby ujemne zakodowane są do tyłu (10000000, to -128, a 11111111, to -1).
Jest tak z kilku ważnych powodów, z których najważniejszym jest ten, że arytmetyka U2 nie różni się na poziomie procesora dokładnie niczym od arytmetyki liczb binarnych bez znaku. To są te same operacje, inna jest tylko interpretacja wyniku. Na przykład dzięki temu operacja odejmowania działa identycznie bez względu na to czy liczby biorące udział w operacji interpretować jako dodatnie bez znaku czy ujemne (nawet obie). Innym ważnym powodem jest wręcz prostacka metoda konwersji z szerszego zakresu do węższego i odwrotnie. Polega ona po prostu na zwykłym obcięciu bajtów od najbardziej znaczących (od lewej), albo na dołożeniu bajtów wyzerowanych (lub z ustawionym najwyższym bitem dla liczb ujemnych).
Dzięki temu sprytnemu posunięciu do antycznych procesorów nie trzeba było wprowadzać niemal żadnych większych zmian poza zaimplementowaniem dodatkowych flag (i tak wcześniej zarezerwowanych) informujących o wyniku operacji gdyby interpretować operandy jako liczby ze znakiem (np. niedomiar).
Zmiana znaku również nie skomplikowała się zbyt mocno bo oprócz zmiany bitu znaku trzeba jedynie odwrócić wszystkie pozostałe bity i zwiększyć całą liczbę o 1.
Ciekawostką jest to, że odwrócenie znaku liczby zero (00000000) wciąż daje zero (odwracamy bity: 11111111, i zwiększamy: (1) 00000000, przepełnienie jest ignorowane), a -128 po rozszerzeniu do np. 16-bit daje +128 (10000000->01111111->00000000|10000000) lub pozostanie nadal -128 w byte (brak odpowiednika). Kwestia interpretacji.
To właśnie dlatego U2 nazywa się zapisem uzupełnieniowym, a nie "kodowaniem" uzupełnieniowym. Kodowanie po prostu nie zmienia się.

0

Co do rzutowania na byte to chyba zaskoczyłem :) Rozumiem to tak, że z każdej liczby i tak bierzemy tylko najmłodszy bajt, w którym najstarszy bit ma wartość -128 (jeśli jest jedynką) i teraz wszystkie wcześniejsze bity z ich wagami po prostu dodajemy do -128 czyli np:
00000000 wynikiem będzie 0
10000000 wynikiem będzie -128
10000001 wynikiem będzie -127
00000001 00000000 wynikiem będzie 0 (mimo iż w dec jest to 256, bo bierzemy tylko młodszy bajt)
00000001 00000001 wynikiem będzie 1 (mimo iż w dec jest to 257, bo bierzemy tylko młodszy bajt)
itd....
Dziękuję za wyjaśnienie tego i powiem wam że zarówno łopatologiczne tłumaczenie Koziołka było super od razu mi uzmysłowiło o co kaman jak i późniejsze spojrzenie na wzór Pasażera podało receptę na przyszłość, więc nie kłócicie się tylko tak dalej uzupełniajcie [browar]

Jeszcze jedna rzecz zapis \u0104 to zapis znaku w kodowaniu UTF-8.

ok rozumiem że w kodowaniu UTF-8 ale czy 0104 to zapis w hex? a do tego znalazłem jakąś tabelkę UTF-8 ale tam nie ma znaku o tym kodzie czyli "Ą"

PS: Olamagato bardzo ciekawe rozważania o U2 szacun [browar] analizuje teraz to co napisałeś o Integer na razie ciężko :/

0

Tak. To jest hex. Ten skrócony format unikodu działa w ten sposób, że do zakodowania znaku o kodzie większym niż 127 (0x7F) używa się dwóch bajtów, o kodzie większym niż 0x7FF trzech bajtów i tak dalej (z tego najwyższy bajt posiada informację o długości sekwencji).
Zaletą takiego podejścia jest zgodność z 7-bitowym kodowaniem ASCII, brak problemu z kolejnością bajtów znaku (little i big endian) i wciąż niewielki rozmiar zakodowanego tekstu. Wadą jest zmienna długość i niejednoznaczność kodowania znaków zmuszająca do dodatkowego założenia, że każdy program musi odrzucać znaki zakodowane dłuższą sekwencją jeżeli da się je zakodować krótszą.

0
Olamagato napisał(a)

Dokładniej jest tak:

  1. Tworzysz jakiś obiekt o którym wiesz tylko tyle, że jest klasy Integer oraz jego konstruktor przyjął argument int o wartości 3. Możemy go nazwać ENIGMA.
  2. Przypisujesz referencję obiektu ENIGMA do zmiennej liczba1 przechowującej referencje do obiektów klasy Integer.

Hmmm... a mógłbyś to odnieść do kodu który podałem czyli liczba1 i argumentu liczba, bo nie widzę tego obiektu Enigma, jakbyś mógł go wskazać który to jest w moim kodzie?
I zamiast 3 rozumiem że u mnie jest liczba?

Olamagato napisał(a)

Zapamiętaj. liczba1 nie jest obiektem - jest zaledwie zmienną referencyjną przechowującą referencję do czegoś. Obiektem nie jest nawet "new Integer(3)" - jest tylko przydzieleniem pamięci o niezbędnym rozmiarze i wywołaniem dla niej konstruktora tego obiektu.

To mnie trochę dziwi, bo w książce z której korzystam jest niby napisane że jeżeli piszemy wielką literą Integer a potem coś dalej u mnie liczba1 to to jest obiekt tej klasy, a jeśli jest małą literą int to to jest typ i później zmienna u mnie liczba A ty mi piszesz, że liczba1 to nie obiekt? Tu mam jednak galimatias. Referencja to inaczej wystąpienie czyli konkretny obiekt z danej klasy, tak? Np: klasa Samochody a obiekt to mój_samochód i to jest referencja klasy Samochody?

Olamagato napisał(a)

Nie. byteValue() zwraca wartość byte, ale ponieważ w Javie wszelkie wartości są rozszerzane albo do wartości int, albo do wartości long (jeżeli choć jedna wartość long pojawi się jako argument operatora matematycznego), to byteValue() momentalnie stanie się typem int (lub long).

No chyba tak napisałem (przynajmniej mam taką nadzieje :)), że metoda byteValue() zwraca byte a argumentem dla tej metody jest integer pochodzący z konstruktora Integer(liczba) a liczba jest typu int czyli defakto będzie konwersja int to byte, tak?

0

Może niezbyt precyzyjnie to sformułowałem. Chodzi o to, że w Javie tak naprawdę nie ma identyfikatorów lub zmiennych reprezentujących obiekt. Napisałem, że obiekt można nazwać ENIGMA ponieważ liczyłem, że zorientujesz się, że żaden obiekt właściwie nie ma swojej nazwy - jest anonimowy. Jedyną realną identyfikacją każdego obiektu jest adres tego obiektu czyli faktycznie referencja (w metodach tego obiektu jest to this, a poza nimi wywołanie new konstruktor() ).
liczba1 jest zaledwie zmienną przechowującą tylko referencję do jakiegoś konkretnego obiektu. Może ona nie przechowywać żadnej referencji i wtedy jej wartością jest null. W takim wypadku łamie się utożsamianie zmiennej z obiektem bo wtedy trzeba by założyć, że istnieje obiekt, którego nie ma. :d

To mnie trochę dziwi, bo w książce z której korzystam jest niby napisane że jeżeli piszemy wielką literą Integer a potem coś dalej u mnie liczba1 to to jest obiekt tej klasy

W wielu książkach do Javy ich autorzy w początkowych rozdziałach podają, że nazwa taka jak liczba1 reprezentuje zmienną przechowującą obiekt, ale to jest tylko uproszczenie, które w późniejszej nauce Javy może się zemścić. Zmienna liczba1 przechowuje referencję, czyli wskaźnik lub inaczej mówiąc odnośnik do obiektu. Zawsze będziesz miał dostęp do jakiegokolwiek obiektu na stercie (a wszystkie są tam tworzone) wyłącznie za pośrednictwem jakiejś zmiennej referencyjnej lub wyrażenia dającego w wyniku referencję na jakiś obiekt.

Utożsamianie zmiennej liczba1 z obiektem typu Integer, który ona tylko reprezentuje, jest o tyle niewłaściwe, że może się komuś wydać, że przepisując referencję do innej zmiennej referencyjnej wykonuje się kopiowanie obiektu. Czyli zamiast jednego obiektu będziemy mieli dwa. Faktycznie obiekt będzie jeden, ale zmiennych przechowujących referencję do niego może być nieograniczona ilość. Wywołanie metody za pośrednictwem którejkolwiek z takich zmiennych będzie wykonaniem jej dla tego samego obiektu.

Np: klasa Samochody a obiekt to mój_samochód i to jest referencja klasy Samochody?

Dla Samochody mój_samochód = new Samochody();
Klasa Samochody, utworzony obiekt nie ma nazwy, "new Samochody()", to referencja do tego obiektu, a mój_samochód to zmienna (przechowująca referencje na obiekty klasy Samochody), której w ten sposób przypisujesz referencję do tego utworzonego obiektu bez nazwy.
Można próbować utożsamiać mój_samochód z tym obiektem, ale tylko do czasu aż nie wykonasz jakiegoś przypisania do zmiennej mój_samochód. Na przykład
mój_samochód = new Samochody(sąsiada);
W tym wypadku mój_samochód reprezentuje już zupełnie inny obiekt, a jeżeli poprzedni przypisany tej zmiennej obiekt nie miał swojej referencji przypisanej innej zmiennej, to do tamtego samochodu nie można się już w żaden sposób dostać, a sam samochód idzie do śmieci (dosłownie do odśmiecacza).

No chyba tak napisałem (przynajmniej mam taką nadzieje :)), że metoda byteValue() zwraca byte a argumentem dla tej metody jest integer pochodzący z konstruktora Integer(liczba) a liczba jest typu int czyli defakto będzie konwersja int to byte, tak?

Niezupełnie. byteValue(), rzeczywiście zwraca byte (przynajmniej przez moment), ale nie ma ona żadnego argumentu. Natomiast wywoływana jest ona dla obiektu klasy Integer, którego referencję (w tym momencie) przechowuje zmienna referencyjna liczba1. Obiekt na rzecz którego wywołujemy metodę formalnie nie jest jej argumentem.
(Faktycznie jest niejawnym argumentem, ale musiałbym Ci w tym celu wytłumaczyć jak są zbudowane obiekty, a to trochę dużo do wyjasniania i więcej Ci na tym etapie zaciemni niż pomoże zrozumieć).
Możesz na razie przyjąć jako zasadę, że metoda może operować tylko na danych tego obiektu (zmieniać go) i ewentualnie na danych przekazanych jej jako argumenty.

Natomiast typy takie jak int, byte czy double nie są w ogóle obiektami. To dane proste, które są przechowywane w swoich zmiennych w całości, a przypisanie (=) powoduje skopiowanie takiej wartości do innej zmiennej. Jest tak to zrobione ponieważ nawet najprostszy obiekt klasy Integer zajmuje 2 lub 4 razy więcej pamięci i jest o 100% wolniejszy (lub bardziej). Wprowadzone zostały do Javy z powodu potrzeby większej wydajności programów.
Języki, które nie mają zmiennych prostych albo mają bardzo rozbudowane i skomplikowane kompilatory, albo wygenerowany kod jest wyraźnie wolniejszy w działaniu.

ps. Problemy z utożsamianiem zmiennych referencyjnych z obiektami wychodzą dośc późno w takich tematach jak ten:
http://4programmers.net/Forum/viewtopic.php?id=141180
To klasyczny przykład, że złe zrozumienie skutkuje czasem dość późno i wtedy jest to duży ból.

0
Olamagato napisał(a)

Dla Samochody mój_samochód = new Samochody();
Klasa Samochody, utworzony obiekt nie ma nazwy, "new Samochody()", to referencja do tego obiektu, a mój_samochód to zmienna (przechowująca referencje na obiekty klasy Samochody), której w ten sposób przypisujesz referencję do tego utworzonego obiektu bez nazwy.
Można próbować utożsamiać mój_samochód z tym obiektem, ale tylko do czasu aż nie wykonasz jakiegoś przypisania do zmiennej mój_samochód. Na przykład
mój_samochód = new Samochody(sąsiada);
W tym wypadku mój_samochód reprezentuje już zupełnie inny obiekt, a jeżeli poprzedni przypisany tej zmiennej obiekt nie miał swojej referencji przypisanej innej zmiennej, to do tamtego samochodu nie można się już w żaden sposób dostać, a sam samochód idzie do śmieci (dosłownie do odśmiecacza).

Czyli rozumiem, że w drugim przypadku tworzymy drugi obiekt new Samochody(sąsiada) i referencja mój_samochód się nadpisuje i tracimy ten pierwszy obiekt new Samochody(). To jak zrobić drugą referencję wskazującą na ten pierwszy obiekt żeby go nie stracić? W pewnym momencie będziemy mieli dwie referencje na ten sam obiekt? lub więcej? Pokaż mi to w kodzie.

Olamagato napisał(a)

Niezupełnie. byteValue(), rzeczywiście zwraca byte (przynajmniej przez moment), ale nie ma ona żadnego argumentu. Natomiast wywoływana jest ona dla obiektu klasy Integer, którego referencję (w tym momencie) przechowuje zmienna referencyjna liczba1. Obiekt na rzecz którego wywołujemy metodę formalnie nie jest jej argumentem.

Faktycznie ta metoda nie ma argumentu troche się rozpędziłem. Bardziej mi tu chodziło o to że wcześniej jest takie coś

Integer liczba1 = new Integer(liczba);

Czyli tworzymy obiekt klasy Integer z referencją na niego liczba1 ale przy konstruowaniu go przekazujemy do ciała obiektu klasy Integer argument liczba I co tu się dzieje? gdzie on trafia? jak to znaleźć? przecież liczba w tym wypadku to 127. Czy to trafia do jakiegoś pola obiektu klasy Integer?
Nie widzę tego ciała? I potem faktycznie referencja obiektu liczba1 korzysta z metody byteValue() i zwraca wartość byte ze 127 int. czyli w tym wypadku też 127 ale już typu byte.

Sorki że tak marudze ale musze zaskoczyć widze podstawy ;)

0

Czyli rozumiem, że w drugim przypadku tworzymy drugi obiekt new Samochody(sąsiada) i referencja mój_samochód się nadpisuje i tracimy ten pierwszy obiekt new Samochody()

Dokładnie.

To jak zrobić drugą referencję wskazującą na ten pierwszy obiekt żeby go nie stracić?

Na przykład tak:

Samochody samochódWGarażu = mój_samochód;
Samochody samochódNaLawecie = mój_samochód;

W ten sposób masz razem trzy zmienne referencyjne odwołujące się do tego samego obiektu do którego pierwotnie miał referencję tylko mój_samochód.

Po prostu referencję przerzucasz z jednej zmiennej do innej. Z referencją w Javie można zrobić bardzo niewiele - użyć jej (przepisać do innej zmiennej lub wrzucić jako argument metody), albo wykorzystać do wywołania metody na rzecz obiektu, którego referencję trzyma: np. mój_samochód.wymianaOpon();

Czyli tworzymy obiekt klasy Integer z referencją na niego liczba1 ale przy konstruowaniu go przekazujemy do ciała obiektu klasy Integer argument liczba I co tu się dzieje? gdzie on trafia? jak to znaleźć? przecież liczba w tym wypadku to 127. Czy to trafia do jakiegoś pola obiektu klasy Integer?

Dokładnie tak. Obiekt klasy Integer ma "zapewne" jakieś swoje pole typu int, w którym trzyma tę wartość.
Metoda byteValue() korzysta z tego pola oddając jako swój wynik wartość byte obciętą z tego pola. Jeżeli przypiszemy rezultat tej metody do innej zmiennej typu byte lub wrzucimy do innej metody jako argument typu byte (w Javie tego akurat nie jestem pewien), to mogą to być jedyne przypadki gdy jego wartość nie zostanie rozszerzona do int lub szerszego.

0
Samochody mój_samochód = new Samochody();
Samochody samochódWGarażu = mój_samochód;
Samochody samochódNaLawecie = mój_samochód;

Czy to oznacza tak jak pisałeś, że teraz te 3 referencje wskazują na ten sam obiekt new Samochody() czyli każda z tych referencji może na niego "działać" czyli istnieje ryzyko, że jedną referencją coś w tym obiekcie zmienię a drugą np wrócę to stanu pierwotnego. np:

mój_samochód.wymianaOpon(letnie);
samochódNaLawecie.wymianaOpon(brak_opon);

To w jakimś tam polu obiektu new Samochody() pole o wartości letnie zostanie nadpisane wartością brak_opon, tak?

Muszę przyznać, że nie jest to takie łatwe albo ja za trudno myślę ;-) ale po mału klaruje mi się obiektowość.

0

@yeeezooo, dokładnie tak jak myślisz. Tylko, że pamiętaj, że jest to obiektowość Javy. W C++ można przekazać zarówno referencję, jaki i wartość obiektu czyli wykonać jego kopię.

0

Ok proponuje EOT muszę sobie to poukładać co mi napisaliście za co wam dziękuję [browar] Mam nadzieje, że jako początkujący za bardzo nie podpadłem :-D I nie mogę was tak zamęczać bo może będę miał jeszcze kilka mln. pytań ;-)

0

To w jakimś tam polu obiektu new Samochody() pole o wartości letnie zostanie nadpisane wartością brak_opon, tak?

Tutaj to nie jest tak jak myślisz. W wywołaniu

mój_samochód.wymianaOpon(letnie);
samochódNaLawecie.wymianaOpon(brak_opon);

letnie i brak_opon nie są polami obiektów reprezentowanych przez zmienne mój_samochód i samochódNaLawecie. To co o nich (letnie i brakOpon) na pewno wiadomo, to tylko tyle, że zostały przekazane jako argumenty do metody wymianaOpon(). Jeżeli nie znasz definicji klasy Samochody, to nic więcej nie możesz powiedzieć bo nie będziesz wiedzieć co ta metoda ze swoim parametrem wywołania zrobi i czy w ogóle coś zrobi.
Na przykład jeżeli definicja tej metody (wywołanej na rzecz obiektu klasy Samochody lub będącego potomkiem tej klasy) będzie taka:

void wymianaOpon(Opony nowe)
{
    System.err.println("Wymiana niemożliwa. To jest czołg.");
}

To żadne pole nie zostanie niczym nadpisane. Ba pole z oponami w ogóle nie musi istnieć. Po prostu w wywołaniu konkretnego egzemplarza tej metody argumentowi metody czyli zmiennej referencyjnej "nowe" zostanie przypisana referencja przechowywana przez zmienne letnie oraz brak_opon. A czy metoda coś z tym argumentem zrobi, to sprawa jej definicji.

0
Olamagato napisał(a)
void wymianaOpon(Opony nowe)
{
    System.err.println("Wymiana niemożliwa. To jest czołg.");
}

To żadne pole nie zostanie niczym nadpisane. Ba pole z oponami w ogóle nie musi istnieć. Po prostu w wywołaniu konkretnego egzemplarza tej metody argumentowi metody czyli zmiennej referencyjnej "nowe" zostanie przypisana referencja przechowywana przez zmienne letnie oraz brak_opon. A czy metoda coś z tym argumentem zrobi, to sprawa jej definicji.

No tak nic dodać nic ująć ;-) musze jednak patrzeć na nazwy przez pryzmat referencji do jakiejś komórki pamięci bo tak z tego wynika.

0

A jeszcze tak z innej beczki jakie książki lub może jakieś linki byście polecali do nauki Java-y?

0

Moim zdaniem najprzystępniej napisanym podręcznikiem do Javy jest Thinking in Java Buce'a Eckela (najlepiej ostatnia edycja - chyba 4.). Mam takich książek ze 12 i ta wydaje się najlepsza. Wyszukaj tematy z takim pytaniem bo jest kilka innych polecanych przez ludzi.

Natomiast ta, którą podaję ma zasadę, że każdy temat bazuje na informacji z poprzednich rozdziałów, należy więc ją czytać po kolei i robić zadania (co jest wtedy banalnie łatwe). Podręcznik obejmuje niemal wszystkie zagadnienia, więc jest niemal kompletnym kursem. Na końcu każdego masz kilka zadań, na końcu działów masz projekty. Jeżeli średnio znasz angielski, to możesz czytać jej darmową wersję w internecie (nie wiem tylko czy ostatnie wydanie). No to tyle w sprawie niesponsorowanej reklamy.

0

core java podstawy - dla mnie najlepsza bo nie lubie stylu TiJ ale sa rozne gusta

0

Udało mi się znaleźć 3 wydanie nie wiem czym różni się od 4 czy duże zmiany? ale darowanemu koniowi......
Więc zacznę na spokojnie ją czytać.

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