1. Klausur 7. Info, 7. Semester: 1. Programmieraufgabe s. Aufgabenblatt 2. Nennen Sie 2 Sprachkonstrukte von C++, die in Java nicht realisiert sind. Geben Sie eine Begründung für diese Entscheidung an. 1. Zeiger, wegen Speicherschutz 2. Destruktoren, da die Delokierung von Speicher der Garbagecollector übernimmt. 3. Wieviel Speicherplatz belegt in Java eine Variable vom Datentyp char? 2 Byte, da Unicodezeichensatz 4. Welches Schlüsselwort bezeichnet in Java eine Konstante? static final 5. Erzeigen Sie mit jeweils einer Anweisung: a) Ein eindimensionales Feld vom Typ double mit 22 Elementen b) Ein zweidimensionales Feld vom Typ long mit 8 Zeilen und 3 Spalten. a) double[] feld1D = new double [10]; b) long [][] feld2D = new long [4][10]; 6. Erzeugen die ein nichtrechteckiges zweidimensionales Feld vom Typ float, in dem eine obere Dreiecksmatrix der Dimension 3 (d.h. 1. Zeile: Drei Element; 3. Zeile: ein Elemente) abgespeichert werden kann. float n = 3; float [][] dreieck = new float [n][]; for (int i = 0; i < n; i--) { dreieck[i] = new int[n-i]; } Zusammenfassung der Schenk Java Klausuren (8./9. Info Klausur 1+2, WS 2001/2002) vk -4. Welchen primitiven Datentyp kann man auch nicht mit dem cast-Operator in andere primitive Datentypen umwandlen? boolean -3. Erzeigen Sie mit jeweils einer Anweisung: c) Ein eindimensionales Feld vom Typ int mit 10 Elementen d) Ein zweidimensionales Feld vom Typ double mit 4 Zeilen und 10 Spalten. c) int[] feld1D = new int[10]; d) double[][] feld2D = new double[4][10]; -2. Erzeugen die ein nichtrechteckiges zweidimensionales Feld vom Typ int, indem eine untere Dreiecksmatrix der Dimension 3 (d.h. 1. Zeile: Ein Element; 3. Zeile: 3 Elemente) abgespeichert werden kann. int n = 3; int[][] dreieck = new int[n][]; for (int i = 0; i < n; i++) { dreieck[i] = new int[i+1]; } -1. Nennen Sie den wesentlichen Unterschied zwischen den Klassen String und StringBuffer String hat eine feste Größe. Wird einem String ein Zeichen hinzugefügt, muß erst ein neuer, größerer String erzeugt und Speicher allokiert werden. Das kostet Zeit. StringBuffer sind in der Länge Variable. Deswegen verwendet man z.B. für das einlesen eines Strings die Klasse StringBuffer. JavaDoc: A StringBuffer implements a mutable sequence of characters. A string buffer is like a String, but can be modified. At any point in time it contains some particular sequence of characters, but the length and content of the sequence can be changed through certain method calls Ab hier war es für die Klausur (23.04.) interessant: 1. Welche Methode wird durch den Aufruf this(a,b); in einem Konstruktor der Klasse Punkt aufgerufen, wenn a und b vom Typ int sind? (Methodenkopf angeben!) Public Punkt(int a, int b) Ein anderer Konstruktor der Klasse Punkt 2. Erläutern sie die Zugriffsart protected! Auf protected deklarierte Methoden und Membervariablen kann nicht aus anderen Klassen direkt zugegriffen werden (wie private). Im Gegensatz zu private ist eine proteced Mehtode oder Variable der Mutterklasse auch in einer abgeleiteten Klasse zugreifbar. 3. Von welcher Klasse sind in Java alle Objekte implizit abgeleited? Object 4. Was bewirkt der Modifizierer final für eine Methode? Der final Modifizierer gibt an, dass eine Methode in dieser Klasse endgültig implementiert ist. Ein Überschreiben in einer abgeleiteten Klasse ist nicht mehr möglich. 5. Eine Methode der Klasse Punkt wird in der main-Methode einer Klasse PunktTest wie folgt aufgerufen: double ld = Punkt.laenge(); Geben Sie den Methodenkopf für die Methode laenge an! public static double lange() Die Methode muß public und static sein, da aus einer anderen Klasse darauf zugegriffen wird, ohne dass eine Instanz der Klasse Punkt erzeigt wird. 6. a) Wie kann der Standardkonstruktor der Basisklasse in einem Konstruktor einer abgeleiteten Klasse aufgerufen werden? b) Was ist für diese Anweisung zusätzlich zu beachten? c) Was Passiert, wenn die Basisklasse keine Konstruktoren besitzt? a) super(); b) Der Aufruf muß als erste Anweisung im Konstruktor der abgeleiteten Klasse stehen, da sonst beim compilieren ein Fehler kommt: call to super must be first statement in constructor c) In diesem Fall passiert gar nichts. Falls in einer Klasse keine Konstruktoren deklariert sind, existiert implizit der Standardkonstruktor. Wird der Konstruktor überladen (mit anderen Parametern deklariert) geht jedoch der Standardkonstruktor verloren. In diesem Fall wird beim Aufruf des Satndardkonstruktors im Konstruktor einer abgeleiteten Klasse eine CompilerFehlermeldung ausgegeben: cannot resolve symbol Deshalb ist es ratsam, immer einen eigenen Standardkonstruktor zu deklarieren, auch wenn dieser keine Aufgabe hat. Beispiel: class Basis { public Basis () { System.out.println("Ich bin Basis"); } } public class Child extends Supertest{ public Child () { super(); System.out.println("Ich bin Child"); } public static void main(String[] args) { Child instanz = new Child(); } } (Klausur 2) 7. Welche Funktion besitzt der finally-Block einer try-catch-Anweisung? Die Anweisungen im finally-Block werden in jedem Fall ausgeführt, egal ob eine Ausnahme aufgetreten ist oder nicht. Das ist in Fällen nützlich, in denen eine Aufgabe erledigt werden muß egal ob die vorhergehende Aufgabe erfolgreich war oder nicht, z.B. Schließen eine Datenbanksitzung egal ob vorhergehende Transaktion erfolgreich war oder auch nicht. 8. Geben Sie eine zweite Möglichkeit der Behandlung einer geprüften Ausnahme neben der try-catch-Anweisung an und erläutern Sie das Prinzip kurz! Die zweite Methode eine Ausnahme zu Behandeln ist es, die Ausnahme nicht zu behandeln, sondern den „Schwarzen Petern“ an die aufrufende Methode weiter zu geben. In diesem Fall muß in der Methodendeklaration unbedingt die throws-Klausel angeführt werden, um dem Kompiler mitzuteilen, dass die Methode Ausnahmen „wirft“. Bsp: public void aufrufer() { try { ausnahmeWerfer(); } catch (NumberFormatException nfe) { System.err.println(nfe); } } public int ausnahmeWerfer() throws NumberFormatException { // parseInt wirft NumberFormatExeption, // falls der String keine Zahl ist return Integer.parseInt("Bullshit"); } 9. Geben Sie nur das folgende Programmstück an: Falls die Variable x negativ ist, wird mit dem Text: „x darf nicht negativ sein!“ ausgeworfen. int x = -1; try { Exception e = new Exception("x darf nicht negativ sein!"); if (x < 0) { throw e; } } catch (Exception e) { System.err.println(e); } 10.Nennen Sie die beiden Zentralen Pakete für die Grafik- und GUIProgrammierung in Java java.awt.* javax.swing.* 11.Geben Sie das folgende Programm Stück an: Erzeugen Sie ein Swing-Frame mit dem Titel Klausurfenster, einer Größe von 400 x 300 und setzen sie es auf sichtbar! JFrame klausurfenster = new JFrame(); klausurfenster.setTitle("Klausurfenster"); klausurfenster.setSize(400,300); klausurfenster.setVisible(true); 12.Geben Sie die vollständige paintComponent-Methode an, um in ein blaues Rechteck mit der linken oberen Ecke bei (10; 10) und den Seitenlängen von jeweils 100 zum einem zwei rote Linien zu Zeichnen, die sich im Zentrum des Rechtecks treffen. Zum anderen soll ein gefüllter grüner Kreis mit dem Mittelpunkt in diesem Zentrum und einem Durchmesser von 60 gezeichnet werden. import java.awt.*; import java.awt.event.*; import javax.swing.*; class PaintPanel extends JPanel { // nur diese Funktion ist gefragt! public void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.blue); g.drawRect(10, 10, 100, 100); g.setColor(Color.red); g.drawLine(11, 60, 109, 60); g.drawLine(60, 11, 60, 109); g.setColor(Color.green); g.fillOval(30, 30, 60, 60); } } class PaintFrame extends JFrame { public PaintFrame() { setTitle("Paint"); setSize(300, 200); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); Container contentPane = getContentPane(); PaintPanel myPanel = new PaintPanel(); myPanel.setBackground(Color.white); contentPane.add(myPanel); } } public class Paint { public static void main(String[] args) { JFrame frame = new PaintFrame(); frame.show(); } } 13.Erläutern Sie den Begriff schwergewichtige (heavy-weighted) SwingKomponente. Nennen sie ein Bespiel. Im AWT 1.0 gab es nur Komponenten die die Bedienelemente des benutzten Fenstersystems verwendeten (Windows, Motif, ...). Damit war aber keine Plattformunabhängigkeit zu erreichen, da sich die Elemente der verschiedenen Systeme unterschiedlich verhielten. In der AWT 1.1 wurden dann sogenannte „lightweight components“ eingeführt. Das waren eigentlich nur Komponenten oder Container, die einen transparenten Hintergrund hatten. Jedoch waren diese Komponenten direkt von den Klassen Component bzw. Container abgeleitet und nicht von java.awt.window. Dadurch wurde die Erstellung von pure java Bedienelementen möglich, die sich in jeder Umgebung gleich verhalten. Im Jdk 1.2 sind mit den Swing-Klassen eine ganze Anzahl von Komponenten enthalten die unabhängig von den Bedienelementen des Fenstersystems sind und auf dem Prinzip der lightweight Komponenten der AWT beruhen. Es lässt sich beispielsweise bei einer Swing-Anwendung auch bestimmen, ob es im Motif- oder Windowslook ausgeführt werden soll. Heavy-Weighted Komponenten der Swing-Klassen sind Komponten, die direkt aus den AWT-Klassen abgeleitet sind. Dies sind grundlegende Komponenten wie JFrame. 14.Skizzieren Sie die Fensteraufteilung eines BorderLayouts, sowie die eines GridLayouts mit 3 x 4 Rasterzellen. BorderLayout: GridLayout 3 x 4 GridLayout Frame 15.Skizzieren Sie die endgültige Fensteraufteilung eines als 4 x 5 – Gitter erzeugten GridLayouts, in das nur 8 Komponenten „gezeichnet“ wurden. 16. Nennen Sie den wesentlichen inhaltlichen Unterschied zwischen einer JCheckBox und einer JRadioButton – Komponente. JRadioButton-Komponenten, innerhalb einer JRadioGroup, können nicht gleichzeitig aktiviert sein! Innerhalb einer JRadioGroup kann immer nur ein JRadioButton aktiv sein. Bei JCheckBox-Komponenten können mehrere gleichzeitig aktiviert sein. In einer Checkboxgruppe ist die Auswahl beliebig. ( by Franz R.) 17.Wozu dient die Klasse (Komponente) JFileChooser? 18.Nennen und erläutern Sie kurz die drei Klassen (Komponenten) über die in Swing Menüs realisiert werden. JMenuBar stellt Methoden zum Zugriff auf die Menüs und Komponenten bereit, die in einer “ Menüleiste “ enthalten sind. JMenu bietet eine Reihe von Möglichkeiten, um Einträge in Menüs aufzunehmen bzw. sie aus Menüs zu entfernen. JMenuItem erweitert die Klasse AbstractButton. Menüeinträge sind Schaltflächen, die Text und Symbole anzeigen können. Menüeinträge können bei Aktivierung “ Aktionsereignisse “ auslösen. ( by Franz R.) 19.Geben Sie das Programmstück an, um aus einer ASCII-Datei die ersten 128 Zeichen zu lesen und in ein char-Feld zfeld mit der Länge 150 abzuspeichern. Das der Datei zugeordnete File-Objekt datei existiert schon. Geben Sie die Vereinbarung des Feldes, sowie das vollständige Lesen aus der Datei einschließlich Ausnahmebehandlung an. Zum Lesen kann die Methode add mit der Prinzipsyntax add(puffer, anfangsposition, anzahl) verwendet werden. import java.io.*; public class Lies128 { File file = new File("buffer.txt"); FileReader f; public Lies128() { char[] zfeld = new char[150]; try { f = new FileReader(file); add(zfeld, 0, 128); System.out.println(zfeld); f.close(); } catch (IOException e) { System.out.println("Fehler beim Lesen der Datei"); } } // eigentlich blöd, eine Methode "add" zu nennen, // wenn eine Datei gelesen werden soll public int add(char[] cbuf, int offset, int length) throws IOException { return f.read(cbuf, offset, length); } public static void main(String[] args) { new Lies128(); } }