JAVA - Code Konvention

Werbung
Übungen Informatik I
JAVA
- Code Konvention
- Grundtypen
http://www.fbi-lkt.fh-karlsruhe.de/lab/info01/Tutorial
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 1
JAVA
Code-Konvention
Motivation
Code-Konventionen sind wichtig für Entwickler:
80% der Kosten einer Software entstehen durch Pflege.
Kaum ein Stück Software wird von einem Entwickler
während der gesamten Lebensdauer gepflegt.
Konventionen erhöhen die Lesbarkeit und erleichtern es
damit den Entwicklern, neuen Code zu verstehen.
Code-Konventionen sind Richtlinien, nach denen man Code
schreiben kann (nicht muss).
Es gibt gute Sourcecode-Formatierer als Freeware.
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 2
JAVA
Code-Konvention
Motivation
Vorher:
// Quick and dirty...
public void run(int[] a){int hold;for(int pass=1;pass<a.length; pass++)for(int
i=0;i<a.length-1;i++)if(a[i]>a[i+1]){hold=a[i]; a[i]=a[i+1];a[i+1]=hold;}}
Nachher:
/**
* Sorts an integer array.
* Algorithm used: Bubble-Sort.
* Recommended for next version: quick sort
*
* @param values An unsorted array
*
The sorted values are stored in the same array.
*/
public void run (int[] values) {
int hold;
for( int pass = 1; pass < values.length; pass++ ) {
for( int i = 0 ; i < values.length - 1; i++ ) {
if( values[ i ] > values[ i + 1 ] ) {
hold
= values[ i ];
values[ i ]
= values[ i + 1 ];
values[ i + 1 ] = hold;
}
}
}
}
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 3
JAVA
Code-Konvention
Source-Dateien
Datei-Endungen
Datei-Typ
Endung
Java-Quelltext
.java
Java-Bytecode
.class
Java-Archiv
.jar oder .zip
Datei-Namen
Der Dateiname für Quelltextdateien entspricht dem
Namen der öffentlichen Klasse, welche in der Datei
enthalten ist.
Pro Datei ist nur eine öffentliche Klasse erlaubt.
Datei-Größe
Quelltextdateien sollten nicht länger als 2000 Zeilen und
nicht breiter als 80 Spalten sein.
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 4
JAVA
Code-Konvention
Sortierung innerhalb der Quelltextdatei:
Kommentar (Klassenname, Version, Copyright)
Package-Name (optional)
Pakete kommen noch!
Import-Anweisungen (weniger ist mehr!)
kommt
noch!
Deklaration der Klassen (und Schnittstellen)
Dokumentationskommentar
class-Anweisung
statische Attribute der Klasse (public, protected,
private)
Attribute (public, protected, private)
Konstruktoren
Methoden, gruppiert nach Funktionalität und nicht
nach Gültigkeitsbereichen (public, protected, private)
Jeder öffentlichen Klasse oder Methode sollte ein
Dokumentationskommentar vorangestellt sein.
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 5
JAVA
Code-Konvention
Einrückungen
Eine Einrückungsstufe: 2 oder 4 Leerzeichen
Tabulator: eine Einrückungsstufe
Tipp: Im Editor einstellen, dass Tabulatoren in Leerzeichen
umgewandelt werden.
Zeilenumbruch
Umbruch sollte erfolgen:
nach einem Komma
vor einem Operator
Beispiel:
method (long longExpression1, long longExpression2,
long longExpression3);
longName1 = longName2 + longName3 + longName4
+ longName5;
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 6
JAVA
Code-Konvention
Dokumentationskommentare
Für Klassen, Interfaces, Methoden und deren Parameter.
Die Dokumentationskommentare werden durch /** eingeleitet:
/**
* The example class provides...
*/
public class Example {
/**
* comment
*/
public void test (int times) {
}
}
Die Kommentare sollten zusätzliche Tags erhalten, die durch das
Programm javadoc ausgewertet werden können.
Damit kann beispielsweise eine komplette HTML-Dokumentation
aller öffentlichen Methoden generiert werden.
Die Java-API-Dokumentation wird so erstellt.
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 7
JAVA
Code-Konvention
Dokumentationstags:
Klassen und Interfaces
Konstruktoren und Methoden
@author
Name
@param
Name description
@version
1.0, 20 Sep. 2001
@return
description
@since
JDK 1.0
@exception
classname descr.
@see
classname
@see
classname
@deprecated
@deprecated
Beispiel:
/**
* Sorts an array of integer values.
* @param values Unsorted array of values.
* @return Sorted array of values.
* @exception NullPointerException Thrown, if values is null.
* @see
java.util.Arrays.sort (int[] a)
*/
int[] sort (int[] values) throws NullPointerException
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 8
JAVA
Aufbau des Quelltextes
•
„Java Bezeichner“
Bezeichner
Ein Bezeichner ist eine Sequenz von Zeichen, die dazu dient, die
Namen von Variablen, Klassen oder Methoden zu spezifizieren.
-
Ein Bezeichner muss immer mit einem Unicode-Buchstaben (Das
sind die Zeichen 'a'-'z', 'A'-'Z', '_', '0'-'9' und '$') beginnen und
darf dann weitere Buchstaben oder Ziffern enthalten.
('_' und '$' sollen nur aus historischen Gründen, bzw. bei
maschinell generiertem Java-Code verwendet werden)
-
Ein Bezeichner darf weder ein Schlüsselwort, ein Boole'sches
Literal noch ein null-Literal sein.
-
Alle Stellen des Bezeichners sind signifikant.
-
Groß- und Kleinschreibung werden unterschieden.
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 9
JAVA
Aufbau des Quelltextes
„Java Literale“
Literale sind Werte eines primitiven Datentyps, eines Strings oder null.
Literale dienen dazu, in einem Javaprogramm Konstanten aufzuschreiben. (Sie sind nicht
zu verwechseln mit den Konstantendeklarationen).
Java kennt folgende Typen von Literalen:
Ganze Zahlen:
Float-Zahlen:
Double-Zahlen:
Logische Literale:
Referenz-Literale:
Character-Literale:
0;
123;
0xDadaCafe
3.2f;
-3e-22f
3.2;
-3e-22
true;
false
null; this; super
'A'‚
Zeichenketten-Literale:
""; "\""; "Hello World"
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 10
JAVA
Java-Literale
„Integer-Literal“
Integer-Literal: ganzzahliger Integerwert
Ganze Zahlen:
0; 123; 0xDadaCafe
Konstanter ganzzahliger Wert, der dezimal, hexadezimal (sedezimal) oder
oktal angegeben werden kann.
Automatische Typvergabe
int, long usw.
Manuelle Typvergabe: Endung L oder l für long, Beispiel: 42l
Standardtyp ist int
Kann in folgender Form geschrieben werden:
dezimal:
keine besondere Angabe, erlaubt sind die Ziffern 0-9
und ein Vorzeichen, Beispiel: -1234
hexadezimal:
vorangestelltes 0x (Ziffer 0), erlaubt sind die Ziffern
0-9 sowie die Buchstaben A-F, Beispiel: 0x1C2A
Oktal:
vorangestellte 0 (Ziffer 0), erlaubt sind die Ziffern
0-7, Beispiel: 01234
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 11
JAVA
Java-Literale
„Fließkomma-Literal“
Fließkomma-Literal: Gleitkommawert
Float-Zahlen:
3.2f; -3e-22f
Double-Zahlen:
3.2; -3e-22
Konstanter Fließkomma-Wert, der nach der IEEE-Norm 754 abgelegt wird.
Es werden einfache Genauigkeit mit 32 Bit (float) und doppelte
Genauigkeit mit 64 Bit (double) unterstützt.
Verschiedene Zahlenformate sind erlaubt, Beispiele:
0.31415:
3e-2:
-3e2:
entspricht der Zahl
0,31415
entspricht der Zahl 3*10-2 = 0,03
entspricht der Zahl -3 * 102 = -300
Standardtyp ist double => Ohne extra Suffix handelt es sich immer
um doppelte Genauigkeit. Um die Genauigkeit zu steuern, kann ein
sog. Suffix angehängt werden:
·f,F: Einfache Genauigkeit (float), Beispiel: 3e2f
·d,D: Doppelte Genauigkeit (double, redundante Angabe),
Beispiel:
3e2d
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 12
JAVA
Java-Literale
„Boole‘sches-Literal“
Boole'sches-Literal logischer Datentyp
Logische Literale:
“boolean“:
true; false
Konstanter Wahrheitswert (wahr oder falsch).
Nur zwei Werte sind möglich:
true: wahr.
false: falsch.
Hinweis: Eine Umwandlung in Integer-Literale wie in C++ ist nicht
möglich.
null-Literal: Konstanter Wert, der anzeigt, dass eine Objektreferenz auf
kein Objekt zeigt
kommt später.
Zeichen-Literal (“char“): Konstanter Zeichenwert für ein einzelnes
Zeichen des Typs char.
Ein Zeichen-Literal ist ein 16 Bit Wert, dargestellt durch UnicodeZeichen.
Schreibweise: in einfachen Anführungszeichen.
Beispiel: 'A‘ oder ‘\u0041‘
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 13
JAVA
Java-Literale
„Referenz-Literale“
null;
Referenz-Literale:
this; super
null:
Konstanter Wert, der anzeigt, dass eine Objektreferenz auf kein
Objekt zeigt
kommt später
this:
Die symbolische Referenz this ist eine Referenz auf das eigene
Objekt
super:
kommt später
Mit der Referenz
super kann auf Methoden und Attribute von
übergeordneten Basisklassen zugegriffen werden.
kommt später
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 14
JAVA
Java-Literale
Referenztypen
public class AsterixUndRoemer {
public static void main ( String [] args ) {
// Zwei Variablen vom Typ der Klasse String
String ga, ro;
// werden deklariert
int r;
ga = "Asterix";
// Variable r vom Typ int wird deklariert
// der Variablen ga wird eine Referenz auf
// String “Asterix“ zugewiesen
ro = "Roemer";
// der Variablen ro wird eine Referenz auf
// String “Roemer“ zugewiesen
r = 1+1;
System.out.println (ga + " sieht " + r + " "+ro);
}
}
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 15
JAVA
Java-Literale
„Character, Zeichenketten-Literale“
Character- und Zeichenketten-Literale werden intern in Unicode kodiert. :
Character-Literal („char“):
'A'‚
Konstanter Zeichenwert für ein einzelnes Zeichen des Typs char.
Ein Zeichen-Literal ist ein 16 Bit Wert, dargestellt durch Unicode-Zeichen.
Schreibweise: in einfachen Anführungszeichen.
Beispiel: 'A‘ oder ‘\u0041‘
Zeichenketten-Literal:
""; "\"";
Konstanter Wert für eine Folge von Zeichen.
"Hello World“
String-Literale werden durch einzelne Unicode-Zeichen repräsentiert.
Schreibweise: in doppelten Anführungszeichen. Beispiel: "Hallo"
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 16
JAVA
Java-Literale
„Escape-Sequenzen“
Um Zeichen darstellen zu können, deren Eingabe mit einfachen Editoren nicht möglich ist
oder sie sonst syntaktisch nicht möglich wären, verwendet man sogenannte EscapeSequenzen:
Escape-Sequenzen:
Unicode
\b
\t
backspace
tab
\n
\f
\r
\“
\‘
\\
\uabcd
linefeed
\u000a
formfeed
\u000c
carriage return
\u000d
Anführungszeichen \u0022
Apostroph
\u0027
Backslash
\u005c
hexadezimaler Unicode abcd
Helga Gabler, Holger Vogelsang, Christian Pape
\u0008
\u0009
Übungen Informatik 1
Wirkung
Rückschritt
horizontaler Tabulator
neue Zeile
Seitenumbruch
Wagenrücklauf
Darstellung von “
Darstellung von ‘
Darstellung von \
Folie 17
JAVA
Java-Literale
„Character- und Zeichenketten-Literale“
public class HalloJava {
public static void main ( String [] args ) {
System.out.println ();
System.out.println ("Hallo Java");
System.out.println ("Er sagt: \"Hallo\nJava\" ");
System.out.println ();
}
}
Zeichenketten-Literale können sich nicht über mehrere Quelltextzeilen erstrecken, sie
müssen stets vor Zeilenenden enden. Benötigt man längere Zeichenketten-Literale, so
müssen Teile mit + verkettet werden.
System.out.println (“Hallo Java\r und sagt“
+ “danach\"Hallo\nJava\" ");
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 18
JAVA
Java-Literale
„Unicode“
Unicode-Escapesequenzen für nicht-darstellbare Zeichen
Ein Java-Programm besteht aus einer Folge von Unicode-Zeichen. Der Unicode
umfaßt derzeit 34000 Zeichen (max = 65536 ).
Der numerische Wert eines Zeichens im Unicode-Format kann direkt eingegeben
werden. Format der Eingabe: \uxxxx, wobei x eines der Zeichen im Bereich von
0-9 oder A-F ist (hexadezimal).
Beispiel:
char a;
a = 97; a = 'a'; a = '\u0061‘
Die drei Zuweisungen haben dieselbe Semantik.
Die Unicode-Zeichen im Bereich von 0-128 entsprechen den Zeichen des ASCIIFormats. Im Bereich 129 -255 ist der Zeichensatz identisch mit ISO 8859-1 (Latin-1:
westeuropäische Sonderzeichen -> weiter Infos zu Zeichensätzen unter
http://www.odinet.de/slovo/codep.htm oder http://www.unicode.org )
public class HalloUnicode {
public static void main ( String [] args ) {
System.out.println ("\u0048\u0061\u006C\u006C\u006F");
}
}
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 19
JAVA
Java-Literale
„Unicode“
public class UnicodeAnwendung {
public static final char SZ = '\u00df';
public static void main(String[] args) {
System.out.println( Integer.toHexString('ß') );
System.out.println( “Ich hei" + SZ + "e");
}
}
Integer.toString (‘ß‘, 16) oder
Integer.toHexString ( ‘ß‘ )
liefert den Unicode in hex-Schreibweise für das Zeichen ß.
System.out.println ("\u00df”);
gibt immer ein ß aus; egal von welcher Plattform aus das Java-Programm übersetzt wird
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 20
JAVA
Java-Literale
4 Typen:
2 Typen:
1 Typ:
1Typ:
„8 Grundtypen“
(byte, short, int, long) für ganzzahlige Integerwerte
(float, double)
für Fließkommawerte (Gleitpunktwerte)
(char)
für Character- oder Zeichenwerte
(boolean)
für Wahrheitswerte (boolesche Werte)
Integrale Datentypen
Typ
Bit
von
bis einschließlich
boolean
8
false
true
byte
8
-128
127
short
16
-215 = -32.768
215 -1 = 32.767
int
32
-231 = -2.147.483.648
231 -1 = 2.147.483.647
long
64
-263 = -9.223.372.036.854.775.808
263 -1 = 9.223.372.036.854.775.807
char
16
0
65.535
Fließkomma-Datentypen
Typ
float
double
Größe Genauigkeit
von
32 Bit 6-7 Stellen
1.4E-45
64 Bit 15-16 Stellen 4.9E-324
Helga Gabler, Holger Vogelsang, Christian Pape
bis einschl.
3.4028235E38
1.7976931348623157E308
Übungen Informatik 1
Folie 21
JAVA
Java-Literale
„erweiterte Typkonvertierung“
Java wandelt automatisch einen kleineren (niederwertiger) in einen
größeren (höherwertiger) Datentyp um
byte
short
char
int
int
long
float
double
Wenn in einer Operation zwei unterschiedliche Typen enthalten sind:
z.B. System.out.println (integerZahl * longZahl);
autom. Umwandlung von int in long
Wenn in einer Operation gleiche Datentypen enthalten sind, die kleiner sind als
integer, wird das Resultat mindestens vom Typ integer sein.
z.B.: System.out.println (char * char);
Ergebnis vom Typ int
double x=10;
10 wird in double konvertiert
char c=‘a‘;
int i;
i=c;
char wird in int konvertiert
x=c;
char wird in double konvertiert
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
(‘a‘ => 97)
(‘a‘ => 97.0)
Folie 22
JAVA
Java-Literale
„erweiterte Typkonvertierung“
public class Typen01 {
public static void main (String[] args)
int ersteZahl;
long zweiteZahl =999999;
ersteZahl = 999999;
{
System.out.println (ersteZahl * ersteZahl);
/*Java bestimmt, dass das Ergebnis vom Typ int sein wird
deshalb hier: falsches Ergebnis (zu groß für Integer, s. Tabelle)
*/
System.out.println (ersteZahl * zweiteZahl);
/* Java bestimmt, dass das Ergebnis vom Typ long sein wird (s.o.),
automatische Typkonvertierung von int nach long, weil zweiteZahl eine
long-Variable ist )
}
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 23
JAVA
Java-Literale
„eingeschränkte Typkonvertierung“
Umwandlung vom größeren (höherwertiger) in einen kleineren
(niederwertiger) Datentyp geschieht in Java mit dem
cast-(Konvertierungs-) Operator
„eingeschränkte Konvertierung“
cast : = voranstellen, vorstellen-Operator, gibt den Zieltyp an (typ)
byte
short
char
int
int
long
float
double
Ziel-Typ in runden Klammern
i
= (int) 99.9999; double-wert 99.9999 wird nach int
konvertiert, der Nachkommateil wird abgeschnitten.
abc = (byte) xyz;
Helga Gabler, Holger Vogelsang, Christian Pape
char-Wert xyz wird nach byte konvertiert
Übungen Informatik 1
Folie 24
JAVA
Java-Literale
„eingeschränkte Konvertierung“
public class Typen02 {
public static void main(String[] args) {
byte aZahl = 2;
byte bZahl = 5;
byte cZahl;
// FEHLER!
// das Ergebnis ist vom Typ integer,
// obwohl als byte deklariert
cZahl = (byte) aZahl * bZahl;
// FEHLER!
cZahl = aZahl * bZahl;
cZahl = (byte) (aZahl * bZahl); // cZahl soll vom Typ byte sein
// Typumwandlung per Cast
// bzahl=bZahl*aZahl
// effektiv -> ohne Zwischenergebnis
bZahl *= aZahl;
System.out.println(cZahl);
System.out.println(bZahl);
}
}
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 25
JAVA
Java-Literale
“Konstanten“
final float MEHRWERTSTEUER = 16.0
final char EURO;
EURO = ‘€‘
wurde der Wert der final-Variable (hier €) einmal festgelegt,
ist eine spätere Änderung nicht mehr möglich.
die Variable kann wie eine Konstante eingesetzt werden.
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 26
JAVA
Aufbau des Quelltextes
„Operatoren“
Operatoren
Operatoren werden für Vergleiche und Berechnungen verwendet.
Die Operatoren sind:
Arithmetische Operatoren:
Relationale Operatoren:
Logische Operatoren:
+
>
!
Bit Operatoren:
Zuweisungs Operatoren:
~ | & ^ >> >>> <<
= += -= *= /= %=
|= ^= <<= >>= >>>=
Sonstige Operatoren:
?: [ ] . (parameterliste)
(type) new instanceof +
- * /
>= <
&& ||
%
<=
==
!=
&=
Prioritäten : http://java.rrzn.uni-hannover.de/tkji/javakurs/start-frame.html
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 27
JAVA
Variablen
Variablen dienen dazu, Daten im Hauptspeicher eines Programms abzulegen und
gegebenenfalls zu lesen oder zu verändern. In Java gibt es drei Arten von Variablen:
Lokale Variablen:
müssen explizit initialisiert werden
Deklaration und Gültigkeit:
innerhalb einer Methode oder innerhalb eines Blocks einer Methode
(kommt später, im 2. Semester)
Instanzvariablen:
Existieren zusammen mit den Instanzen der Klasse
Modifikatoren sind zulässig
werden beim Erzeugen der Instanz initialisiert
Deklaration:
innerhalb des Rumpfes einer Klasse
(kommt später, im 2. Semester)
Klassenvariablen
Existieren unabhängig von den Instanzen der Klasse
Modifikatoren sind zulässig
werden beim Laden der Klasse initialisiert
Deklaration:
innerhalb des Rumpfes einer Klasse und
explizit mit static als Klassenvariable vereinbart.
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 28
JAVA
Variablen
Alle Variablen müssen in Java deklariert werden,
bevor man sie verwendet
Variablen werden wie folgt gebildet:
Modifikator(en) – Typ – Name – Wert
Modifikatoren: Sichtbarkeitsbereich und Lebensdauer
Typ:
Grundtyp oder Referenztyp
Name:
Java-Bezeichner
Bei der Deklaration können Variablen gleich initialisiert werden
int
float
char
static final float
String
Helga Gabler, Holger Vogelsang, Christian Pape
ivar1, ivar2, ivar3;
wurzel;
cv1=‘a‘, cv2=10; cv3;
PI = 3.14F;
zeile; (Referenztypvariable)
Übungen Informatik 1
Folie 29
JAVA
Gültigkeitsbereich von Variablen
public class BlockDemo {
// Anfang Block der Klasse BlockDemo
public static void main(String[] args) { // Anfang Block Methode main
String blk = "Main-Block";
System.out.println(blk); {
// ein Block (Block 1)
String blk1 = " Block 1";
System.out.println(blk + blk1);
}
{
/* noch ein Block , blk1 aus Block 1 ist
in diesem Block nicht "sichtbar„ */
String blk2 = " Block 2";
System.out.println(blk + blk2);
// System.out.println(blk1);
}
}
}
// Ende main()
// Ende class BlockDemo
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 30
JAVA
Java-Befehle
„Beispiele“
// Deklaration
// Zuweisung
/* Zuweisung a = a+1: Abk + effekt. Anweisung,
*/ weil kein Zwischenergebnis gebildet wird.
// Methodenaufruf
int ivar1, ivar2;
a=b+c;
a++;
System.out.println(a,b);
if (a==b)
a=c;
oder
if (a==b){
a=c;
}
if (a==0) {
b=10;
c=20;
}
int c;
if (a==c){
b=a;
c=b;
System.out.println(a,b);
// Schlüsselwort if
// dasselbe über mehrere Zeilen
// hier kein Semikolon
// Block
// zusammengesetzter Befehl:
// blocklokale Variable
}
Helga Gabler, Holger Vogelsang, Christian Pape
Übungen Informatik 1
Folie 31
Herunterladen