principles of software construction: objects, design, and concurrency introduction to java ·...
TRANSCRIPT
117-214
PrinciplesofSoftwareConstruction:Objects,Design,andConcurrency
IntroductiontoJava
JoshBlochCharlieGarrod
217-214
Administrivia
• Homework1duenextThursday11:59p.m.– Everyonemustreadandsignourcollaborationpolicy
• FirstreadingassignmentdueTuesday– EffectiveJavaItems15and16
317-214
Outline
I. "HelloWorld!"explainedII. ThetypesystemIII. Quick‘n’dirtyI/OIV. Abriefintroductiontocollections
417-214
The“simplest”JavaProgramclass HelloWorld {
public static void main(String[] args) {System.out.println("Hello world!");
}}
517-214
Complication1:youmustuseaclasseven ifyouaren’tdoingOOprogrammingclass HelloWorld {
public static void main(String[] args) {System.out.println("Hello world!");
}}
617-214
Complication2:mainmustbepublicclass HelloWorld {
public static void main(String[] args) {System.out.println("Hello world!");
}}
717-214
Complication3:mainmustbestaticclass HelloWorld {
public static void main(String[] args) {System.out.println("Hello world!");
}}
817-214
Complication4:mainmustreturnvoidclass HelloWorld {
public static void main(String[] args) {System.out.println("Hello world!");
}}
917-214
Complication5:mainmustdeclarecommandlineargumentsevenifunusedclass HelloWorld {
public static void main(String[] args) {System.out.println("Hello world!");
}}
1017-214
Complication6:standardI/Orequiresuseofstatic fieldofSystemclass HelloWorld {
public static void main(String[] args) {System.out.println("Hello world!");
}}
1117-214
Executionisabitcomplicated
• Firstyoucompile thesourcefile– javac HelloWorld.java– ProducesclassfileHelloWorld.class
• Thenyoulaunchtheprogram– java HelloWorld– JavaVirtualMachine(JVM)executesmainmethod
1217-214
Onthebrightside…
• Hasmanygoodpointstobalanceshortcomings• Someverbosityisnotabadthing– Canreduceerrorsandincreasereadability
• ModernIDEseliminatemuchofthepain– Typepsvm insteadofpublic static void main
• Managedruntimehasmanyadvantages– Safe,flexible,enablesgarbagecollection
• ItmaynotbebestlanguageforHelloWorld…– ButJavaisverygoodforlarge-scaleprogramming!
1317-214
Outline
I. “HelloWorld!”explainedII. ThetypesystemIII. Quick‘n’dirtyI/OIV. Abriefintroductiontocollections
1417-214
Javahasabipartite (2-part)typesystem
Primitives ObjectReferenceTypesint, long, byte, short, char, float, double, boolean
Classes,interfaces,arrays,enums,annotations
Noidentityexcepttheirvalue HaveidentitydistinctfromvalueImmutable Somemutable,someimmutableOnstack, existonlywheninuse Onheap,garbagecollectedCan’tachieveunityofexpression UnityofexpressionwithgenericsDirtcheap More costly
1517-214
ProgrammingwithprimitivesAlotlikeC!
public class TrailingZeros {public static void main(String[] args) {
int i = Integer.parseInt(args[0]);System.out.println(trailingZerosInFactorial(i));
}
static int trailingZerosInFactorial(int i) {int result = 0; // Conventional name for return value
while (i >= 5) {i /= 5; // Same as i = i / 5; Remainder discardedresult += i;
}return result;
}}
1617-214
Primitivetypesummary
• int 32-bitsignedinteger• long 64-bitsignedinteger• byte 8-bitsignedinteger• short 16-bitsignedinteger• char 16-bitunsignedinteger/character• float 32-bitIEEE754floatingpointnumber• double 64-bitIEEE754floatingpointnumber• boolean Boolean value:true orfalse
1717-214
Deficientprimitivetypes
• byte,short – useint instead!– byte isbroken– shouldhavebeenunsigned
• float – usedouble instead!– Providestoolittleprecision– Onlycompellingusecaseislargearrays,especiallyinresource-constrainedenvironments
1817-214
PopQuiz!
1917-214
Whatdoesthisfragmentprint?int[] a = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int i;int sum1 = 0;for (i = 0; i < a.length; i++) {
sum1 += a[i];}
int j;int sum2 = 0;for (j = 0; i < a.length; j++) {
sum2 += a[j];}
System.out.println(sum1 - sum2);
2017-214
Maybenotwhatyouexpect!int[] a = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int i;int sum1 = 0;for (i = 0; i < a.length; i++) {
sum1 += a[i];}int j;int sum2 = 0;for (j = 0; i < a.length; j++) { // Copy/paste error!
sum2 += a[j];}System.out.println(sum1 - sum2);
Youmightexpectittoprint0,butitprints55
2117-214
Youcouldfixitlikethis…int[] a = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int i;int sum1 = 0;for (i = 0; i < a.length; i++) {
sum1 += a[i];}int j;int sum2 = 0;for (j = 0; j < a.length; j++) {
sum2 += a[j];}
System.out.println(sum1 - sum2); // Now prints 0, as expected
2217-214
Butthisfixisfarbetter…int sum1 = 0;for (int i = 0; i < a.length; i++) {
sum1 += a[i];}
int sum2 = 0;for (int i = 0; i < a.length; i++) {
sum2 += a[i];}
System.out.println(sum1 - sum2); // Prints 0
• Reducesscopeofindexvariabletoloop• Shorterandlesserrorprone
2317-214
Thisfixisbetterstill!int sum1 = 0;for (int x : a) {
sum1 += x;}
int sum2 = 0;for (int x : a) {
sum2 += x;}
System.out.println(sum1 - sum2); // Prints 0
• Eliminatesscopeofindexvariableentirely!• Evenshorterandlesserrorprone
2417-214
Lessonsfromthequiz
• Minimizescopeoflocalvariables[EJItem57]– Declarevariablesatpointofuse
• Initializevariablesindeclaration• Preferfor-eachloopstoregularfor-loops• Usecommonidioms• Watchoutforbadsmellsincode– Suchasindexvariabledeclaredoutsideloop
2517-214
Objects
• Allnon-primitivesarerepresentedbyobjects.• Anobject isabundleofstateandbehavior• State– thedatacontainedintheobject– InJava,thesearethefields oftheobject
• Behavior– theactionssupportedbytheobject– InJava,thesearecalledmethods– MethodisjustOO-speakforfunction– Invokeamethod=callafunction
2617-214
Classes
• Everyobjecthasaclass– Aclassdefinesmethodsandfields– Methodsandfieldscollectivelyknownasmembers
• Classdefinesbothtypeandimplementation– Type≈wheretheobjectcanbeused– Implementation≈howtheobjectdoesthings
• Looselyspeaking,themethodsofaclassareitsApplicationProgrammingInterface(API)– Defineshowusersinteractwithitsinstances
2717-214
Theclasshierarchy
• TherootisObject(allnon-primitivesareobjects)• AllclassesexceptObjecthaveoneparentclass– Specifiedwithanextends clauseclass Guitar extends Instrument { ... }
– Ifextends clauseomitted,defaultstoObject• Aclassisaninstanceofallitssuperclasses
Object
ToyInstrument
YoyoGuitar
2817-214
Implementationinheritance
• Aclass:– Inheritsvisiblefieldsandmethodsfromitssuperclasses– Canoverridemethodstochangetheirbehavior
• Overridingmethodimplementationmustobeycontract(s)ofitssuperclass(es)– Ensuressubclasscanbeusedanywheresuperclass can– Liskov SubstitutionPrinciple(LSP)– Wewilltalkmoreaboutthisinalaterclass
2917-214
Interfacetypes
• Definesatypewithoutanimplementation• Muchmoreflexiblethanclasstypes– Aninterfacecanextendoneormoreothers– Aclasscanimplementmultipleinterfaces
3017-214
Enum types
• Javahasobject-orientedenums• Insimpleform,theylookjustlikeCenums:
enum Planet { MERCURY, VENUS, EARTH, MARS,JUPITER, SATURN, URANUS, NEPTUNE }
• Buttheyhavemany advantages!– Compile-timetypesafety– Multipleenum typescansharevaluenames– Canaddorreorderwithoutbreakingexistinguses– High-qualityObjectmethodsareprovided– Screamingfastcollections(EnumSet,EnumMap)– Caniterateoverallconstantsofanenum
3117-214
Boxedprimitives
• Immutablecontainersforprimitivetypes• Boolean,Integer,Short,Long,Character,Float,Double
• Letyou“use”primitivesincontextsrequiringobjects• Canonicalusecaseiscollections• Don’tuseboxedprimitivesunlessyouhaveto!• Languagedoesautoboxing andauto-unboxing– Blursbutdoesnoteliminatedistinction– Therebedragons!
3217-214
Comparingvalues
x == y comparesthecontents ofx andyprimitivevalues: returnstrueifxandyhavethesamevalueobjectsrefs: returnstrueifxandyrefertosameobject
x.equals(y) comparesthevaluesoftheobjectsreferredto byx andy
3317-214
Trueorfalse?
int i = 5;int j = 5;System.out.println(i == j);---------------------------
3417-214
Trueorfalse?
int i = 5;int j = 5;System.out.println(i == j);---------------------------true
5j
i 5
3517-214
Trueorfalse?
int i = 5;int j = 5;System.out.println(i == j);---------------------------true
String s = "foo";String t = s;System.out.println(s == t);---------------------------
5j
i 5
3617-214
Trueorfalse?
int i = 5;int j = 5;System.out.println(i == j);---------------------------true
String s = "foo";String t = s;System.out.println(s == t);---------------------------true
5j
i 5
"foo"
t
s
3717-214
Trueorfalse?
int i = 5;int j = 5;System.out.println(i == j);---------------------------true
String s = "foo";String t = s;System.out.println(s == t);---------------------------true
String u = "iPhone";String v = u.toLowerCase();String w = "iphone";System.out.println(v == w);---------------------------
5j
i 5
"foo"
t
s
3817-214
Trueorfalse?
int i = 5;int j = 5;System.out.println(i == j);---------------------------true
String s = "foo";String t = s;System.out.println(s == t);---------------------------true
String u = "iPhone";String v = u.toLowerCase();String w = "iphone";System.out.println(v == w);---------------------------Undefined!(false inpractice)
5j
"foo"
t v
u
w
"iPhone"si 5
"iphone"
"iphone"?
3917-214
Themoral
• Alwaysuse.equals tocompareobjectrefs– (Exceptforenums,whicharespecial)– The==operatorcanfailsilentlyandunpredictably
4017-214
Outline
I. “HelloWorld!”explainedII. TheJavatypesystemIII. Quick‘n’dirtyI/OIV. Abriefintroductiontocollections
4117-214
Output
• UnformattedSystem.out.println("Hello World");System.out.println("Radius: " + r);System.out.println(r * Math.cos(theta));System.out.println();System.out.print("*");
• FormattedSystem.out.printf("%d * %d = %d%n", a, b, a * b); // Varargs
4217-214
Commandlineinputexample
Echos allcommandlineargumentsclass Echo {
public static void main(String[] args) {for (String arg : args) {
System.out.print(arg + " ");}
}}
$ java Echo Woke up this morning, had them weary blues
Woke up this morning, had them weary blues
4317-214
Commandlineinputwithparsing
PrintsGCDoftwocommandlineargumentsclass Gcd {
public static void main(String[] args) {int i = Integer.parseInt(args[0]);int j = Integer.parseInt(args[1]);System.out.println(gcd(i, j));
}
static int gcd(int i, int j) {return i == 0 ? j : gcd(j % i, i);
}}
$ java Gcd 11322 35298666
4417-214
Scannerinput
Countsthewordsonstandardinputclass Wc {
public static void main(String[] args) {Scanner sc = new Scanner(System.in);long result = 0;while (sc.hasNext()) {
sc.next(); // Swallow tokenresult++;
}System.out.println(result);
}}
$ java Wc < Wc.java32
4517-214
Outline
I. “HelloWorld!”explainedII. ThetypesystemIII. Quick‘n’dirtyI/OIV. Abriefintroductiontocollections
4617-214
Primarycollectioninterfaces
Collection
QueueSet List
Deque
Map
4717-214
“Primary”collectionimplementations
Interface ImplementationSet HashSetList ArrayListQueue ArrayDequeDeque ArrayDeque(stack) ArrayDequeMap HashMap
4817-214
Othernoteworthycollectionimplementations
Interface Implementation(s)
Set LinkedHashSetTreeSetEnumSet
Queue PriorityQueue
Map LinkedHashMapTreeMapEnumMap
4917-214
Collectionsusageexample1
Squeezeduplicatewordsoutofcommandline
public class Squeeze {public static void main(String[] args) {
Set<String> s = new LinkedHashSet<>();for (String word : args)
s.add(word);System.out.println(s);
}}
$ java Squeeze I came I saw I conquered[I, came, saw, conquered]
5017-214
Collectionsusageexample2
Printuniquewordsinlexicographicorderpublic class Lexicon {
public static void main(String[] args) {Set<String> s = new TreeSet<>();for (String word : args)
s.add(word);System.out.println(s);
}}
$ java Lexicon I came I saw I conquered[I, came, conquered, saw]
5117-214
Collectionsusageexample3
Printindexoffirstoccurrenceofeachwordclass Index {
public static void main(String[] args) {Map<String, Integer> index = new TreeMap<>();
// Iterate backwards so first occurrence winsfor (int i = args.length - 1; i >= 0; i--) {
index.put(args[i], i);}System.out.println(index);
}}
$ java Index if it is to be it is up to me to do it{be=4, do=11, if=0, is=2, it=1, me=9, to=3, up=7}
5217-214
Moreinformationoncollections
• Formuchmoreinformationoncollections,seetheannotatedoutline:
https://docs.oracle.com/javase/11/docs/technotes/guides/collections/reference.html
• Formoreinfoonany libraryclass,seejavadoc– Searchwebfor<fullyqualifiedclassname>8– e.g.,java.util.scanner 8
5317-214
Whataboutarrays?
• Arraysaren’treallyapartofthecollectionsframework
• Butthereisanadapter:Arrays.asList• Arraysandcollectionsdon’tmix• Ifyoutrytomixthemandgetcompilerwarnings,takethemseriously
• Generallyspeaking,prefercollectionstoarrays• See EffectiveJava Item28fordetails
5417-214
TolearnJavaquickly
5517-214
Summary
• Javaiswellsuitedtolargeprograms;smallonesmayseemabitverbose
• Bipartitetypesystem– primitives&objectrefs– Singleimplementationinheritance–Multipleinterfaceinheritance
• AfewsimpleI/Otechniqueswillgetyoustarted• Collectionsframeworkispowerful&easytouse