Trapsy - rlip/java GitHub Wiki
- Porównywanie stringów
- Przekazywanie obiektów
- Kopiowanie obiektów
- Wyrażenia warunkowe
- Zagadka operatora private
- double
- URL -> URI
Porównywanie stringów
public static void main(String args[]){
String s1 = "Ala";
String s2 = "Ala";
System.out.println(s1==s2); //wirtualna M.J. alokuje te same testy w tym samym miejscu pamięci, więc true
System.out.println(s1.equals(s2)); //zwykłe porównanie wartości
String s3 = s1;
String s4 = new String("Ala");
System.out.println(s3==s4); // false, bo new wymusza nowy obiekt, w innym miejscu pamięci
System.out.println(s3.equals(s4)); //zwykłe porównanie wartości
}
Przekazywanie obiektów
Pomimo tego że final, to coś w środku można zmienić! (-1 -1 -2 -2)
class Zmienna {
Zmienna(int x) {
this.x = x;
}
public int x;
}
public class Traps5 {
static void metoda1(Zmienna z) {
z.x = -1; // z wskazuje na ten sam obiekt co ten wywołany więc może mu to zmienić
z = null; // to nie zmieni obiektu a czy b, parametry są przekazywane przez wartość więc z to co innego
}
static void metoda2(final Zmienna z) {
z.x = -2;
}
public static void main(String[] args) {
Zmienna a = new Zmienna(1);
final Zmienna b = new Zmienna(2);
//instrukcja 1
metoda1(a);
System.out.print(a.x + " ");
//instrukcja 2
metoda1(b);
System.out.print(b.x + " ");
Zmienna c = new Zmienna(1);
final Zmienna d = new Zmienna(2);
//instrukcja 3
metoda2(c);
System.out.print(c.x + " ");
//instrukcja 4
metoda2(d);
System.out.print(d.x + " ");
}
}
Kopiowanie obiektów
Punkt punkt1 = new Punkt(10, 10);
Punkt punkt2 = punkt1;
Punkt punkt3 = new Punkt(10, 10);
boolean porownanie1 = punkt1==punkt2;
boolean porownanie2 = punkt1==punkt3;
System.out.println("Porownanie1: "+porownanie1); //true
System.out.println("Porownanie2: "+porownanie2); //false
Można używać funkcji clone, ale tu trzeba uważać, że standardowo kopiuje ona tylko typy proste, a do pozostałych przepisuje referencje. Żeby wszystko skopiować trzeba w każdej klacie zawierającej jakieś obiekty nie proste nadpisać clonable i w niej skopiować te obiekty. Ale najlepiej nie używać clonable, tylko konstruktorów kopiących czy bardziej zaawansowanych klas.
Wyrażenia warunkowe
Wynikiem będzie 1.0 bo używając znaku zapytania jako porównania kompilator zmienia najpierw te liczby na typy proste, a potem zmienia na najogólniejszy dla obu czyli int na double
public static void main(String args[]) {
Random rand = new Random();
boolean check = rand.nextBoolean();
Number number = (check || !check)?
new Integer(1) : new Double(2.0);
System.out.println("Wynik: "+number);
}
Zagadka operatora private
Wyświetli 2 razy true, bo w obrębie klasy możesz się odwoływać do pól prywatnych innej instancji tej samej klasy
public class Prywatka {
private int x = 0;
public Prywatka(int x) {
this.x = x;
}
public boolean equal(Prywatka p) {
return this.x == p.x;
}
public static void main(String[] args) {
Prywatka a = new Prywatka(1);
Prywatka b = new Prywatka(1);
System.out.print(a.equal(b)+" ");
System.out.print(a.x == b.x);
}
}
double
Wynik to 0.8999999999999999, można zrobić System.out.printf("%.2f%n", x - y); lub użyć BigDecimal
public class JavaTraps004 {
public static void main(String args[]) {
double x = 2.0;
double y = 1.1;
System.out.println(x-y);
}
}
URL -> URI
Tu wynik może być różny bo metoda URL.equals porównuje idiki, lepiej używać klasy URI
public static void main(String args[]) throws MalformedURLException {
Set set = new HashSet();
set.add(new URL("http://wolnifarmerzy.com.pl"));
set.add(new URL("http://zagubionawyspa.com.pl"));
set.add(new URL("http://editor.javastart.pl"));
set.add(new URL("http://google.pl"));
System.out.println("Size: "+set.size());
}