Java • • • • Utvecklat på SUN Microsystems mitten 1990-talet Ursprungligen för Webprogram. Nu mycket spritt. Massor med läroböcker.Vi använder Lewis&Loftus http://java.sun.com/javase/6/docs/api/ Monday, November 2, 2009 Skillnader mellan Python och Java Viktigast: Java har statisk typning. Alla variabler, metoder etc ska deklareras och ges en fix typ. Typen får inte ändras under programmets gång. Python Java - int a; def siffersum(n) int siffersum(int n) Monday, November 2, 2009 En typ kan vara: inbyggd typ int boolean float char namn på en klass String array av ovanstående Monday, November 2, 2009 Ball int[] String[] fallgropar true och false med små bokstäver char har enstaka tecken omslutn av ’ String har textsträngar omslutna av ” Javas arrayer påminner om Matlabs, och är mycket olika Pythons listor. Pythons listor och dictionaries saknas helt i Java Monday, November 2, 2009 Allt har en typ. Typ ska anges: Varje gång en variabel introduceras För varje attribut till en klass För varje metod: resultattyp och parametrars typer Monday, November 2, 2009 variabel/attribut: Deklareras genom att skriva typens namn följt av variabelns namn int a; Ball b; Obs! semikolon avslutar alla satser, liksom i Matlab Får i samband med deklarationen int a = 1; float b = 2.53; ges ett initialvärde Monday, November 2, 2009 Arraydeklarationer int[] a; a = new int[5]; a ska vara av typ array of int, ännu inte bestämt hur lång a blir ett arrayobjekt som tar 5 stycken int, a[0]...a[4] (inledningsvis är elementen odefinierade) kombinerar ovanstående int[] a = new int[5]; int [] a = {5,18,22,0,3}; int [] [] c; Monday, November 2, 2009 Deklarerar, skapar och initierar i ett drag! c är en tvådimensionell array. Elementet på plats i,j noteras c[i][j] Metoddeklaration Resultattypen skrivs före metodnamnet. För varje formell parameter skrivs dess typ före parameterns namn. Inget self ! Python: def checkpos(self,ball,pos) boolean checkpos(Ball ball, Position pos) En metod som inte returnerar något får void istället för en typ: void runsimulation() Monday, November 2, 2009 Allt i Java är klasser med sina metoder. Det finns inget huvudprogram. Det finns inga ”funktioner” - alla sådana måste vara metoder till någon klass Python Java def move(self, pos): void move(Position pos) { <metodkropp> <metodkropp> } ... ... Typdeklarera resultat och parametrar Inget kolon metodkroppen inom krullparanteser { } Monday, November 2, 2009 Blockstruktur Python Java Kommandon avslutas med ny rad Kommandon avslutas med semikolon, ”;” Block av kommandon anges genom indragning Block av kommandon anges genom att innesluta dem i krullparanteser, ”{ ... }” Viktiga inledningar av block följs av kolon Java använder inte kolon alls Monday, November 2, 2009 Python if a>b: c = 0 a += 1 b = a Monday, November 2, 2009 Java if (a>b) { c = 0; a += 1; } b = a; Indragningar och radbrott är betydelselösa if (a>b) { c = 0; a += 1; } b = a; if (a>b) {c =0; a += 1;} b = a; if (a>b) { c = 0; a += 1; } b = a; Alla dessa är samma! if (a>b) {c=0;a += 1;}b = a; Fortsätt att använda indragningar och radbrott för att öka läsbarheten! Monday, November 2, 2009 Statiskt scope För varje deklaration är det väldefinierat för vilket område av koden den gäller Ex: Deklaration av en variabel har räckvidden resten av det kodblocket, alltså det som avgränsas av { } . if (a>b) { int a; Här inne kan a användas . . } Här ute kan a inte användas . . Monday, November 2, 2009 Tilldelning Python Java a = 0 b = c/(d+1) c += 2 a = 0; b = c/(d+1); c += 2; I Java finns dessutom a++; kortform för a+=1; Monday, November 2, 2009 if Python Java if a>b: d = 2 elif a<b: d = 1 e = 0 else: d = 0 if (a>b) d = 2; else if (a<b) { d = 1; e = 0; } else d = 0; Paranteser runt villkor obligatoriska elif heter else if Inga kolon Glöm inte semikolon efter kommandon Monday, November 2, 2009 while Python Java while a>b: d = 2+a a -= 1 while (a>b) { d = 2+a; a--; } Paranteser runt villkor obligatoriska Inga kolon Glöm inte krullparanteser om loopen består av flera kommandon, och semikolon efter kommandon Monday, November 2, 2009 do Python Java Finns inte do { d = 2+a; a--; } while (a<b); Som while, men kollar loopvillkoret i slutet av loopkroppen Monday, November 2, 2009 while (villkor) { loopkropp } loopvillkor loopkropp Monday, November 2, 2009 do { loopkropp } while (villkor); loopvillkor loopkropp for Python Java for elem in balls: . . for (elem:balls) { . . } for i in range(20): . . Monday, November 2, 2009 for (i=0; i<20; i++) { . . } for i Java for (initiering; loopkropp } villkor; update) { 1. initiering görs en gång. Den innehåller ofta deklaration av loopräknare 2. Så länge villkor är sant, gör loopkropp. 3. Efter varje gång loopkropp gjorts, gör också update Monday, November 2, 2009 for (initiering; loopkropp } villkor; update) { initiering update loopkropp Monday, November 2, 2009 villkor int sum = 0; for (int i=0; i<10; i++) { sum += i*i } Monday, November 2, 2009 Klassdeklaration Python Java class Ball(): def __init__(self,x): . . . . class Ball { Ball(x) { . . } . . Inga paranteser eller kolon } Glöm inte krullparanteser! Konstruktormetoden heter samma som klassnamnet och ges aldrig någon typ. Monday, November 2, 2009 Instansiering Python Java theball = Ball(25) theball = new Ball(25); Det speciella ordet new signalerar att ett nytt objekt ska konstrueras. Att använda attribut och metoder sker exakt likadant, med punktnotation. Monday, November 2, 2009 import Python Java import Tkinter import javax.swing from Tkinter import Frame import javax.swing.JFrame from Tkinter import * import javax.swing.* Inget from, utan använd punktnotation istället Monday, November 2, 2009 Modifiers Extra egenskaper kan anges i samband med en deklaration. Skrivs före typen. Monday, November 2, 2009 public ”Detta kan användas även utanför den fil där deklarationen står” static ”Detta förknippas med klassen och inte med klassens objekt” final ”Detta är en konstant som inte får tilldelas nytt värde” final int SIZE = 600; public static float arcsin(float x) { .. Monday, November 2, 2009 Output Python Java print ”Hej” System.out.println (”Hej”); finns också: System.out.print() (utan radbyte) Monday, November 2, 2009 Input import java.util.Scanner; Scanner scan = new Scanner(System.in); Python: a = scan.nextLine(); a = raw_input() i = scan.nextInt(); i = input() Monday, November 2, 2009 Ett fullständigt program Fil Prog: public class Prog... class klass1... En serie klassdefinitioner varav precis en är public. Denna kallas programmets huvudklass och måste ha samma namn som filen den ligger i. class klass2... Obs! inget huvudprogram som i Python Monday, November 2, 2009 main När ett program körs börjar det alltid med metoden main() i huvudklassen. Huvudklassen måste alltså ha en sådan metod. För main() gäller: Den ska kunna anropas utifrån, dvs vara public Den ska höra till själva huvudklassen och inte till något av dess objekt, dvs vara static Den ska inte returnera något värde, dvs i stället för resultattyp har den void. Den ska som parameter ha en array av String Monday, November 2, 2009 public class MyMainProg { public static void main(String[] args) { Det som står här kommer att köras när MyMainProg körs } } Monday, November 2, 2009 Exempel //******************************************************************** // GasMileage.java Author: Lewis/Loftus // // Demonstrates the use of the Scanner class to read numeric data. //******************************************************************** import java.util.Scanner; public class GasMileage { //----------------------------------------------------------------// Calculates fuel efficiency based on values entered by the // user. //----------------------------------------------------------------public static void main (String[] args) { int miles; double gallons, mpg; Scanner scan = new Scanner (System.in); Python: System.out.print ("Enter the number of miles: "); miles = scan.nextInt(); miles = input(”Enter the number of miles”) System.out.print ("Enter the gallons of fuel used: "); gallons = scan.nextDouble(); gallons = input(”Enter the gallons of fuel used”) mpg = miles / gallons; mpg = miles / gallons System.out.println ("Miles Per Gallon: " + mpg); print ”Miles Per Gallon”, mpg } } Monday, November 2, 2009 import java.text.DecimalFormat; import java.util.Scanner; public class Average { //----------------------------------------------------------------// Computes the average of a set of values entered by the user. // The running sum is printed as the numbers are entered. //----------------------------------------------------------------public static void main (String[] args) { sum = count = 0 int sum = 0, value, count = 0; double average; Scanner scan = new Scanner (System.in); System.out.print ("Enter an integer (0 to quit): "); value = scan.nextInt(); while (value != 0) { count++; value = input (”Enter an integer (0) to quit”) // sentinel value of 0 to terminate loop while value != 0: count += 1 sum += value print ”The sum so far is”, sum sum += value; System.out.println ("The sum so far is " + sum); System.out.print ("Enter an integer (0 to quit): "); value = scan.nextInt(); value = input (”Enter an integer..”) } System.out.println (); if (count == 0) System.out.println ("No values were entered."); if count == 0: print ”No values were entered”) Monday, November 2, 2009 } } else { average = (double)sum / count; System.out.println ("The average is " + average); } else: average = float(sum) / count print ”The average is”, average import java.util.Scanner; public class PalindromeTester { //----------------------------------------------------------------// Tests strings to see if they are palindromes. //----------------------------------------------------------------public static void main (String[] args) { another = ”y” String str, another = "y"; int left, right; Scanner scan = new Scanner (System.in); while (another.equalsIgnoreCase("y")) // allows y or Y { System.out.println ("Enter a potential palindrome:"); str = scan.nextLine(); while another == ”y” or another == ”Y”: str = raw_input(”Enter a potential palindrome”) left = 0; right = str.length() - 1; left = 0 right = len(str)-1 while (str.charAt(left) == str.charAt(right) && left < right) { left++; right--; } while str[left] == str[right] and left < right: left += 1 right -= 1 System.out.println(); if (left < right) System.out.println ("That string is NOT a palindrome."); else System.out.println ("That string IS a palindrome."); if left < right: print ”That string is NOT a palindrome” else: print ”That string IS a palindrome” System.out.println(); System.out.print ("Test another palindrome (y/n)? "); another = scan.nextLine(); another = raw_input(”Test another palindrome (y/n?” } } } Monday, November 2, 2009 NetBeans http://www.netbeans.org/ Monday, November 2, 2009 Inför labben • • • Ny partner, som alltid Läs L&L 2.1 – 2.6, 3.1-3.6, 5.1-5.8, 7.1-7.2 Provkör netbeans med något enkelt, tex http://testwww.netbeans.org/kb/docs/java/quickstart.html Monday, November 2, 2009