Mål med kurset Java i INF 2400 Introduksjon til signalbehandling Lyd som anvendelse Få programmeringserfaring Dagens tema Utplukk av Java (GUI, kode-konvensjon, polymorfisme, classpath, javadoc) Java og signalbehandling Introduksjon til første Java øving INSTITUTT FOR INFORMATIKK SVEIN BØE 1 INSTITUTT FOR INFORMATIKK SVEIN BØE 2 GUI med Swing import java.awt.*; import javax.swing.*; public class GUI { public static main(string[] args) { JFrame frame = new JFrame("window title"); // Applikasjonens hoved-vindu Container contentpane = frame.getcontentpane(); // Container for visuelle elementer contentpane.add(new JLabel("lable-text")); // Legg til visuelt element i container Dokumentasjon Java hjemmeside: http://java.sun.com/ Java tutorial: http://java.sun.com/docs/books/tutorial/ Java Sound: http://java.sun.com/products/java-media/sound/ Pakken ifi.dsb: http://www.ifi.uio.no/~inf2400/java/doc/ JMenuBar menubar = new JMenuBar(); // Hvis meny i toppen av applikasjons-vindu JMenu menu = new JMenu("menu-title"); // Husk å komponere menyen menubar.add(menu); frame.setmenubar(menubar); frame.pack(); // Klargjør (geometrier/avstander/størrelser) frame.setvisible(true); // Vis frem på skjermen // main // GUI INSTITUTT FOR INFORMATIKK SVEIN BØE 3 INSTITUTT FOR INFORMATIKK SVEIN BØE 4
Kode-konvensjon http://java.sun.com/docs/codeconv/ Hvorfor? Gjøre koden mer lesbar for andre Vedlikehold utgjør 80% av kostnadene ved koding Vedlikehold gjøres ofte av andre. Ikke tilstrekkelig at DU liker din stil. Kode-konvensjon forts. Navnekonvensjonen viktigst, gir informasjon om funksjon class: Substantiv, stor forbokstav for hvert del-ord (ikke bruk _ ) Unngå sjeldne akronymer og forkortelser. Eks: SoundInput, BufferedImage Interface: Som for klasser. Eks: PeriodicGenerator Metoder: Verb, ellers som for klasser, men liten førstebokstav Eks: addchangelistener, getcontentpane. Variable: Form som for verb. Unngå en-bokstav navn (unntatt vanlig bruk av i,j,k (int) og c,d (tegn) Klasse-konstanter (static final): Store bokstaver, del-ord adskilt med _. Eks: TWO_PI INSTITUTT FOR INFORMATIKK SVEIN BØE 5 INSTITUTT FOR INFORMATIKK SVEIN BØE 6 Polymorfisme (dynamisk binding) Separate klasser: public class Circle { double {... double { public class Rectangle { double {... double {... Ulike metodeimplementasjoner. // Beregn totalt areal // Må ha separate arrays Circle[] circles; Rectangle[] rectangles; double area = 0.0; for (int i = 0; i < circles.length; i++) { area += circles[i].; for (int i = 0; i < rectangles.length; i++) { area += rectangles[i].; UML (Unified Modelling Language): Circle Shape Rectangle Hver form krever separat kode! Ny form krever tillegg av kode! Ref. signal-generatorer. INSTITUTT FOR INFORMATIKK SVEIN BØE 7 INSTITUTT FOR INFORMATIKK SVEIN BØE 8
Superklasse med dummy-metoder: public class Shape { // Dummy-metoder (implementert): double { double { public class Circle extends Shape { double { double { public class Rectangle extends Shape { double { double circumference{ // Beregn totalt areal // Kan ha felles array (upcasting) Shape[] shapes; double area = 0.0; for (int i = 0; i < shapes.length; i++) { area += shapes[i].; Ny form krever ikke tillegg av kode (bare klasse-definisjon av formen)! Dette virker pga polymorfisme! UML-diagram: Circle abstract Shape Rectangle INSTITUTT FOR INFORMATIKK SVEIN BØE 9 INSTITUTT FOR INFORMATIKK SVEIN BØE 10 UML-diagram: Circle interface Shape Rectangle Superklasse med abstrakte metoder (abstrakt klasse): public abstract class Shape { // Ikke implementere metoder her abstract double ; abstract double ; Konkrete sub-klasser: public class Circle extends Shape { double {... double {... public class Rectangle extends Shape { double {... double {... Interface: public interface Shape { double ; double ; Konkrete sub-klasser: public class Circle implements Shape { public double {... public double {... public class Rectangle implements Shape { // Implementere metoder public double {... public {... Merk: public metode-implementasjoner INSTITUTT FOR INFORMATIKK SVEIN BØE 11 INSTITUTT FOR INFORMATIKK SVEIN BØE 12
Klasser og interface Abstrakt klasse kan ikke instantieres Abstrakt klasse kan definere metoder (både abstrakte og konkrete/implementerte) Abstrakt klasse kan inneholde data Interface kan ikke inneholde data Interface kan inneholde konstanter (static final) Interface kan inneholde (abstrakte) metoder Klasser kan implementere interface eller deler av det Objekter av sub-klasser kan upcastes Java Sound Lav-nivå støtte for lyd inn/ut. Del av J2SE > 1.3.0 Java-pakken ifi.dsb bruker Java Sound INSTITUTT FOR INFORMATIKK SVEIN BØE 13 INSTITUTT FOR INFORMATIKK SVEIN BØE 14 Pakken ifi.dsb To klasser for lyd inn/ut (SoundInput/SoundOutput) skjuler Java Sound API Om lag 50 klasser/interface, noen skal dere implementere Spille inn lyd (uten hensyn til exceptions): import ifi.dsb.*; SoundInput si = new SoundInput(); // Åpne kanal inn, alt. m/filnavn int[] data = new int[ ]; // For eksempel 128 // Spill inn korte blokker til betingelse innfridd while ( ) { num = si.read(data); // Hent fra kanal // Bruk data til noe, for eksempel lagre, plotte, filtrere, analysere si.close(); // Lukke kanal Pakken ifi.dsb forts. Spille av lyd (uten hensyn til exceptions): import ifi.dsb.*; SoundOutput so = new SoundOutput(); // Åpne kanal ut int[] data = new int[ ]; // For eksempel 128 //Spill korte klipp til betingelse innfridd while ( ) { // Fyll lyd-sampler i data-arrayen so.write(data); // Send til kanal so.close(); INSTITUTT FOR INFORMATIKK SVEIN BØE 15 INSTITUTT FOR INFORMATIKK SVEIN BØE 16
Første Java øving DSP tema: Frekvensbegrepet, aliasing Java tema: Lage klasse og program Kompilere og kjøre program Lese og lage API-dokumentasjon Første Java øving forts. Oppgave: Generere sum av sinuser http://www.ifi.uio.no/~inf2400/java/doc/01/ifi/dsb/sumofsines.html Hvorfor sinuser? Signal med én frekvens, ren tone, lett å analysere med øret Sinus inn gir sinus ut med samme frekvens i lineære systemer Ethvert signal kan uttrykkes som sum av sinuser Først: Lage sinusgenerator Så: Plugge inn sinusgenerator i ferdig program ifi.dsb.sumofsines. Til slutt: Lage programmet MySumOfSines som bruker ifi.dsb.sumofsines INSTITUTT FOR INFORMATIKK SVEIN BØE 17 INSTITUTT FOR INFORMATIKK SVEIN BØE 18 SumOfSines Plugge inn sinusgenerator SumOfSines-metoden start() starter en beregningsløkke, om lag slik: int[] buf = new int[128]; double value; SoundOutput so = new SoundOutput(); SliderPanel SineGenerator SumOfSines SoundOutput int n = -1; while (...) { // Fyll heltallsbufferen buf med beregnede sinus-sampler for (int i = 0; i < buf.length; i++) { ++n; value = <Sum av fun(n) fra alle sinus-generatorer> buf[i] = (int) value; so.write(buf); so.close(); INSTITUTT FOR INFORMATIKK SVEIN BØE 19 INSTITUTT FOR INFORMATIKK SVEIN BØE 20
Classpath Java leter etter klasser i henhold til classpath (export CLASSPATH=p1:p2: ) Anta programmet TestClass.java i /hom/kari/java skal bruke klassen ifi.dsb.sumofsines som ligger slik /hom/inf2400 java src classes doc ifi ifi ifi dsb dsb dsb SumOfSines.java SumOfSines.class SumOfSines.html mens vi står i /hom/kari/java. export CLASSPATH=.:/hom/inf2400/java/classes Hvis klassen evt. ligger i ifi.dsb.jar i classes-katalogen, kan vi bruke export CLASSPATH=.:/hom/inf2400/java/classes/ifi.dsb.jar Classpath forts. Hver komponent i classpath skal referere mor-katalogen til pakker, eks: /hom/inf2400/java/classes for å finne klasser i pakken ifi.dsb. Rekkefølgen av komponenter i classpath har betydning. Default classpath (dvs hvis tom) er. (nåværende katalog). http://java.sun.com/j2se/1.4.2/docs/tooldocs/findingclasses.html http://java.sun.com/j2se/1.4.2/docs/tooldocs/solaris/classpath.html Kanskje burde det heller hete packagepath? Som opsjon til java og javac javac classpath kolon-separert-path klassenavn.java INSTITUTT FOR INFORMATIKK SVEIN BØE 21 INSTITUTT FOR INFORMATIKK SVEIN BØE 22 Dokumentasjons-kommentarer Kommentarer og tilhørende klasse-/metode-/variabel-navn gir html-filer. - Innledes med /**, avsluttes med */ (vanlige kommentarer: // og /* */ ) - Kan inneholde tekst, html-kode og tags (spesielle kode-ord) - Brukes for klasser, interfacer, metoder og variable, skrives rett over - Tags for klasser og interfacer: @author navn (en tag for hver forfatter) - Tags for metoder, bl.a. @param navn beskrivelse @return beskrivelse @throws klassenavn beskrivelse (synonym med @exception) - Tags for alle typer, bl.a. @see klassenavn, eller @see klassenavn#metodenavn {@link navn synlig-tekst kan brukes i setninger INSTITUTT FOR INFORMATIKK SVEIN BØE 23