Miesięczne archiwum: Styczeń 2012

Zdaj OCPJP – pytanie 37

Co będzie efektem kompilacji i uruchomienia poniższego kodu?

class Super
{
    public int i = 10;

    public int getValue()
    {
        return i;
    }
}

class Sub extends Super
{
    public int i = 11;

    public int getValue()
    {
        return i;
    }
}

public class Sample
{
    public static void main(String[] args)
    {
        Super obj = new Sub();
        System.out.println(obj.i + " " + obj.getValue());
    }
}

 

  1. Wydrukowane zostanie 10 10.
  2. Wydrukowane zostanie 10 11.
  3. Wydrukowane zostanie 11 11.
  4. Wydrukowane zostanie 11 10.
  5. Kod nie skompiluje się.

 

Pokaż odpowiedź »

Poprawna jest odpowiedź nr 2.

Aby odpowiedzieć poprawnie na to sztandarowe pytanie, należy pamiętać, że tylko odwołania do metod są polimorficzne. Znaczy to tyle, że wybór konkretnej metody do wywołania odbywa się już w trakcie działania, i zależy od rzeczywistego typu obiektu, a nie typu referencji. Dokładnie odwrotnie jest w przypadku dostępu do zmiennej, której wybór opiera się tylko i wyłącznie na typie użytej referencji.

Technologia dla startupu – może Java?

W ubiegłą niedzielę miałem okazję odwiedzić Startup Weekend w Krakowie, na którym drużyny złożone m.in. z programistów, grafików oraz specjalistów od marketingu pracowały pod okiem mentorów nad stworzeniem ciekawych, innowacyjnych projektów, które mogłyby odnieść sukces i wybić się spośród setek aplikacji powstających każdego dnia. Był to ostatni, trzeci dzień imprezy więc miałem możliwość przyjrzenia się projektom w bardziej zaawansowanej fazie.

Mówi się, że podstawą sukcesu jest pomysł. Dodałbym jednak, że każdy pomysł można zabić słabym wykonaniem. Jako osoba techniczna byłem szczególnie zainteresowany wykorzystywanymi technologiami, ich koegzystencją oraz procentowym udziałem Javy i technologii z nią powiązanych w rozwiązaniach wykorzystywanych do budowy startupów webowych. Poniżej znajdują się moje przemyślenia będące wynikiem rozmów z uczestnikami Startup Weekendu oraz obserwacji setek pomysłów zmaterializowanych w postaci aplikacji, które staram się śledzić na bieżąco.

Czytaj dalej

Zdaj OCPJP – pytanie 36

Jaki będzie efekt uruchomienia poniższego fragmentu kodu?

package eu.javablog.goto.next.question;

public class WillItFail {

	public static void main(String[] args) {
		Integer int1 = null;
		int int2 = 1;
		System.out.println(int1 + int2);
	}
}

 

  1. Zostanie wyświetlona cyfra 1
  2. Zostanie wyświetlone ‚null1′
  3. Zostanie rzucony wyjątek w linii 8
  4. Program się nie skompiluje

 

Pokaż odpowiedź »

Poprawna odpowiedź: 4
Uzasadnienie odpowiedzi ma bezpośredni związek z naszym poprzednim pytaniem. Należy pamiętać, że również w nazwach pakietów nie możemy wykorzystywać zarezerwowanych słów kluczowych, takich jak goto czy const. Poniżej znajdują się kolejne przykłady niepoprawnych nazw pakietów:

  • package eu.javablog.const;
  • package eu.javablog.if.next.question;
  • package eu.javablog.class;

Zdaj OCPJP – pytanie 34

Czy poniższy fragment kodu wykona się bezbłędnie, jeżeli Garbage Collector uruchomi się w czasie działania programu?

package eu.javablog.exceptioninfinalize;

public class SimpleClass {
	private String name;
	
	public SimpleClass(String name) {
		this.name = name;
	}
	
	public static void main(String[] args) {
		Runtime runtime = Runtime.getRuntime();
		for(int i = 0; i < 50; i++)
			new SimpleClass("object"+i);

		runtime.gc();
		
		for(int i = 50; i < 100; i++)
			new SimpleClass("object"+i);
		
		runtime.gc();
	}

	@Override
	protected void finalize() throws Throwable {
		super.finalize();
		System.out.println("Name: "  + this.name);
		throw new RuntimeException("Exception from finalize!");
	}
}

 

  1. Tak
  2. Nie

 

Pokaż odpowiedź »

Program wykona się poprawnie.

Należy pamiętać, że metoda finalize, zdefiniowana bazowo w klasie Object, wykona się zawsze przed usunięciem obiektu przez Garbage Collector, ale nie więcej niż raz dla pojedynczej instancji. Wszystkie wyjątki rzucone z metody finalize przerywają jej działanie, ale są ignorowane i nie są propagowane dalej.

Zdaj OCPJP – pytanie 33

Czy poniższy fragment kodu skompiluje się i uruchomi bez żadnych błędów?

public class Sample
{
    public static void main(String[] args)
    {
        String[] array = {"a", "b", "c"};
        for(final String element : array)
        {
            System.out.println(element);
        }
    }
}

 

Pokaż odpowiedź »

Tak!

Pomimo tego, że zmienna element w wyrażeniu for oznaczona jest jako final, iterowanie za jej pomocą jest nadal możliwe. Jedynym ograniczeniem wynikającym z tego faktu jest brak możliwości przypisania do referencji element innego obiektu w ciele pętli.

Zdaj OCPJP – pytanie 32

Które z poniższych konstrukcji switch spowodują błąd kompilacji?

public class Sample
{
    public static void main(String[] args)
    {
        // 1
        switch(0)
        {
            case 1:
            default:
        }

        // 2
        switch(0)
        {
            case 1:
                break;
        }

        // 3
        switch(0);

        //4
        switch(0)
        {

        }
    }
}

 

  1. Wszystkie (1, 2, 3 i 4).
  2. 1, 3 i 4.
  3. 3 i 4.
  4. Tylko 3.
  5. 1 i 3.

 

Pokaż odpowiedź »

Poprawna jest odpowiedź nr 4.

Błąd kompilacji spowoduje tylko trzecia konstrukcja z powyższego przykładu. Pozostałe, mimo że w niektórych przypadkach mogłoby się wydawać inaczej, są poprawne. Switch dopuszcza puste bloki case i default, a nawet ich całkowity brak.

Spotkanie OWASP – bezpieczeństwo J2EE

Jeżeli jesteście zainteresowani tematyką bezpieczeństwa aplikacji pisanych w Javie to koniecznie powinniście zarezerwować swój czas 18 stycznia i przybyć na spotkanie krakowskiej grupy OWASP, na którym Sławomir Jasek z firmy SecuRing opowie o słabościach w popularnych frameworkach i bibliotekach.

Java uważana jest za niezwykle bezpieczne środowisko a biznesowy target większości aplikacji potęguje to wrażenie. Wystarczy jednak prześledzić raporty publikowane przez autorów konkretnych frameworków oraz niezależnych badaczy aby szybko zweryfikować pierwsze, mylne wrażenie i stać się bardziej podejrzliwym. Dobrymi przykładami są krytyczne błędy znalezione w Spring Framework oraz Struts2:

Jestem ciekaw o jakich błędach usłyszymy (może jakiś 0-day? :) ) na spotkaniu.

Czas i miejsce: 18 stycznia 2012, godz. 18.00. Krakowski Park Technologiczny (Al. Jana Pawła II 41 L).

Do zobaczenia!

Nowa twarz TechCampu – zapowiedź spotkania

Już 19 stycznia w Krakowie odbędzie się drugie TechCampowe spotkanie. Tym razem poruszona zostanie tematyka użyteczności oraz interfejsów graficznych. Aby zarejestrować się na TechCamp należy odwiedzić stronę www.techcamp2.evenea.pl.

Poniżej zamieszczamy agendę spotkania:


AGENDA TECHCAMP #2: INTERFEJSY GRAFICZNE I UŻYTECZNOŚĆ

1. Prezentacje (od godz. 18:30)

  • 18:30 – 19:15 EDISONDA – Maciej Płonka

    „Goodbye Start Menu” – o (de-)ewolucji taskbarów, paneli i docków

  • 19:15 – 19:35 – Daniel Biesiada (Microsoft)

    Metro Design Language – nowy styl projektowania aplikacji Windows

  • 19:35 – 19:55 – Andrzej Piotrowski (CFP)

    Dotyk w czasach NUI (Natural User Interface)

  • 19:55 – 20:15 – Gabriel Habryn (Empathy Internet Software House)

    Interfejs konwersacyjny, czyli sposób komunikacji człowieka z technologią

2. Panel dyskusyjny – 20:15 – 20:45

  • Tradycyjne interfejsy użytkownika a interfejsy NUI (dotykowe, kinect’owe, etc.)

Zdaj OCPJP – pytanie 31

Co zostanie wyświetlone na ekranie po uruchomieniu poniższego fragmentu kodu?

public class Singleton {
	private Singleton() {
		System.out.print("Singleton ");
	}
	
	private static class InnerClass {
		static {
			System.out.print("Inner ");
		}
		public static final Singleton INSTANCE = new Singleton();
	}
	
	public static Singleton getInstance() {
		return InnerClass.INSTANCE;
	}
	
	public static String getInfo() {
		return "Info ";
	}
	
	public static void main(String[] args) {
		System.out.println(Singleton.getInfo());
	}
}

 

  1. Inner Info
  2. Inner Singleton Info
  3. Singleton Inner Info
  4. Info

 

Pokaż odpowiedź »

Poprawna jest odpowiedź nr 4.

Java korzysta z tzw. leniwego ładowania klas (lazy loading). Klasy ładowane są przez Classloadery na żądanie, w momencie bezpośredniego odwołania. W przypadku naszego testowego kodu jedynie klasa Singleton zostanie załadowana. Z uwagi na brak odwołań w wykonywanym fragmencie kodu do klasy InnerClass, zostanie ona pominięta, nie zostanie wykonana jej inicjalizacja a statyczny obiekt typu Singleton nie zostanie stworzony.
 
Gdybyśmy zmienili kod metody main na:

public static void main(String[] args) {
		System.out.println(Singleton.getInfo());
                Singleton.getInstance();
}

to na ekranie wyświetlone zostałyby wartości: Info Inner Singleton
 
Ponadto, powyższy kawałek kodu wykorzystywany jest także we wzorcu „Lazy-loaded singleton„. Technika ta nasi nazwę „Initialization-on-demand holder” i czerpie korzyści ze specyficznych właściwości maszyny wirtualnej – leniwego ładowania klas oraz gwarancji, że proces inicjalizacji klasy (w tym przypadku jest to tworzenie jedynej instancji klasy Singleton) jest bezpieczny w środowisku wielowątkowym (thread-safe).