Metoda add klasy BigInteger

0

Hej

Mam taki kod:

        BigInteger bd1 = new BigInteger("987654321");
		BigInteger bd2 = new BigInteger("123456789");
		BigInteger sum = bd1.add(bd2);

Na jaki obiekt wskazuje teraz zmienna sum?

2

Zgodnie z dokumentacją https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html
na nowy obiekt typu BigInteger czyli ani nie bd1 ani nie bd2.

0

@szweszwe: A jak to się dzieje, że powstaje nowy obiekt bez jawnej deklaracji tego w sposób new BigInteger()?
Możesz powiedziec gdzie dokładnie jest to wyjaśnione w dokumentacji?

2

Tutaj:
add(BigInteger val)
"Returns a BigInteger whose value is (this + val)."
Tutaj masz implementację z OpenJDK: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/math/BigInteger.java#BigInteger.add%28java.math.BigInteger%29

2
rubesom napisał(a):

@szweszwe: A jak to się dzieje, że powstaje nowy obiekt bez jawnej deklaracji tego w sposób new BigInteger()?
Możesz powiedziec gdzie dokładnie jest to wyjaśnione w dokumentacji?

@rubesom: A kto Ci powiedział, że nie ma deklaracji new BigInteger()? Ona jest w metodzie add.

2

Spojrzałem na kod, i niekoniecznie zawsze powstaje nowy obiekt. :) Jeśli któryś jedst zerem, to wynikiem jest ten niezerowy z dwóch. :)

//ciach
        if (val.signum == 0)
            return this;
        if (signum == 0)
            return val;
//ciach

Podobnie dla liczb przeciwnych -- zwracany jest nie nowy, a istniejący obiekt ZERO.

4

Dokumentacja dla BigInteger https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html zaczyna się od słów:

Immutable arbitrary-precision integers.

Niemutowalny obiekt nigdy nie zmienia swojej zawartości. Stąd każda metoda na BigIntegerze prowadząca do BigIntegera o innej zawartości musi zwracać nowy obiekt. Nawet (niefortunnie nazwana) metoda setBit. Czasami metoda może zwrócić stary obiekt, ale tylko wtedy gdy wynik operacji jest równy któremuś z argumentów - np mnożenie przez 1 nie zmienia wartości, podobnie dodawanie 0 albo mnożenie 0 przez cokolwiek.

A jak to się dzieje, że powstaje nowy obiekt bez jawnej deklaracji tego w sposób new BigInteger()?

Jeśli wywołasz metodę, która wywołuje new i zwraca jego wynik to właśnie dostałeś nowy obiekt bez używania samemu słówka new. Czary mary! :)

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