1.- jak wygląda deklaracja tablicy String
String tablica[]={“Jan Kowalski”,”Michał Nowak”,”Marian Iksiński”,”Człowieczek BezNazwiska”};
2.- case... co po kolei się wyświetli (dziedziczenie też)
Switch (wyrażenie) {
Case wartość1: Instrukcje1; Break;
Case wartość2: Instrukcje2; Break;
Case wartość3: Instrukcje3; Break;
Default: Instrukcje4; }
3.- finalize()
Mimo ze Java nie wymaga destruktorów, istnieje możliwość deklaracji specjalnej metody finalize
(zdefiniowanej w klasie java.lang.Object ), która będzie wykonywana przed usunięciem obiektu z
pamięci. Deklaracja takiej metody ma zastosowanie, gdy nasz obiekt np.: ma referencje do
urządzeń wejścia-wyjścia i przed usunięciem obiektu należy je zamknąć.
Usuwanie obiektów - finalizacja
class OtwórzPlik {
FileInputStream m_plik = null;
OtwórzPlik(String nazwaPliku)
{ //Otwarcie pliku
try
{ m_plik = new FileInputStream(nazwaPliku); }
//Obsługa wyjatku
catch (java.io.FileNotFoundException e)
{ System.err.println("Nie moge otworzyc pliku" + nazwaPliku);}
}
protected void finalize () throws Throwable
{
if (m_plik != null)
{
m_plik.close();
m_plik = null;
}
}
}
4.- co to throw (czy jakoś tak)
37. Generacja sytuacji wyjątkowych
Wyrazenie throw przekazuje sterowanie do skojarzonego z nim bloku catch (łap, blok obsługujacy
wystapienie sytuacji wyjatkowej).
Jesli nie ma bloku catch w biezacej metodzie, sterowanie natychmiastowo, bez zwracania wartosci,
przekazywane jest do metody, która wywołała biezaca funkcje. W tej metodzie szukany jest blok
catch.
Jesli blok catch nie zostanie znaleziony, przekazuje sterowanie do metody, która wywołała te
metode. Sterowanie przekazywane jest zatem zgodnie z łancuchem wywołan metod, az do
momentu znalezienia bloku catch odpowiedzialnego za obsługe wyjatku.
Jesli wyjatek nie moze byc przechwycony, nalezy go zabezpieczyc (przy pomocy throws).
public class WywolajWyjatek
{ static public void main(String args[]) throws Exception
{ Liczba liczba = new Liczba();
liczba.dziel(1);
}
}
class Liczba
{ int m_i = 10;
int dziel(float i) throws Exception
{ if (i/2 != 0)
throw new Exception("Liczba nieparzysta!");
if (i == 0)
throw new Exception("Dzielenie przez zero!");
return (int)(m_i/i);
}
}
………..
java.lang.Exception: Liczba nieparzysta!
at Liczba.dziel(Wywolaj`Wyjatek.java:16)
at WywolajWyjatek.main(WywolajWyjatek.java:6)
Exception in thread "main"
38. Słowo kluczowe throws
Jezeli metoda jest zdolna generowac wyjatek którego sama nie przechwytuje, nalezy to zaznaczyc
w tekscie programu, aby metody ja wywołujące mogły sie przed nim zabezpieczyc. Liste
wszystkich wyjatków generowanych przez dana metode tworzy sie za pomoca słowa kluczowego
throws.
Próba skompilowania poprzedniego programu bez uzycia throws zakonczyłaby sie wyswieteleniem
komunikatu:
Unhandled exception type Exception
public class WywolajWyjatek {
static public void main(String args[])
{ Liczba liczba = new Liczba();
try {
liczba.dziel(1);
}
catch(Exception e){System.out.println("wyjatek");}
// wyłapuje wyjatek "wyrzucany" poprzez funkcje dziel
}
} class Liczba {
int m_i = 10;
int dziel(float i) throws Exception
//Exception "załatwia" wszystkie podklasy
{ if (i/2 != 0)
throw new Exception("Liczba nieparzysta!");
if (i == 0)
throw new Exception("Dzielenie przez zero!");
return (int)(m_i/i); }
} ....
wyjatek
5.- czy wartości bolean true i false odpowiadają 1 i 0
NIE, nie konwertują się niejawnie do wartości typu int
6.- czy kod się skompiluje, co się wyświetli
Może tak może nie, kto to wie!
7.- z jakich protokołów korzysta...(coś socket?)
Wtyczki (obiekty klasy java.net.Socket) korzystają z protokołu TCP/IP. W celu nawiązania połączenia z serwerem (za pośrednictwem wtyczki) wystarczy wywołać konstruktor klasy Socket:
new Socket(InetAddress host,int port) lub
new Socket(String host,int port)
Jeśli nie powiedzie się nawiązanie połączenia generowany jest wyjątek.
Datagramy (obiekty klasy java.net.DatagramSocket) korzystają z protokołu UDP. Protokół ten jest szybszy niż TCP/IP.
8. powtórzone
9. Deklaracja kolekcji (wybrać poprawną) (in. „kontener”)
komponenty, które mogą zawierać inne komponenty,
rozkładem komponentów steruje Menedżer Rozkładu,
standardowo dostępnych jest 5 głównych rozkładów: FlowLayout, GridLayout, BorderLayout, CardLayout, GridBagLayout,
rozkłady są podstawowym sposobem rozmieszczania komponentów,
można zrezygnować z menedżera rozkładu na rzecz ręcznego rozmieszczenia i ustawienia wielkości komponentów (rozkład null).
Służą one do przechowania wielu obiektów. Zobaczmy poniższy przykład.
import java.util.*;
public class ListExample {
public static void main(String args[]) {
List list = new ArrayList();
list.add("Bernadine");
list.add("Elizabeth");
list.add("Gene");
list.add("Elizabeth");
list.add("Clara");
System.out.println(list);
System.out.println("2: " + list.get(2));
System.out.println("0: " + list.get(0));
LinkedList queue = new LinkedList();
queue.addFirst("Bernadine");
queue.addFirst("Elizabeth");
queue.addFirst("Gene");
queue.addFirst("Elizabeth");
queue.addFirst("Clara");
System.out.println(queue);
queue.removeLast();
queue.removeLast();
System.out.println(queue);
}
}
Mamy w nim podane przykłady użycia listy i kolejki.
Kolekcje w Java dają programiście pewien standardowy sposób
radzenia sobie z przetwarzaniem grup obiektów. Implementacja
kolekcji w Java składa się z następujących składowych:
- Interfejsów: definiujących abstrakcyjne właściwości i operacje
kolekcji, w oderwaniu od konkretnych implementacji
- Implementacji: klasy będące implementacjami odpowiednich
interfejsów
- Algorytmów: metod pozwalających na efektywne przetwarzanie
kolekcji; np.: wyszukiwanie czy sortowanie. Algorytmy te zwykle są
polimorficzne, tj. są zdefiniowane dla pewnego rodzaju kolekcji a nie
tylko dla wybranej klasy
Podstawowe cechy kolekcji to: wysoka efektywność kodu oraz to, że
kolekcje różnych typów posiadają podobną i prostą obsługę.
Kolekcje implementują także interfejs Iterator, ułatwiający i
standaryzujący dostęp do kolejnych elementów kolekcji.
10.powtórzone
11.Czy możliwe jest utworzenie obiektu interfacu.
Nie?
Interfejs obiektu i jego implementacja W pierwszej kolejności należy utworzyć interfejs zdalnego obiektu. Interfejs jest abstrakcją obiektu dostępną dla klienta. Rzeczywisty obiekt będący realizacją interfejsu znajduje się w serwerze i klient nie ma do niego dostępu. Interfejs zawiera specyfikacje zdalnie dostępnych dla klienta metod. Każda z metod deklarowanych w interfejsie powinna zgłaszać wyjątek typu java.rmi.RemoteException. Aby obiekt mógł być zdalnie dostępny, jego interfejs musi dziedziczyć z interfejsu Remote. Od klasy implementującej interfejs wymaga się zaś, by dziedziczyła z klasy java.rmi.server.UnicastRemoteObject.
http://osilek.mimuw.edu.pl/index.php?title=Sr-05-lab-1.0
12.Klasa ServerSocket na TCP.
- Program serwera wykonywany na konkretnej maszynie ma przypisane do pewnego numeru portu gniazdo (typu ServerSocket), poprzez które "nasłuchuje" za pomocą metody accept klasy ServerSocket ewentualnego żądania nawiązania łączności przez klienta (gniazdo typu Socket). Jest to możliwe, jeśli klient (program klienta) zna adres komputera sieciowego, na którym jest wykonywany serwer oraz numer portu, do którego serwer jest dołączony i utworzy odpowiednie gniazdo typu Socket (związane z numerem portu i adresem serwera), poprzez które może prowadzić komunikację z serwerem. Serwer akceptuje połączenie, a następnie tworzy dla klienta nowe gniazdo (typu Socket) ze zmiennymi wskazującymi na obiekty klas typu InputStream i OutputStream.
- W pakiecie java.net klasy Socket i ServerSocket służą do komunikacji w oparciu o protokół połączeniowy TCP
13.Byte a=2 Byte b=4/a; Print(b) jaki będzie wynik.
8. Rzutowanie typów
• Jeżeli zakres i wartość zmiennej docelowej są na tyle duże, ze można w niej zapisać wartość
źródłowa bez utraty informacji, to kompilator dokonuje automatycznej konwersji typów co nazywa
sie poszerzaniem (np. byte → int).
• W przypadku przeciwnym (zawężania), konieczne jest jawne rzutowanie typu (np. int → byte).
• Gdy jest prawdopodobne ze wynik operacji na danym typie (np. mnożenie liczb typu byte)
przekroczy dopuszczalny zakres typu, kompilator Javy automatycznie przekształca go do typu
wyniku. Typ każdego wyrażenia jest zawsze automatycznie przekształcany do najszerszego
typu występujących w nim zmiennych i literałów.
Przykład:
class Rzutowanie {
public static void main (String args[])
{ byte b=42; 1. f * b → float * byte → float
char c=’a’; 2. i/c → int/char → int
short s=1024; 3. d * s → double * short → double
int i=50000; 4. (1)+(2) → float+int → float
float f=5.67f; 5. (4) − (3) → float − double → double
double d=.1234;
double rezultat=(f*b)+(i/c)-(d*s); } }
Błędy:
byte b=50;
b=b*2;
^ Incompatible type for =.
Explicit cast needed to convert int to byte.
Bład wynika z faktu, ze liczba 2 jest traktowana jako wartosc typu int, w zwiazku z czym
wyrazenie b*2 równiez. Próba przypisania wymaga zatem jawnego operatora konwersji, mimo ze
liczba 100 miesci sie w dziedzinie typu byte.
14.if(new String("ala")==new String("ala") ) czyli if(true)
15.Bolean a; . Jaką wartość przyjmuje domyślnie.
FALSE
16.Jaki ciąg znaków zostanie wywołany. Static, Konstruktor i funkcja.
17.Składnia Foreach dla for(Object o: costam)
Odpowiedzi:
Object o=new Object();
Object o=new String();
np 17... kto to wymyślił ?
tam było coś z collection e = new (jakiś typ kolekcji chyba SortArray)();
i tylko ta jedna była prawidłowa
- w 17 było o tym która deklaracja będzie poprawna dla tamtej pętli foreach ;)
18. BRAK
19.coś o InputStream i OutputStream
Do jakiej klasy strumieni należą. Odpowiedz Strumienie binarne.
Writer i Reader Tekstowe.
20.Czy boolean true i false to to samo co 1 i 0
(odp.NIE)
21. Czy przy zmiennych prymitywnych operujemy na kopiach
(odp.TAK)
22.coś o addWIndowListener
(..)Rejestruje w obiekcie typu Window (na przykład Frame) klasę nasłuchującą, czyli implementującą interfejs WindowListener (ewentualnie dziedziczącą po klasie WindowAdapter).
23. Która własność pola danych daje możliwość modyfikacji przez wątków
(mysle,ze chodzi o volatile, ale nie jestem pewna na 100%)
24.Ile funkcji abstrakcyjnych może mieć klasa abstrakcyjna?
zero lub więcej
25.Czy deklaracja Serializable s = new Serializable (); jest poprawna?
Nie, nie można tworzyć interfejsów w taki sposób. Interfejsy w ogóle nie posiadają konstruktorów, to na dobrą sprawę klasy abstrakcyjne - definiując jakiś własny interfejs nie wolno podać ciał funkcji. Jedynym wyjątkiem od tej zasady jest stworzenie klasy anonimowej - w powyższym przypadku oznacza to dodanie klamry na końcu, Serializable s = new Serializable(){};
26.Mamy kod...
for (Object o : x) {
System.out.println(o.toString());
}
Która z deklaracji obiektu x przed tą pętlą jest poprawna?
a) Object x = new Object();
b) Object x = new String();
c) Collection x = new ArrayList();
d) ArrayList x = new Collection();
Odpowiedź c. Po pierwsze, obiekt x musi implementować interfejs Iterable, żeby konstrukcja for(Typ a : x) miała sens. Interfejs Collection jest rozszerzeniem interfejsu Iterable, więc nam to pasuje. Konstrukcja z d) jest bez sensu, bo kolekcje nie mają konstruktorów - zostaje więc c).
27.
Była klasa jakaś tam, były w niej różne metody (z rożnymi modyfikatorami), metody te miały za zadanie wyświetlić literkę i trzeba było odgadnąć w jakiej kolejności te metody zostaną użyte tzn. w jakiej kolejności wyświetlą sie literki.
ABC, BCA etc etc.
public class hello {
{
System.out.println("Zwykla inicjalizacja");
}
static {
System.out.println("Statyczna inicjalizacja");
}
hello(){
System.out.println("Konstruktor");
}
public static void main(String[] args) {
System.out.println(" -------- ");
hello h = new hello();
}
}
Ten kod, po wykonaniu wyświetla coś takiego:
Kod:
Statyczna inicjalizacja
--------
Zwykła inicjalizacja
Konstruktor
Co to oznacza? To, że kolejność inicjalizatorów jest taka:
1. Najpierw, jak tylko stworzymy klasę (nie trzeba jeszcze tworzyć żadnych obiektów) wykonuje się inicjalizator statyczny - static {}.
2. Potem, dopóki nie stworzymy konkretnego niestatycznego obiektu klasy, nie dzieje się nic.
3. W momencie tworzenia konkretnego obiektu (operatorem new) najpierw wywołuje się inicjalizator zwykły, a dopiero potem...
4. Konstruktor.
28. Co się wypisze na ekranie:
byte a =2;
byte b=a+2;
System.out.println(b);
Warianty:
a) Wypiszę się 2;
b) Wypiszę się 4;
c) Błąd kompilacji;
Odpowiedź to c) ponieważ 2 traktowana jest jako int i dochodzi tu do zwężenia zakresu i trzeba wykonać jawne rzutowanie. Może dać właśnie w drugą stronę na poprawie więc:
byte a =2;
byte b=(byte)(a+2);
System.out.println(b);
Zadziała poprawnie
29. Z jakiego protokołu korzystają klasy Socket i ServerSocket
a) ssl
b) http
c) tcp
d) udp
30. Który zapis jest poprawny
package cos;
Import java.util.*;
public class nazwa {
}
i taka ma być kolejność a inne warianty to była mieszanka tego
1) (poprzedzać ja może tylko komentarz) definicja paczki
2) import
3) dalej co popadnie
Deklaracje klas - modyfikatory właściwości
Abstract –oznacza że nie można tworzyć obiektów danej klasy (jest ona abstrakcyjna)
final oznacza że nie można z niej wyprowadzać podklas
public - oznaczażemożnawykorzystaćklasęwdowolnymmiejscu
(domyślnieklasajestdostępnatylkowewnątrzpakietuwktórym
zostałazdefiniowana)
Modyfikatory właściwości pól danych
static oznacza pole danych klasy, a nie obiektu
final definiuje stałą, którą można przypisać tylko przy inicjalizacji obiektu
transient pola tego typu nie są trwałą częścią obiektu i nie zostają zachowane przy archiwizacji obiektu. Stosowane są do zaznaczania pól niepodlegających szeregowaniu (objectserialization) czyli zapisywaniu i odczytywaniu obiektów bajt po bajcie w komunikacji szeregowej
volatile - oznacza, że pole może być modyfikowane asynchronicznie, przez konkurencyjne wątki w programach wielowątkowych.
Modyfikatory właściwości metod
static oznaczametodęklasy,któramożeoperowaćtylkonazmiennych statycznych
final definiuje metodę, której nie można przedefiniować w podklasie
abstract metoda nie posiadająca implementacji i będąca członkiem klasy abstrakcyjnej,
native oznacza metodę zaimplementowaną w innym języku niż Java i dołączoną za pomocą JavaNativeInterface,
synchronized oznacza metodą będącą sekcją krytyczną (segmentkodu
w programie, w którym następuje dostęp do tej samej danej z różnych wątków