Think Java: Java Programming Language Part 1 Chia James Chang cjameschang@yahoo.com Materials are based on: Professor Allen B. Downey’s “Think Java: How to Think Like a Computer Scientist” (10/16/2012 – 11/20/2012) (Update: 10/21/2012) 10/17/2012 Think Java (TSG@ROLF) 1 Who Am I? James has worked in the software industry for 20+ years and is currently working at Microsoft. He had worked for Yahoo!, Sun Microsystems, Rolm/IBM, and several startups and has used Java and other languages and technologies to develop various mobile, enterprises, security, and Big Data software. 10/17/2012 Think Java (TSG@ROLF) 2 Freely received, freely give • “Freely you have received; freely give.” – Matthew 10:8 (New International Version) • “As we enjoy great Advantages from the Inventions of others, we should be glad of an Opportunity to serve others by any Invention of ours, and this we should do freely and generously.” – Benjamin Franklin, quoted in Benjamin Franklin by Edmund S. Morgan. 10/17/2012 Think Java (TSG@ROLF) 3 Background • In 1999, Professor Allen B. Downey was teaching an introductory computer science class using the Java programming language at Colby College, Maine, and start writing this free book. • “Think Java: How to Think Like a Computer Scientist” by Allen B. Downey – http://greenteapress.com/thinkapjava/index.html • Each chapter is about ten pages, not including the exercises. It’s a free book! • This book about a way of thinking like a computer scientist. 10/17/2012 Think Java (TSG@ROLF) 4 Think like a computer scientist • Computer scientists have an approach to problem-solving, and a way of crafting solutions, that is unique, versatile and powerful. • Hope that Professor Downey’s book and this class will give you a sense of what that approach is, and that at some point you will find yourself thinking like a computer scientist. – If you achieved it, all credits go to Professor Downey. – If not, it’s all my fault for not being able to teach. 10/17/2012 Think Java (TSG@ROLF) 5 Outline - 1 Chapter 1: The way of the program (programming language, program, debug, first program...) Chapter 2: Variables and types (variables, assignments, operators...) Chapter 3: Void methods (floating-point, classes and methods, parameters...) Chapter 15: Object-oriented programming (object methods and class methods, inheritance...) Chapter 4: Conditionals and recursion (modulus operator, conditions, recursion...) Chapter 6: Value methods (return values, overloading...) Chapter 7: Iteration and loops (multiple assignment, while...) Chapter 8: Strings and things (characters, traversal, String...) 10/17/2012 Think Java (TSG@ROLF) 6 Outline - 2 Chapter 9: Mutable objects (packages, instance variables, Objects...) Chapter 11: Create your own objects (class, constructors...) Chapter 12: Arrays (accessing elements, arrays and objects...) Chapter 13: Arrays of Objects (Card objects, arrays of cards...) Chapter 14: Objects of Arrays (Deck class, shuffling, sorting...) Chapter 5: GridWorld: Part 1 (College Board AP Computer Science Case Study) Chapter 10: GridWorld: Part 2 (College Board AP Computer Science Case Study) Chapter 16: GridWorld: Part 3 (College Board AP Computer Science Case Study) 10/17/2012 Think Java (TSG@ROLF) 7 References • Think Java: How to Think Like a Computer Scientist” by Allen B. Downey – http://greenteapress.com/thinkapjava/index.html • Think Java Class @ TSG of River of Life Foundation website – http://www.techsamaritan.org/courses/jameschang/java/java-1.html • GridWorld Case Study (College Board AP Computer Science Curriculum) – http://www.collegeboard.com/student/testing/ap/compsci_a/case.html • Java SE 7 JDK (Windows, Unix/Linux, and Mac) – http://www.oracle.com/technetwork/java/javase/downloads/index.html • The Java Tutorials – http://docs.oracle.com/javase/tutorial/index.html • Eclipse IDE for Java EE Developers – http://www.eclipse.org/downloads/ 10/17/2012 Think Java (TSG@ROLF) 8 Chapter 1: The way of the program 10/17/2012 Think Java (TSG@ROLF) 9 The way of the program • Think like a computer scientist who combines some of the best features of. • Mathematicians: use formal languages to denote ideas • Engineers: design things, assembling components into systems and evaluating tradeoffs among alternatives • Scientists: observe the behavior of complex systems, form hypotheses, and test predictions. 10/17/2012 Think Java (TSG@ROLF) 10 Problem-Solving • The single most important skill for a computer scientist is problem-solving. • What is problem-solving? – the ability to formulate problems, think creatively about solutions, and express a solution clearly and accurately • The process of learning to program is an excellent opportunity to practice problemsolving skills. 10/17/2012 Think Java (TSG@ROLF) 11 What is a programming language? • High-level: Java, Python, C, C++, etc. – easier to program; portable; interpret or compile • Low-level: machine or assembly language • Java is both compiled and interpreted. 10/17/2012 Think Java (TSG@ROLF) 12 What is a program? • A sequence of instructions that specifies how to perform a computation. • Instructions or statements perform: – input: get data – output: output data – math: perform math operations – testing: check for conditions, run statements – repetition: perform actions 10/17/2012 Think Java (TSG@ROLF) 13 What is debugging? • Debugging: tracking down and correcting bugs • Three kinds of errors: – syntax errors: • Syntax refers to the structure of your program and the rules about that structure. • e.g. omitting the semi-colon at the end of a statement – run-time errors: • In Java, run-time errors (called exceptions) occur when the interpreter is running the byte code and something goes wrong. • e.g. an infinite recursion causes a StackOverflowException – logic errors and semantics: 10/17/2012 • The semantics, or meaning of the program, are wrong. • e.g. yielding an unexpected result Think Java (TSG@ROLF) 14 Experimental debugging • One of the most important skills you will acquire in this class is debugging. • Debugging is one of the most interesting, challenging, and valuable parts of programming. • Debugging is like detective work. • Debugging is like an experimental science. As Sherlock Holmes pointed out, “When you have eliminated the impossible, whatever remains, however improbable, must be the truth.” (From A. Conan Doyle’s The Sign of Four). 10/17/2012 Think Java (TSG@ROLF) 15 Java! Java! Java! 10/17/2012 Think Java (TSG@ROLF) 16 Java • “Java: The World's Most Popular Programming Language” – The TIOBE Programming Community Index • “3 Billion Devices Run Java” – Oracle 10/17/2012 Think Java (TSG@ROLF) 17 Java Buzzwords General-purpose High-level Simple Architecture neutral Object oriented Portable Strong typed High performance Multithreaded Robust Dynamic Secure The Java Language Environment , a white paper written by James Gosling and Henry McGilton (http://java.sun.com/docs/white/langenv/) 10/17/2012 Think Java (TSG@ROLF) 18 The first program • “Hello, World.” in Java class HelloWorld { public static void main(String[] args) { System.out.println(“Hello World!”); } } • Java programs are made of class definitions class CLASSNAME { public static void main(String[] args) { STATEMENTS; } } 10/17/2012 Think Java (TSG@ROLF) 19 Java on different OS • Running on different Operating Systems (OS) via Java VM editor HelloWorld.java javac HelloWorld.java java HelloWorld.class Java VM Java VM Java VM Java VM “Hello World!” 10/17/2012 Think Java (TSG@ROLF) 20 Java Platform • Java Virtual Machine (JVM) • Java Application Programming Interface (API) HelloWorld.java API Java Java Virtual Machine Platform Hardware-Based Platform 10/17/2012 Think Java (TSG@ROLF) 21 Create and run Java program - 1 • Create a source file vi HelloWorld.java • Compile the source file into .class file javac HelloWorld.java o Output file: HelloWorld.class • Run the program java –classpath . HelloWorld Output message: “Hello World!” 10/17/2012 Think Java (TSG@ROLF) 22 Create and run Java program - 2 • Use different Java IDEs or editors • In this class, I’ll use Eclipse to create and run Java programs. • Demo 10/17/2012 Think Java (TSG@ROLF) 23 Summary & Exercises 10/17/2012 Think Java (TSG@ROLF) 24 Chapter 2: Variables and types 10/17/2012 Think Java (TSG@ROLF) 25 The way of program • Think like a computer scientist who combines some of the best features of. – Mathematicians: use formal languages to denote ideas – Engineers: design things, assembling components into systems and evaluating tradeoffs among alternatives – Scientists: observe the behavior of complex systems, form hypotheses, and test predictions. • The single most important skill for a computer scientist is problem-solving. – the ability to formulate problems, think creatively about solutions, and express a solution clearly and accurately • The process of learning to program is an excellent opportunity to practice problem-solving skills. 10/17/2012 Think Java (TSG@ROLF) 26 The first program • “Hello, World.” in Java class HelloWorld { public static void main(String[] args) { System.out.println(“Hello World!”); } } 10/17/2012 Think Java (TSG@ROLF) 27 More printing • “Hello, World.” in Java class Hello1 { // Generates some simple output. public static void main(String[] args) { System.out.println(“Hello, world.”); // print one line System.out.println(“How are your?”); // print another } } • To display the output on one line, use print class Hello2 { // Generates some simple output. public static void main(String[] args) { System.out.print(“Goodbye, ”); System.out.println(“cruel world!”); } } // output: Goodbye, cruel world!. 10/17/2012 Think Java (TSG@ROLF) 28 Variables • A variable is a named location that stores a value. • To declare or to create a variable String bob; String firstName; String lastName; • To declare multiple variables int hour, minute; 10/17/2012 Think Java (TSG@ROLF) 29 Primitive Data Types data type size default byte 8-bit signed 0 short 16-bit signed 0 int 32-bit signed 0 long 64-bit signed 0L float 32-bit signed (single-precision) 0.0f double 64-bit IEEE 754 (double-precision) 0.0d boolean true and false false char 16-bit Unicode char ‘\u0000’ Assignment • To store a variable with an assignment statement bob = “Hello.”; hour = 11; minute = 59; bob = “123”; // legal bob = 123; // not legal • When you declare a variable, you create a named storage location. • When you make an assignment to a variable, you give it a value. 10/17/2012 Think Java (TSG@ROLF) 31 Printing variables • You can print the value of a variable using println or print: class Hello3 { public static void main(String[] args) { String firstLine; firstLine = “Hello, again!”; System.out.println(firstLine); int hour, minute; hour = 11; minute = 59; System.out.print(“The current time is “); System.out.print(hour); System.out.print(“:”); System.out.print(minute); System.out.println(“.”); // output: The current time is 11:59. } } 10/17/2012 Think Java (TSG@ROLF) 32 Keywords • There are certain words that are reserved in Java. These words are called keywords. • The complete list is available at http://download.oracle.com/javase/tutorial/ja va/nutsandbolts/_keywords.html , provided by Oracle. 10/17/2012 Think Java (TSG@ROLF) 33 Java Reserved Words abstract assert boolean break byte case catch char class const continue default do double else enum extends false final finally float for goto if implements import in instanceof int interface long native new null package private protected public return short static strictfp super switch synchronized this throw throws transient try true void volatile while 10/17/2012 Think Java (TSG@ROLF) 34 Operators • Operators are symbols used to represent computations like addition. • addition is +, subtraction is -, multiplication is *, and division is /. • Expressions can contain both variable names and numbers. • Variables are replaced with their values before the computation is performed. 10/17/2012 Think Java (TSG@ROLF) 35 Operators • What is the result? minute = 59; System.out.println(minute/60); // 0.98333? • Integer division – The result is 0 because Java is performing integer division. – When both operands are integers (operands are the things operators operate on), the result is also an integer, and by convention integer division always rounds down. 10/17/2012 Think Java (TSG@ROLF) 36 Order of operations • When more than one operator appears in an expression, the order of evaluation depends on the rules of precedence. • A complete explanation of precedence can get complicated, but just to get you started: – Multiplication and division happen before addition and subtraction. So 2*3-1 yields 5. – If the operators have the same precedence they are evaluated from left to right. So 59*100/60 yields 98. – Any time you want to override the rules of precedence you can use parentheses. So 2*(3-1) yields 4. 10/17/2012 Think Java (TSG@ROLF) 37 Operators Operators Precedence Postfix expr++ expr-- Unary ++expr –expr +expr –expr ~ ! Multiplicative */% Additive +- Shift << >> >>> Relational < > <= >= instanceof Equality == != Bitwise AND & Bitwise exclusive OR ^ Bitwise inclusive OR | Operators Operators Precedence Logical AND && Logical OR || Tenary ?: Assignment = += -= *= /= %= &= ^= |= <<= >>= >>>= Operators for Strings • In general you cannot perform mathematical operations on Strings, even if the strings look like numbers. the following are illegal bob – 1 “Hello”/123 bob * “Hello” • For Strings, the + operator represents concatenation, which means joining up the two operands. So “Hello, “ + “world.” yields “Hello, world.” 10/17/2012 Think Java (TSG@ROLF) 40 Arithmetic operators + Addition (also used for String concatenation) x = 1 + 1; String helloWorld = “hello” + “world!”; - Subtraction x = 3 - 1; * Multiplication x = 2 * 1; / Division x = 4 / 2; % Remainder (Mode) x = 5 % 3; Unary operator + Unary plus x = +1; // x = x + 1; - Unary minus x = -1; // x = x – 1; ++ Increment (prefix or postfix) System.out.println(++x); // prefix System.out.println(x++); // postfix -- Decrement (prefix or postfix) System.out.println(--x); // prefix System.out.println(x--); // postfix ! Logical Complement boolean success = true; !success; Equality operator == Equal to if (x == y) System.out.println(“x == y”); != Not equal to if (x != y) System.out.println(“x != y”); Relational Operator > Greater than if (x > y) >= Greater than or equal to if (x >= y) < System.out.println(“x >= y”); Less than if (x < y) <= System.out.println(“x > y”); System.out.println(“x < y”); Less than or equal to if (x <= y) System.out.println(“x <= y”); Conditional operator && Conditional-AND if ((x == 1) && (y == 1) System.out.println(“x is 1 AND y is 1”); || Conditional-OR if ((x == 1) || (y == 1) System.out.println(“x is 1 OR y is 1”); ?: Tenary (shorthand for an if-then-else) int result = (x > y) ? x : y; • “Short-circuiting” behavior means that the second operand is evaluated only if needed. Bitwise Operator ~ Unary bitwise complement “00000000” “11111111” << >> Signed left or right shift x << 2; y >> 2; >>> Unsigned right shift (shifts a zero into the leftmost position) & ^ | Bitwise AND Bitwise exclusive OR Bitwise inclusive OR Composition • One of the most useful features of programming languages is their ability to take small building blocks and compose them. int percentage; percentage = (minute * 100) / 60; System.out.println(hour * 60 + minute); • WARNING: The left side of an assignment has to be a variable name, not an expression. 10/17/2012 Think Java (TSG@ROLF) 47 Summary & Exercises 10/17/2012 Think Java (TSG@ROLF) 48 Chapter 3: Void methods 10/17/2012 Think Java (TSG@ROLF) 49 Floating-point • in Java, the floating-point type is called double, which is short for “double-precision.” double pi; pi = 3.14159; • Initialization: a combined declaration and assignment double pi = 3.14159; • Java distinguishes the integer value 1 from the floating-point value 1.0. int x = 1.1; // illegal double y = 1; // legal, Java automatically converts double z = 1 / 3; //what’s the answer? 0.333333 or 0? 10/17/2012 Think Java (TSG@ROLF) 50 Converting from double to int • Java converts int to double automatically without losing information. • Going from a double to an int requires rounding off and rounding down. Java doesn’t coverts double to int automatically. • The simplest way to convert a floating-point value to an integer is to use a typecast. double pi = 3.14159; int x = (int)pi; 10/17/2012 Think Java (TSG@ROLF) 51 Math methods • Java provides functions (methods) that perform the most common math operations. double root = Math.sqrt(16.0); • Java methods can be composed, meaning that you use one expression as part of another. double x= Math.exp(Math.log(10.0)); // log base e 10/17/2012 Think Java (TSG@ROLF) 52 Adding new methods • Create your own method public static void NAME(LIST OF PARAMETERS) { STATEMENTS } public static void newLine() { System.out.println(“”); } public static void main(String[] args) { newLine(); newLine(); } • By convention, Java methods start with a lower case letter and use “camel caps”, jamming wordsTogetherLikeThis. 10/17/2012 Think Java (TSG@ROLF) 53 Parameters and arguments • Arguments: values that you provide when you invoke the method • Parameters: variables that store arguments public static void printTwice(String s) { // parameter System.out.println(s); System.out.println(s); } printTwice(“Don’t make me say this twice!.”); // argument String argument = “Never say never.”; printTwice(argument); // correct prinntTwice(17); // error 10/17/2012 Think Java (TSG@ROLF) 54 Methods with multiple parameters • Have to declare the type of every parameter public static void printTime(int hour, int minute) { System.out.print(hour); System.out.print(“:”); System.out.println(minute); } • Don’t declare the types of arguments int hour = 11; int minute = 59; printTime(int hour, int minute); // WRONG! printTime(hour, minute); // correct 10/17/2012 Think Java (TSG@ROLF) 55 Methods that return values • Some methods, like Math methods, return values • Other methods, like println and newLine, don’t return values • What happens if you invoke a method and you don’t do anything with the results? Math.sqrt(16.0); • What happens if you use a print method as part of any expression System.out.println(“boo!”) + 7? • Can we write methods that return values, or are we stuck with things like newLine and printTwice? int value = myMethod(1, 2); 10/17/2012 Think Java (TSG@ROLF) 56 Summary & Exercises 10/17/2012 Think Java (TSG@ROLF) 57 Debugging with Eclipse • Review Chapter 3 Exercise: ZoopExercise • Debugging with Eclipse • Demo 10/17/2012 Think Java (TSG@ROLF) 58 Chapter 15: Object-oriented programming 10/17/2012 Think Java (TSG@ROLF) 59 Object-oriented Concept • Encapsulation – Information hiding, the internal representation of an object is generally hidden from view outside of the object’s definition. • Inheritance – A way to reuse code of existing objects or to establish a subtype from an existing object. • Polymorphism – (in Greek means many forms) the ability to create a variable, a function, or an object that has more than one form. (Source: Wikipedia (http://en.wikipedia.org/wiki/Objectoriented_programming ) 10/17/2012 Think Java (TSG@ROLF) 60 Object-oriented programming • What is Object-oriented programming? – Object-oriented programming (OOP) is a programming paradigm using "objects" – usually instances of a class – consisting of data fields and methods together with their interactions – to design applications and computer programs. (Source: Wikipedia (http://en.wikipedia.org/wiki/Objectoriented_programming ) 10/17/2012 Think Java (TSG@ROLF) 61 Java programs • Java programs are object-oriented, which means that the focus is on objects and their interactions. – Objects often represent entities in the real world, e.g., Bicycle class – The majority of methods are object methods (like the methods you invoke on Strings) rather than class methods (like the Math methods). – Objects are isolated from each other by limiting the ways they interact, especially by preventing them from accessing instance variables without invoking methods. – Classes are organized in family trees where new classes extend existing classes, adding new methods and replacing others. 10/17/2012 Think Java (TSG@ROLF) 62 The class hierarchy • The “family tree” of classes is called the class hierarchy. • Object usually appears at the top, with all the “child” classes below. Object Grid Actor Bug BugGox 10/17/2012 Critter CrabCritter Flower Rock ChameleonCritter Think Java (TSG@ROLF) 63 The class hierarchy • In Java, all classes extend some other class. • The most basic class is called Object. – Contains no instance variables. – Provides the methods equals and toString, among others. • Any class that does not explicitly name a parent inherits from Object by default. 10/17/2012 Think Java (TSG@ROLF) 64 The toString method • Every object type has a method called toString that returns a string representation of the object. • When you print an object using print or println, Java invokes the object’s toString method. • The default version of toString returns a string that contains the type of the object and a unique identifier. Time t2 = new Time(11, 8, 3.14159); System.out.println(t2); //Time@80cc807 10/17/2012 Think Java (TSG@ROLF) 65 The toString method • When you define a new object type, you can override the default behavior by providing a new method with the behavior you want. MountainBike mtnBike = new MountainBike(10, 12, 10, 1); System.out.println(mtnBike); // org.techsamaritan.java.thinkjava.Chapter15.MountainBike@6bbc4459 public String toString() { return ("height = " + height + "; "); } System.out.println(mtnBike); // height = 10; 10/17/2012 Think Java (TSG@ROLF) 66 The equals method • Review two notions of equality – identity: two variables refer to the same object • The == operator tests identity. – equivalence: they have the same value • no operator tests equivalence because what “equivalence” means depends on the type of the objects. • Java classes provide equals methods that defines equivalence. 10/17/2012 Think Java (TSG@ROLF) 67 Classes and objects • A class is a blueprint or prototype from which objects are created. Class header Class body • An object is an instance of a class. • An object is a software bundle of related behavior (methods) and state (fields). • Ask yourself two questions: – What possible states (fields) can this object be in? – What possible behavior (methods) can this object perform? Naming Conventions http://en.wikipedia.org/wiki/Naming_convention_(programming)#Java Naming Conventions - Classes • Class names should be nouns in Upper CamelCase, with the first letter of every word capitalized. • Use whole words — avoid acronyms and abbreviations (unless the abbreviation is much more widely used than the long form, such as URL or HTML). class Bicycle { } Naming Conventions - Methods • Methods should be verbs in lower CamelCase; that is, with the first letter lowercase and the first letters of subsequent words in uppercase. public int getGear() { } Naming Conventions - Variables • Local variables, instance variables, and class variables are also written in lower CamelCase. • Variable names should not start with underscore (_) or dollar sign ($) characters, even though both are allowed. • Certain coding conventions state that underscores should be used to prefix all instance variables, for improved reading and program understanding. public int gear; Naming Conventions - Variables • Variable names should be short yet meaningful. • The choice of a variable name should be mnemonic — that is, designed to indicate to the casual observer the intent of its use. • The convention is to always begin the variable names with a letter, not "$" or "_“. • Subsequent characters may be letters, digits, dollar signs, or underscore characters. • The name must not be a keyword or reserved word. • One-character variable names should be avoided except for temporary "throwaway" variables. Common names for temporary variables are i, j, k, m, and n for integers; c, d, and e for characters. public int speed; Naming Conventions - Constants • Constants should be written in uppercase characters separated by underscores. Constant names may also contain digits if appropriate, but not as the first character. public final static int MAXIMUM_NUM_OF_SPEEDS = 10; Parent, super, or base class package org.techsamaritan.java.thinkjava public class Bicycle { // fields int cadence; ... // constructor public Bicycle(...) {...} // method declarations public void setCadence(int cadence) { this.cadence = cadence; } } Child class, subclass, or base class package org.techsamaritan.java.thinkjava public class MountainBike extends Bicycle implements YourInterface { // fields int seatHeight; // constructor public MountainBike(...) {...} // method declarations public void setHeight(int seatHeight) { this.seatHeight = seatHeight; } } // MountainBike mb = new MountainBike(...); Access Modifiers • Two levels of access control: At the top level: public, or package-private(no explicit modifier). At the member level: public, private, protected, or package-private(no explicit modifier). • public: accessible from all classes • private: accessible only within its own class • protected: accessible from within its own package and by a subclass of its class in another package Access Level Modifier Class Package Subclass World public Y Y Y Y protected Y Y Y N No modifier Y Y N N private Y N N N Choosing an Access Level • Use the most restrictive access level that makes sense for a particular member. • Use private unless you have a good reason not to. • Avoid public fields except for constants. • Public fields tend to link you to a particular implementation and limit your flexibility in changing your code. Inheritance • Inheritance is the ability to define a new class that is a modified version of an existing class. • The existing class is called the parent class and the new class is called the child. • Advantage: you can add methods and instance variables without modifying the parent. 10/17/2012 Think Java (TSG@ROLF) 80 Inheritance • An example of inheritance: public class MountainBike extends Bicycle implements YourInterface { // fields int seatHeight; // constructor public MountainBike(...) {...} // method declarations public void setHeight(int seatHeight) { this.seatHeight = seatHeight; } } 10/17/2012 Think Java (TSG@ROLF) 81 Inheritance • Inheritance is a powerful feature. • Some programs that would be complicated without it can be written concisely and simple with it. • Inheritance can facilitate code reuse, since you can customize the behavior of existing classes without having to modify them. 10/17/2012 Think Java (TSG@ROLF) 82 Object methods and class methods • Class methods are identified by the keyword static in the first line. • Any method that does not have the keyword static is an object method. • Whenever you invoke a method “on” an object, it’s an object method, String.charAt. • Anything that can be written as a class method can also be written as an object method, and vice versa. 10/17/2012 Think Java (TSG@ROLF) 83 Object methods and class methods • printCard as a class method public static void printCard(Card c) { System.out.println(“This card is “ + c.type); } • print as an object method public void print() { System.out.println(“This card is “ + type); } 10/17/2012 Think Java (TSG@ROLF) 84 Bicycle in action • Bicycle • MountainBike Interfaces • An interface is a contract between a class and the outside world. • When a class implements an interface, it promises to provide the behavior published by that interface. • An interface declaration consists of modifiers, the keyword interface, the interface name, a commaseparated list of parent interfaces (if any), and the interface body. Interfaces • Interface can contain only constants, method signatures, and nested types. There are no method bodies. • All methods declared in an interface are implicitly public. • All constants defined in an interface are implicitly public, static, and final. • Interface cannot be instantiated—they can only be implemented by classes or extended by other interfaces. Define Interface public interface Bicycle { // constant int MAX_GEARS = 20; // wheel revolutions per minute void changeGear(int newValue); void speedUp(int increment); void applyBrakes(int decrement); void changeCadence(int newValue); } Implements Interface public interface Bicycle { void changeGear(int newValue); } class MountainBike implements Bicycle { void changeGear(int newValue) gear = newValue; } Bicycle } Mountain Bike Road Bike Tandem Bike Rewriting Interfaces • Developed An Interface Public interface DoIt { void doSomething(int i); } • Want to Add A Method Public interface DoIt { void doSomething(int i); int doSomethingElse(String s); } • Add A Method Public interface DoItPlus extends DoIt { boolean doSomethingElse(String s); } Interfaces & Multiple Inheritance • The Java programming language does not permit multiple inheritance, but interfaces provide an alternative. • In Java, a class can inherit from only one class but it can implement more than one interface. Therefore, objects can have multiple types: the type of their own class and the types of all the interfaces that they implement. This means that if a variable is declared to be the type of an interface, its value can reference any object that is instantiated from any class that implements the interface. Multiple Interface public interface GroupedInterface extends Interface1, Interface2, Interface3 { // constant declarations // base of natural logarithms double E = 2.718282; // method signatures void doSomething (int i, double x); int doSomethingElse(String s); } Summary of Interfaces • A protocol of communication between two objects • Contains signatures and constant but not method implementation • A class implements an interface must implement all methods • An interface name can be used anywhere a type can be used What do you mean by static in Java? • When a number of objects are created from the same class blueprint, they each have their own distinct copies of instance (object) variables and instance (object) methods. 10/17/2012 Think Java (TSG@ROLF) 94 What do you mean by static in Java? (continued) • Sometimes, you want to have variables and methods that are common to all objects. • This is accomplished with the static modifier. • static fields or class variables • static methods or class methods • They are associated with the class, rather than with any object. • Every instance of the class shares a class variable, which is in one fixed location in memory. • Any object can change the value of a class variable. 10/17/2012 Think Java (TSG@ROLF) 95 What do you mean by static in Java? (continued) • The static keyword can be used in: • • • • 10/17/2012 static variables static methods Constants static blocks of code Think Java (TSG@ROLF) 96 static variable • Belongs to the class and not to object (instance) • Is initialized only once, at the start of the execution. • A single copy is shared by all instances of the class. • Is accessed directly by the class name and doesn’t need any object • ClassName.variableName • 10/17/2012 Bicycle.numberOfBicycles Think Java (TSG@ROLF) 97 static method • Belongs to the class and not to the object (instance) • Can access only static data. It can not access non-static data (instance variables) • Can call only other static methods and can not call a non-static method from it. • Can be accessed directly by the class name and doesn’t need any object. • Can not refer to “this” or “super” keywords in anyway. • ClassName.methodName(args) • Bicycle.getNumberOfBicycles() 10/17/2012 Think Java (TSG@ROLF) 98 Instance and class variables and methods • Instance methods can access instance variables and instance methods directly. • Instance methods can access class variables and class methods directly. • Class methods can access class variables and class methods directly. • Class methods cannot access instance variables or instance methods directly—they must use an object reference. • Class methods cannot use the this keyword as there is no instance for this to refer to. 10/17/2012 Think Java (TSG@ROLF) 99 Constants • The static modifier, in combination with the final modifier, is used to define constants. The final modifier indicates that the value of this field cannot change. • static final double PI = 3. 141592653589793; 10/17/2012 Think Java (TSG@ROLF) 100 static blocks of code • The static initialization block is a normal block of code enclosed in braces, {}, and preceded by the static keyword that will be executed when a class is first loaded into the JVM. static { // whatever code is needed for initialization goes here } 10/17/2012 Think Java (TSG@ROLF) 101 HelloWorld in C# • Java public class HelloWorld { public static void main(String[] args) { System.out.println(“Hello World!”); } } • C# using System; namespace HelloWorld { public class HelloWorld { public static void Main(string[] args) { Console.WriteLine(“Hello, world!”); } } } 10/17/2012 Think Java (TSG@ROLF) 102 Summary & Exercises 10/17/2012 Think Java (TSG@ROLF) 103 Chapter 4 Conditionals and recursion 10/17/2012 Think Java (TSG@ROLF) 104 The modulus operator • The modulus operator works on integers (and integer expression) and yields the remainder when the first operand is divided by the second. • In Java, the modulus operator is a percent sign, %. int quotient = 7 / 3; // 2 int remainder = 7 % 3; // 1 • The modulus operator turns out to be surprisingly useful. For example: – check whether one number is divisible by another, e.g., if x % y is zero, then x is divisible by y. – extract the rightmost digit or digits from a number, e.g., x % 10 yields the rightmost digit of x. 10/17/2012 Think Java (TSG@ROLF) 105 Conditional execution • Conditional statements: check conditions and change the behavior of the program accordingly. if (x > 0) { System.out.println(“x is positive”); } • Relational (comparison) operators: (== != > < >= <=) x == y; • = is the assignment operator and == is a comparison operator. 10/17/2012 Think Java (TSG@ROLF) 106 Alternative execution • Alternative execution: there are two possibilities, and the condition determines which one gets executed. • if-else public static void printParity(int x) { if (x%2 == 0) { System.out.println(“x is even”); } else { System.out.println(“x is odd”); } } 10/17/2012 Think Java (TSG@ROLF) 107 Chained conditions • Chaining: check a number of related conditions and choose one: if (x > 0) { System.out.println(“x is positive”); } else if (x < 0) { System.out.println(“x is negative”); } else { System.out.println(“x is zero”); } 10/17/2012 Think Java (TSG@ROLF) 108 Nested conditions • Nest one conditional within another: if (x == 0) { System.out.println(“x is zero”); } else { if (x > 0) { System.out.println(“x is positive”); } else { System.out.println(“x is negative”); } } 10/17/2012 Think Java (TSG@ROLF) 109 The return statement • To terminate the execution of method before you reach the end. public static void printLogarithm(double x) { if (x <= 0.0) { System.out.println(“Positive numbers only, please”); return; } double result = Math.log(x); System.out.println(“The log of x is ” + result); } 10/17/2012 Think Java (TSG@ROLF) 110 Type conversion • Whenever you try to “add” two expressions, – “The log of x is “ + result • if one of them is a String, Java converts the other to a String and then perform string concatenation. – 5 + pi • if one of them is floating-point, Java converts the other to a double and then perform addition. 10/17/2012 Think Java (TSG@ROLF) 111 Recursion • one method to invoke another • one method to invoke itself – recursion public static void countdown(int n) { if (n == 0) { System.out.println(“Blastoff!”); } else { System.out.println(n); countdown(n – 1); } } // countdown(3); 10/17/2012 Think Java (TSG@ROLF) 112 Summary & Exercises 10/17/2012 Think Java (TSG@ROLF) 113 Chapter 5: GridWorld: Part 1 10/17/2012 Think Java (TSG@ROLF) 114 GridWorld: Part 1 • AP Computer Science Case Study which is a grogram called GridWorld. – GridWorld Case Study • http://www.collegeboard.com/student/testing/ap/compsci_a/case.ht ml • Unpack the code – GridWorldCode folder – projects/firstProject/BugRunner.java – Instructions: http://www.collegeboard.com/prod_downloads/student/testin g/ap/compsci_a/ap07_gridworld_installation_guide.pdf • GridWorld Student Manual – http://www.collegeboard.com/prod_downloads/student/testin g/ap/compsci_a/ap07_gridworld_studmanual_appends_v3.pdf. 10/17/2012 Think Java (TSG@ROLF) 115 Vocabularies • The components of GridWorld, including Bugs, Rocks and the Grid itself, are objects. • A constructor is a special method that creates new objects. • A class is a set of object; every object belongs to a class. • An object is also called an instance because it is a member, or instance, of a class. • An attribute (variable or field) is a piece of information about an object, like its color or location. • An accessor method is a method that returns an attribute of an object. • A modifier method changes an attribute of an object. 10/17/2012 Think Java (TSG@ROLF) 116 Chapter 6: Value methods 10/17/2012 Think Java (TSG@ROLF) 117 Return values • Methods return results, e.g., Math functions double sqrt = Math.sqrt(16.0); • Methods return no value, void. countdown(3); • Value methods: methods return values public static double area(double radius) { double area = Math.PI * radius * radius; return area; } // area(10.0); 10/17/2012 Think Java (TSG@ROLF) 118 Overloading • Overloading: having more than one method with the same name but different parameters. • calculate a circle area with radius public static double area(double radius) { double area = Math.PI * radius * radius; return area; } • calculate a circle area with two points public static double area(double x1, double y1, double x2, double y2) { return area(distance(x1, y1, x2, y2)); } 10/17/2012 Think Java (TSG@ROLF) 119 Boolean expressions • Boolean: true and false boolean flag; flag = true; boolean testResult = false; • The result of a conditional operator is a boolean boolean evenFlag = (n%2 == 0); boolean positiveFlag = (x > 0); 10/17/2012 Think Java (TSG@ROLF) 120 Logical operators • AND (&&), OR (||), and NOT (!) x > 0 && x < 10 evenFlag || n%3 == 0 !evenFlag • Logical operators can simplify nested conditional statements. if (x > 0) { if (x < 10) { System.out.println(“x is a positive single digits.”); } } if (x > 0 && x < 10) { System.out.println(“x is a positive single digits.”); } 10/17/2012 Think Java (TSG@ROLF) 121 Boolean methods • Methods return boolean values public static boolean isSingleDigit(int x) { if (x >= 0 && x < 10) { return true; } else { return false; } } public static boolean isSingleDigit(int x) { return (x >= 0 && x < 10); } boolean bigFlag = !isSingleDigit(17); 10/17/2012 Think Java (TSG@ROLF) 122 More recursion • factorial function 0! = 1 n! = n . (n – 1)! // 3! = 3*2*1 public static int factorial(int n) { if (n == 0) { return 1; } else { int recurse = factorial(n-1); int result = n * recurse; return result; } } 10/17/2012 Think Java (TSG@ROLF) 123 Summary & Exercises 10/17/2012 Think Java (TSG@ROLF) 124 Chapter 7: Iteration and loops 10/17/2012 Think Java (TSG@ROLF) 125 if statement • The if statement tells your program to execute a certain section of code only if a particular test evaluates to true. if (testScore >= 90) { grade = ‘A’; } else if (testScore >= 80) { grade = ‘B’; } else { grade = ‘C’; } 10/17/2012 Think Java (TSG@ROLF) 126 switch statement • The switch value can be a byte, short, char, and int primitive data, enumerated, String class or special classes wrapped certain primitive (e.g. Character) switch (expression) { case 1: case 2: month(); break; default: noneOfTheAbove(); break } 10/17/2012 Think Java (TSG@ROLF) 127 while statement • Continually executes a block of statements while a particular condition is true. while (expression) { statement(s); } // public static void countdown(int n) { while (n > 0) { System.out.println(n); n = n-1; } System.out.println(“Blastoff!”); } 10/17/2012 Think Java (TSG@ROLF) 128 do-while statement • Continually executes a block of statements while a particular condition is true. do { statement(s); } while (expression); // public static void countdown(int n) { do { System.out.println(n); n = n-1; } while (n > 0) System.out.println(“Blastoff!”); } 10/17/2012 Think Java (TSG@ROLF) 129 for statement • Iterate through all of the elements of an array: for (int // // // } 10/17/2012 i = 0; i < array.length; i++) { within the loop, i is the index of the current member array[i] is the current element Think Java (TSG@ROLF) 130 for statement (continued) • Iterate through a range of values. for (int i = 0; i < 10; i++) { count += i; } • Iterate through Collections and arrays. int numbers = {0,1,2,3}; for (int item : numbers) { count += item; } for (Object obj: collection) { obj.method(); } 10/17/2012 Think Java (TSG@ROLF) 131 break statement • The break statement has two forms: labeled and unlabeled. loop: for (;;) { ... if (...) { break loop; } ... } 10/17/2012 Think Java (TSG@ROLF) 132 continue statement • The continue statement has two forms: labeled and unlabeled. loop: for (;;) { ... if (...) { continue loop; } ... } 10/17/2012 Think Java (TSG@ROLF) 133 return statement • The return statement has two forms: one that returns a value, and one that doesn’t. return expression; or return; 10/17/2012 Think Java (TSG@ROLF) 134 Summary & Exercises 10/17/2012 Think Java (TSG@ROLF) 135 Chapter 8: Strings and things 10/17/2012 Think Java (TSG@ROLF) 136 Characters • Java String is an object. • “What is the data contained in a Strings object?” • “What are the methods we can invoke on String object?” • The components of a String object are letters or characters (characters, numbers, symbols, other things.) • Java API document for String: http://docs.oracle.com/javase/7/docs/api/java/la ng/String.html 10/17/2012 Think Java (TSG@ROLF) 137 charAt • charAt extracts letters from a String String fruit = “banana”; char letter = fruit.charAt(1); System.out.println(letter); • zero-based char letter = fruit.charAt(0); 10/17/2012 Think Java (TSG@ROLF) 138 Length • Length returns the number of characters in the string. String fruit = “banana”; int strLength = fruit.length(); • To find the last letter of a string int strLength = fruit.length(); char lastChar = fruit.charAt(strLength – 1); 10/17/2012 Think Java (TSG@ROLF) 139 Traversal • Traversal: start at the beginning, do some thing with it, and continue until the end. int index = 0; while (index < fruit.length()) { char letter = fruit.charAt(index); System.out.println(letter); index = index + 1; } 10/17/2012 Think Java (TSG@ROLF) 140 Run-time errors • In Java run-time errors are called exceptions. • Java prints an error message with the type of exception and a stack trace, which shows the methods that were running when the exception occurred. public class BadString{ public static void main(String[] args) { processWord(“banana”); } public static void processWord(String s) { char c = getLastLetter(s); System.out.println(c); } public static char getLastLetter(String s) { int index = s.length(); char c = s.charAt(index); return c; } } • Java prints the stack trace and ends the program: Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 6 at java.lang.String.charAt(String.java:694) at BadString.getLastLetter(BadString.java:24) at BadString.processWord(BadString.java:18) at BadString.main(BadString.java:14) 10/17/2012 Think Java (TSG@ROLF) 141 The indexOf method • indexOf is the inverse of charAt – charAx takes an index and returns the character at the index String fruit = “banana”; char letter = fruit.charAt(1); – indexOf takes a character and finds the index where that character appears String fruit = “banana”; int index = fruit.indexOf(‘a’); 10/17/2012 Think Java (TSG@ROLF) 142 Looping and counting • Letter-counter: loops and counts the number of times the letter ‘a’ appears in a string. String fruit = "banana"; int length = fruit.length(); int count = 0; int index = 0; while (index < length) { if (fruit.charAt(index) == 'a') { count = count + 1; } index = index + 1; } System.out.println(count); 10/17/2012 Think Java (TSG@ROLF) 143 Increment and decrement operators • ++ operator adds one to the current value and -- operator subtracts one. System.out.println(i++); System.out.println(j--); • Rewrite the previous letter-counter while (index < length) { if (fruit.charAt(index) == 'a') { count = count + 1; } index = index + 1; } 10/17/2012 Think Java (TSG@ROLF) 144 Strings are immutable • Invoke toUpperCase or toLowerCase on a String, you get a new String as return value. String name = “Alan Turing”; String upperName = name.toUpperCase(); 10/17/2012 Think Java (TSG@ROLF) 145 Strings are incomparable • Can’t use == and > or < to compare strings • To compare Strings, we have to use the equals and compareTo methods. int flag = name1.compareTo(name2); int flag2 = name1.equals(name2); 10/17/2012 Think Java (TSG@ROLF) 146 Summary & Exercises 10/17/2012 Think Java (TSG@ROLF) 147 Chapter 9: Mutable objects 10/17/2012 Think Java (TSG@ROLF) 148 Mutable objects • Strings are objects – They are immutable. – They have no attributes. – You don’t have to use new to create one. • Two objects from Java libraries, Point and Rectangle. 10/17/2012 Think Java (TSG@ROLF) 149 Packages • Java libraries are divided into packages, e.g., java.lang • To use a class defined in another package, you have to import it. import java.awt.Point; import java.awt.Rectangle; • All import statements appear at the beginning of the program, outside of the class definition. import java.awt.Point; public class NewClass { … } 10/17/2012 Think Java (TSG@ROLF) 150 Point objects • A point is two numbers (coordinates); in Java, a point is represented by a Point object. Point blank; blank = new Point(3, 4); blank-> 10/17/2012 x 3 y 4 Think Java (TSG@ROLF) 151 Instance variables • The pieces of data that make up an object are called instance variables. boolean flag; flag = true; boolean testResult = false; • The result of a conditional operator is a boolean boolean evenFlag = (n%2 == 0); boolean positiveFlag = (x > 0); 10/17/2012 Think Java (TSG@ROLF) 152 Objects as parameters • Pass objects as parameters in the usual way public static void printPoint(Point p) { System.out.println(“(“ + p.x + “, “ + p.y + “)”); } public static double distance(Point p1, Point p2) { double dx = (double)(p2.x – p1.x); double dy = (double)(p2.y – p2.y); return Math.sqrt(dx*dx + dy*dy); } 10/17/2012 Think Java (TSG@ROLF) 153 Rectangles • Rectangles are similar to points, except that they have four instance variables: x, y, width, and height. Rectangle box = new Rectangle(0, 0, 100, 200); 10/17/2012 Think Java (TSG@ROLF) 154 Objects as return types • Methods can return objects public static Point findCenter(Rectangle box) { int x = box.x + box.width/2; int y = box.y + box.height/2; return new Point(x, y); } 10/17/2012 Think Java (TSG@ROLF) 155 Objects are mutable • You can change the contents of an object by making an assignment to one of its instance variables. public static void moveRect(Rectangle box, int dx, int dy) { box.x = box.x + dx; box.y = box.y + dy; } // Rectangle box = new Rectangle(0, 0, 100, 200); moveRect(box, 50, 100); 10/17/2012 Think Java (TSG@ROLF) 156 Aliasing • When you assign an object to a variable, you are assigning a reference to an object. • It’s possible to have multiple variables that refer to the same object. This is called aliasing. • Any changes that affect one variable also affect the other. Rectangle box1 = new Rectangle(0, 0, 100, 200); Rectangle box2 = box1; 10/17/2012 Think Java (TSG@ROLF) 157 null • null is a special value that means “no object.” • When you create an object variable, you are creating a reference to an object. • Until you make the variable point to an object, the value of the variable is null. • If you try to use a null object, either by accessing an instance variable or invoking a method, Java throws a NullPointException. Point blank = null; int x = blank.x; blank.translate(50, 50); 10/17/2012 Think Java (TSG@ROLF) 158 Garbage collection • What happens when no variable refers to an object? Point blank = new Point(3, 4); blank = null; • Periodically Java Garbage collector will delete the object and reclaim the resources/memory spaces. This is called garbage collection. 10/17/2012 Think Java (TSG@ROLF) 159 Objects and primitives • Two kinds of types in Java: primitive types and object types. • Primitives, like int and boolean begin with lower-case letters. – – – – Declaring a primitive variable, you get storage space. If you don’t initialize a primitive type, it is given a default value. Primitive variables are well isolated. You cannot add new primitives to Java. • Object types begin with upper-case letters. – Declaring an object variable, you get a space for a reference to an object. To get space for the object itself, you have to use new. – The default value for object types is null. – Pass a reference to an object as an assignment, the method you invoke might modify the object. – You can create new object types. 10/17/2012 Think Java (TSG@ROLF) 160 Summary & Exercises 10/17/2012 Think Java (TSG@ROLF) 161 Chapter 10: GridWorld: Part 2 10/17/2012 Think Java (TSG@ROLF) 162 GridWorld: Part 2 • Part 2 of the GridWorld case study. • You can find the documentation for the GridWorld classes at http://www.greenteapress.com/thinkapjava/j avadoc/gridworld/ 10/17/2012 Think Java (TSG@ROLF) 163 Chapter 11: Create your own objects 10/17/2012 Think Java (TSG@ROLF) 164 Class definitions and object types • Defining a new class also creates a new object type with the same name. • A class definition is like a template for objects. • Every object belongs to some object type. • When you invoke new to create an object, Java invokes a special method called constructor to initialize the instance variables. • The methods that operate on a type are defined in the class definition for that type. 10/17/2012 Think Java (TSG@ROLF) 165 Syntax issues about class definition • Class names (and hence object types) should begin with a capital letter, e.g., Time class • You usually put one class definition in each file, and the name of the file must be the same as the name of the class, with the suffix .java, e.g., Time class in Time.java • In any program, one class is designated as the startup class. The startup class must contain a method named main, which is where the execution of the program begins. 10/17/2012 Think Java (TSG@ROLF) 166 Time class • A common motivation for creating an object type is to encapsulate related data in an object that can be treated as a single unit. • For example, Time which represents the time of day, encapsulates the data of an hour, a minute, and second. class Time { int hour, minute; double second; } 10/17/2012 Think Java (TSG@ROLF) 167 Constructors • Constructors initialize instance variables. • The syntax for constructors is similar to that of other methods, with three exceptions: – The name of the constructor is the same as the name of the class. – Constructors have no return type and no return value. – The keyword static is omitted. public Time() this.hour = this.minute this.second } { 0; = 0; = 0.0; • The name this is a special keyword that refers to the object we are creating. this is created by the system. 10/17/2012 Think Java (TSG@ROLF) 168 More constructors • Constructors can be overloaded: multiple constructors with different parameters. • It is common to have one constructor that takes no arguments and one constructor that takes a parameter list identical to the list of instance variables. public Time(int hour, int minute, double second) { this.hour = hour; this.minute = minute; this.second = second; } 10/17/2012 Think Java (TSG@ROLF) 169 Creating a new object • You almost never invoke constructors directly. • When you invoke new, the system allocates space for the new object and then invokes your constructor. boolean flag; flag = true; boolean testResult = false; • The result of a conditional operator is a boolean boolean evenFlag = (n%2 == 0); boolean positiveFlag = (x > 0); 10/17/2012 Think Java (TSG@ROLF) 170 Initialize Time object class Time { int hour, minute; double second; public Time() { this.hour = 0; this.minute = 0; this.second = 0.0; } public Time(int hour, int minute, double second) { this.hour = hour; this.minute = minute; this.second = second; } 10/17/2012 Think Java (TSG@ROLF) 171 Initialize Time object public static void main(String[] args) { // one way to create and initialize a Time object Time t1 = new Time(); t1.hour = 11; t1.minute = 8; t1.second = 3.14159; System.out.println(t1); // another way to do the same thing Time t2 = new Time(11, 8, 3.14159); System.out.println(t2); } } 10/17/2012 Think Java (TSG@ROLF) 172 Operations on objects • Three kinds of methods that operate on objects – pure function – modifier – fill-in method 10/17/2012 Think Java (TSG@ROLF) 173 Pure functions • A method is considered a pure function if the result depends only on the arguments, and it has no side effects like modifying an argument or printing something. • The only result of invoking a pure function is the return value. public static boolean isAfter(Time time1, Time time2) { if (time1.hour > time2.hour) return true; … return false; } 10/17/2012 Think Java (TSG@ROLF) 174 Modifiers • Take objects as arguments and modifies some or all of them. Often returns void. public static void increment(Time time, double secs) { time.second += secs; if (time.second >= 60.0) { time.second -= 60.0; time.minute += 1; } … } 10/17/2012 Think Java (TSG@ROLF) 175 Fill-in method • One of the arguments is an “empty” object that gets filled in by the method. Technically, this is a type of modifier. public static void addTimeFill(Time t1, Time t2, Time sum) { sum.hour = t1.hour + t2.hour; sum.minute = t1.minute + t2.minute; sum.second = t1.second + t2.second; … } 10/17/2012 Think Java (TSG@ROLF) 176 Summary & Exercises 10/17/2012 Think Java (TSG@ROLF) 177 Chapter 12: Arrays 10/17/2012 Think Java (TSG@ROLF) 178 Arrays • An array is a set of values where each value is identified by an index. Until you initialize these variables, they are set to null. • All the values in an array have to have the same type. int[] count double[] values; • To create the array itself, use new. count = new int[4]; values = new double[size]; 10/17/2012 Think Java (TSG@ROLF) 179 Accessing elements • To store values in the array, use the [] operator. count[0] = 7; count[1] = count[0] * 2; count[2]++; • You can use any expression as an index, as long as it has type int. int i = 0; while (i < 4) { System.out.println(count[i]); i++; } 10/17/2012 Think Java (TSG@ROLF) 180 Copying arrays • When you copy an array variable, you are copying a reference to the array. • Any changes in either array will be reflected in the other. double[] a = new double [3]; double[] b = a; • Real copy: allocate a new array and copy double[] b = new double [3]; int i = 0; while (i < 4) { b[i] = a[i]; i++; } 10/17/2012 Think Java (TSG@ROLF) 181 Arrays and objects • In many ways, arrays behave like objects • When you declare an array variable, you get a reference to an array. • You have to use new to create the array itself. • When you pass an array as an argument, you pass a reference, which means that the invoked method can change the contents of the array. • The elements of an array are identified by indices, and the elements of an object have names. • The elements of an array have to be the same type. Objects can have instance variable with different types. 10/17/2012 Think Java (TSG@ROLF) 182 for loops • for loop general syntax looks like this: for (INITIALIZER; CONDITION; INCREMENTOR) { BODY } for (int i = 0; i < 4; i++) { System.out.println(count[i]); } • The for statement is equivalent to INITIALIZER; while (CONDITION) { BODY INCREMENTOR } 10/17/2012 Think Java (TSG@ROLF) 183 Array length • All arrays have one named instance variable: length. Array contains the length of the array (number of elements). for (int i = 0; i < a.length; i++) { b[i] = a[i]; } 10/17/2012 Think Java (TSG@ROLF) 184 Summary & Exercises 10/17/2012 Think Java (TSG@ROLF) 185 Chapter 13: Arrays of Objects 10/17/2012 Think Java (TSG@ROLF) 186 The Road Ahead • Outline of the steps to develop programs to work with playing cards • In Chapter 13 we’ll define a Card class and write methods that work with Cards and arrays of Cards. • In Chapter 14 we’ll create a Deck class and write methods that operate on Decks. • In Chapter 15 we’ll transform the Card and Deck classes into the object-oriented programming (OOP). • wikipedia.org’s Playing card: http://en.wikipedia.org/wiki/Playing_card. 10/17/2012 Think Java (TSG@ROLF) 187 Playing cards • There are 52 cards in a deck; each belongs to one of four suits and one of 13 ranks. • The suits are Spades, Hearts, Diamonds and Clubs (in descending order in Bridge). • The ranks are Ace, 2, 3, 4, 5, 6, 7, 8, 9 , 10, Jack, Queen and King. • We use integers to encode/map the ranks and suits. 10/17/2012 Think Java (TSG@ROLF) 188 Card objects • Mapping (encoding) suits – – – – Spades: 3 Hearts: 2 Diamonds: 1 Clubs: 0 • Mapping (encoding) ranks – Each of the numerical ranks maps to the corresponding integer – For face cards: • Jack: 11 • Queen: 12 • King: 13 10/17/2012 Think Java (TSG@ROLF) 189 Create a new Card class • The first step is to declare the instance variables and write constructors. class Card { int suit, rank; public Card() { this.suit = 0; this.rank = 0; } public Card(int suit, int rank) { this.suit = suit; this.rank = rank; } } // Card threeOfClubs = new Card(0, 3); 10/17/2012 Think Java (TSG@ROLF) 190 The printCard method • The second step is to write the standard methods that every object should have such as printCard. public static void printCard(Card c) { String[] suits = {“Clubs”, “Diamonds”, “Hearts”, “Spades”}; String[] ranks = {“narf”, “Ace”, “2”, “3”, “4”, “5”, “6”, “7”, “8”, “9”, “10”, “Jack”, “Queen”, “King”}; System.out.println(ranks[c.rank] + “ of “ + suits[c.suit]); } // Card card = new Card(1, 11); printCard(card); // Jack of Diamonds 10/17/2012 Think Java (TSG@ROLF) 191 The sameCard method • If two Cards are the same, does that mean they contain the same data (rank and suit), or they are actually the same Card object? • To see if two references refer to the same object, we use the == operator. Card card1 = new Card(1, 11); // Jack of Diamond Card card2 = card1; if (card1 == card2) { System.out.println(“card1 and card2 are identical.”); } 10/17/2012 Think Java (TSG@ROLF) 192 The sameCard method • References to the same object are identical. References to objects with same data are equivalent. • If references are identical, they are also equivalent, but if they are equivalent, they are not necessarily identical. • To check equivalent, it is common to write a method with a name like sameCard. public static boolean sameCard(Card c1, Card c2) { return(c1.suit == c2.suit && c1.rank == c2.rank); } 10/17/2012 Think Java (TSG@ROLF) 193 The compareCard method • For primitive types, the conditional operators compare values and determine when one is greater or less than another. • These operators (< and > and the others) don’t work for object types. • For Strings Java provides a compareTo method. For Cards we have to write our own, compareCard. • The set of playing cards is partially ordered, which means that sometimes we can compare cards and sometimes not. • Which is better, the 3 of Clubs or the 2 of Diamonds? 10/17/2012 Think Java (TSG@ROLF) 194 The compareCard method • To make cards comparable, we have to decide which is more important, rank or suit. The choice is arbitrary. public static int compareCard(Card c1, Card c2) { if (c1.suit > c2.suit) return 1; if (c1.suit < c2.suit) return -1; // the suits must be equal if (c1.rank > c2.rank) return 1; if (c1.rank < c2.rank) return -1; return 0; // the ranks must be equal } 10/17/2012 Think Java (TSG@ROLF) 195 Arrays of cards • You can define objects with arrays as instance variables; you can make arrays that contain arrays; you can define objects that contain objects, and so on. • Here is an array of 52 cards. The array contains references to objects; it does not contain the Card objects themselves. Card[] cards = new Card[52]; if (cards[0] == null) { System.out.println(“No cards yet!”); } card[0].rank; // NullPointerException 10/17/2012 Think Java (TSG@ROLF) 196 Populate the Card objects • The easiest way to populate the deck with Card objects is to write nested for loops: int index = 0; for (int suit = 0; suit <= 3; suit++) { for (int rank = 1; rank <= 13; rank++) { cards[index] = new Card(suit, rank); index++; } } 10/17/2012 Think Java (TSG@ROLF) 197 The printDeck method • When you work with arrays, it is convenient to have a method that prints the contents. print static void printDeck(Card[] cards) { for (int i = 0; i < cards.length; i++) { printCard(cards[i]); } } 10/17/2012 Think Java (TSG@ROLF) 198 Searching • findSearch searches an array of Cards to see whether it contains a certain card. – This method gives a chance to demonstrate two algorithms: linear search and bisection search. • Linear search: traverses the deck and compare each card to the one we are looking for. public static int findCard(Card[] cards, Card card) { for (int i = 0; i < cards.length; i++) { if (sameCard(cards[i], card) { return i; } } return -1; } 10/17/2012 Think Java (TSG@ROLF) 199 Searching • Bisection search: continually cuts the array in half searching only the half in which the card might be found. • The algorithm works similar to looking for a word in a dictionary: – The words are in alphabetical order in a dictionary. 1. Start in the middle somewhere. 2. Choose a word on the page and compare it to the word you are looking for. 3. If you find the word you are looking for, stop. 4. If the word you are looking for comes after the word on the page, flip to somewhere later in the dictionary and go to step 2. 5. If the word you are looking for comes before the word on the page, flip to somewhere earlier in the dictionary and go to step 2. 6. If your word comes between two adjacent words on the page, you can conclude that your word is not in the dictionary. 10/17/2012 Think Java (TSG@ROLF) 200 Bisection search • findBisect method implements the bisection search: 1. To search the array, choose an index between low and high (call it mid) and compare it to the card you are looking for. 2. If you found it, stop. 3. If the card at mid is higher than your card, search the rang from low to mid-1. 4. If the card at mid is lower than your card, search the rang from mid-1 to high. • In general, bisection search is much faster than a linear search (calling compareCard comparing 6 or 7 times to 52 times). 10/17/2012 Think Java (TSG@ROLF) 201 Bisection search public static int findBisect(Card[] cards, Card card, int low, int high) { System.out.println(low + “,“ + high); if (high < low) return -1; // base case int mid = (high + low) / 2; int comp = compareCard(cards[mid], card); if (comp == 0) { return mid; } else if (comp > 0) { return findBisect(cards, card, low, mid-1); } else { return findBisect(cards, card, mid+1, high); } } // Card card1 = new Card(1, 11); System.out.println(findBisect(cards, car1, 0, 51)); //card in the deck: 0,51; 0,24; 13,24; 19,24; 22,24; 23 //15 of Diamond: 0,51; 0,24; 13,24; 13,17; 13,14; 13,12; -1 10/17/2012 Think Java (TSG@ROLF) 202 Summary & Exercises 10/17/2012 Think Java (TSG@ROLF) 203 Chapter 14: Objects of Arrays 10/17/2012 Think Java (TSG@ROLF) 204 The Deck class • Create a Deck object that contains an array of Cards. class Deck { Card[] cards; public Deck(int n) { this.cards = new Card[n]; } public Deck() { this.cards = new Card[52]; int index = 0; for (int suit = 0; suit <= 3; suit++) { for (int rank = 1; rank <= 13; rank++) { cards[index] = new Card(suit, rank); index++; } } } } 10/17/2012 Think Java (TSG@ROLF) 205 The printDeck method • printDeck method prints the deck public static void printDeck(Deck deck) { for (int i = 0; i < deck.cards.length; i++) { Card.printCard(deck.cards[i]); } } 10/17/2012 Think Java (TSG@ROLF) 206 Shuffling • For most card games you need to be able to shuffle the deck; that is, put the cards in a random order. • The better shuffling algorithm is to traverse the deck one card at a time, and at each iteration choose two cards and swap them. • Here is pseudocode for shuffling: for (int i = 0; i < deck.cards.length; i++) { // choose a number between i and deck.cards.length-1 // swap the ith card and the randomly-chosen card } 10/17/2012 Think Java (TSG@ROLF) 207 Sorting • Put the deck in order. • We’ll use the algorithm called selection sort because it works by traversing the array repeatedly and selecting the lowest remaining card each time. • Here is pseudocode for selection sort: for (int i = 0; i < deck.cards.length; i++) { // find the lowest card at or to the right of i // swap the ith card and the lowest card } 10/17/2012 Think Java (TSG@ROLF) 208 Subdecks • How should we represent a hand or some other subset of a full deck? • We’ll represent a hand with a Deck object with fewer than 52 cards. public static Deck subdeck(Deck deck, int low, int high) { Deck sub = new Deck(high-low+1); for (int i = 0; i<sub.cards.length; i++) { sub.cards[i] = deck.cards[low+i]; } return sub; } 10/17/2012 Think Java (TSG@ROLF) 209 Shuffling and dealing • shuffleDeck takes a deck as an argument and shuffles it. Deck deck = new Deck(); shuffleDeck(deck); Deck hand1 = subdeck(deck, 0, 4); Deck hand2 = subdeck(deck, 5, 9); Deck pack = subdeck(deck, 10, 51); • How would you deal the cards? 10/17/2012 Think Java (TSG@ROLF) 210 Dealing cards • Should you give one card to each player in the round-robin style that is common in real card games? – The round-robin convention is intended to mitigate imperfect shuffling and make it more difficult for the dealer to cheat. – Neither of these is an issue for a computer. • The dangers of engineering metaphors: – Impose restrictions on computers that are unnecessary – Expect capabilities that are lacking 10/17/2012 Think Java (TSG@ROLF) 211 Mergesort • mergesort: if you have two subdecks, each of which has been sorted, it is easy (and fast) to merge them into a single, sorted deck. 1. Form two subdecks with about 10 cards each and sort them so that when they are face up the lowest cards are on top. Place both decks face up in front of you. 2. Compare the top card from each deck and choose the lower one. Flip it over and add it to the merged deck. 3. Repeat step two until one of the decks is empty. Then take the remaining cards and add them to the merged deck. 10/17/2012 Think Java (TSG@ROLF) 212 Merge sort • The pseudocode of merge public static Deck merge(Deck d1, Deck d2) { // create a new deck big enough for all the cards Deck result = new Deck(d1.cards.length + de.cards.length); // use the index i to keep track of where we are in // the first deck, and the index j for the second deck int i = 0; int j = 0; // the index k traverses the result deck for (int k =0; k < result.cards.length; k++) { // if d1 is empty, d2 wins; if d2 is empty, d1 wins; // otherwise, compare the two cards // add the winner to the new deck } return result; } 10/17/2012 Think Java (TSG@ROLF) 213 mergeSort • The pseudocode of mergeSort public static Deck mergeSort(Deck deck) { // if the deck is 0 or 1 cards, return it // // // // find the midpoint of the deck divide the deck into two subdecks sort the subdecks using sortDeck merge the two halves and return the result } 10/17/2012 Think Java (TSG@ROLF) 214 Class variables • Local variables are declared inside a method and they are created when a method is invoked and destroyed when the method ends. • Instance variables are declared in a class definition and they are created when you create an object and destroyed when the object is garbage collected. • Class variables are declared in a class definition and they are created when the program starts and survive until the program ends. – They are identified by the keyword static. – You can refer to a class variable from anywhere inside the class definition. – Class variables are often used to store constant values that are needed in several places. 10/17/2012 Think Java (TSG@ROLF) 215 Class variables • A version of Card where suits and ranks are class variables class Card { int suit, rank; static String[] suits = { "Clubs", "Diamonds", "Hearts", "Spades" }; static String[] ranks = { "narf", "Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King" }; public static void printCard(Card c) { System.out.println(ranks[c.rank] + " of " + suits[c.suit]); } } 10/17/2012 Think Java (TSG@ROLF) 216 Summary & Exercises 10/17/2012 Think Java (TSG@ROLF) 217 Chapter 16: GridWorld: Part 3 10/17/2012 Think Java (TSG@ROLF) 218 GridWorld: Part 3 • Part 3 of the GridWorld case study. • You can find the documentation for the GridWorld classes at http://www.greenteapress.com/thinkapjava/j avadoc/gridworld/ 10/17/2012 Think Java (TSG@ROLF) 219 Appendix A: Graphics 10/17/2012 Think Java (TSG@ROLF) 220 Java Graphics • See Appendix A. Graphics 10/17/2012 Think Java (TSG@ROLF) 221 Appendix B: Input and Output in Java 10/17/2012 Think Java (TSG@ROLF) 222 System objects • The System class provides methods and objects that get input from the keyboard, print text on the screen, and do file input and output (I/O). • System.out is the object that displays on the screen. System.out.println(“Hello, World!”); • System.in gets input from the keyboard. 10/17/2012 Think Java (TSG@ROLF) 223 Keyboard input • First, you have to use System.in to create a new InputStreamReader. InputStreamReader in = new InputStreamReader(System.in); • Then you use in to create new a new BufferedReader. BufferedReader keyboard = new BufferedReader(in); • Finally you can invoke readLine on keyboard, to take the input from the keyboard and convert it to a String. String input = keyboard.readLine(); • A method that throws an exception has to include it in the prototype, like this: public static void main(String[] args) throws IOException { // body of main } 10/17/2012 Think Java (TSG@ROLF) 224 File input • Read lines from a file and prints them import java.io.*; public class Words { public static void main(String[] args) throws FileNotFoundException, IOException { processFile(“words.txt”); } public static void processFile(String filename) throws FileNotFoundException, IOException { FileReader fileReader = new FileReader(filename); BufferedReader in = new BufferedReader(fileReader); while(true) { String s = in.readLine(); if (s == null) break; System.out.println(s); } } } • The same program looks like in Python: for word in open(‘words.txt’): print word 10/17/2012 Think Java (TSG@ROLF) 225 Catching exceptions • processFile can throw FileNotFoundException and IOException. • Since main calls processFile, it has to declare the same exception. • The alternative is to catch the exception with a try statement. public static void main(String[] args) { try { processFile("words.txt"); } catch (Exception ex) { System.out.println("That didn't work. Here's why:"); ex.printStackTrace(); } } 10/17/2012 Think Java (TSG@ROLF) 226 Appendix C: Program development 10/17/2012 Think Java (TSG@ROLF) 227 Strategies • The foundation of all strategies is incremental development, which goes like this: – Start with a working program that does something visible, like printing something. – Add a small number of lines of code at a time, and test the program after every change. – Repeat until the program does what it is supposed to do. • After every change, the program should produce some visible effect that tests the new code. This approach to programming can save a lot of time. • The challenge of incremental development is that it is not easy to figure out a path from the starting place to a complete and correct program. There are several strategies to choose from. 10/17/2012 Think Java (TSG@ROLF) 228 Strategies to choose from • Here are several strategies to choose from: • Encapsulation and generation: – If you don’t know yet how to divide the computation into methods, start writing code in main, then look for coherent chunks to encapsulate in a method, and generalize them appropriately. • Rapid prototyping: – If you know what method to write, but not know to write it, start with a rough draft that handles the simplest case, then test it with other cases, extending and correcting as you go. 10/17/2012 Think Java (TSG@ROLF) 229 Strategies to choose from (continued) • Bottom-up: – Start by writing simple methods, then assemble them into a solution. • Top-down: – Use pseudocode to design the structure of the computation and identify the methods you’ll need. – Then write the methods and replace the pseudocode with real code. • You might need some scaffolding: – for example, each class should have a toString method that lets you print the state of an object in humanreadable form 10/17/2012 Think Java (TSG@ROLF) 230 Failure modes • Non-incremental development – If you write more than a few lines of code without compiling and testing, you are asking for trouble. • Attachment to bad code – If you write more than a few lines of code without compiling and testing, you may not be able to debug it. Ever. • Random-walk programming – Some students make a change, run the program, get an error, make a change, run the program, etc…. – If you get an error message, take the time to read it. More generally, take time to think. • Compiler submission – Error messages are useful, but they are not always right. – e.g. if the message says, “Semi-colon expected on line 13”… 10/17/2012 Think Java (TSG@ROLF) 231 Appendix D: Debugging 10/17/2012 Think Java (TSG@ROLF) 232 Debugging strategy • The best kind of debugging is the kind you don’t have to do because you avoid making errors in the first place. • The best debugging strategy depends on what kind of error you have: • Syntax errors are produced by the compiler and indicate that there is something wrong with the syntax of the program. Example: omitting the semi-colon at the end of a statement. • Exceptions are produced if something goes wrong while the program is running. Example: an infinite recursion eventually causes a StackOverflowException. • Logic errors cause the program to do the wrong thing. Example: an expression may not be evaluated in the order you expect, yielding an unexpected result. 10/17/2012 Think Java (TSG@ROLF) 233 Syntax errors • The compiler is spewing error messages. – Only fix one error at a time, and then recompile the program. • I’m getting a weird compiler message and it won’t go away. – Read the error message carefully. – Take a breath and look more broadly at the entire program. • More syntax errors… 10/17/2012 Think Java (TSG@ROLF) 234 Run-time errors • My program hangs. – Infinite loop: add a print statement immediately before and after the loop. • When I run the program I get an Exception. – Java prints a message that includes the name of the exception, the line of the program where the problem occurred, and a stack trace. – The first step is to examine the place in the program where the error occurred and see if you can figure out what happened. • More run-time errors… 10/17/2012 Think Java (TSG@ROLF) 235 Logic errors • Logic errors are hard to find because the compiler and the run-time system provide no information about what is wrong. • My program doesn’t work. – The first step is to make a connection between the code and the behavior you get. – You need a hypothesis about what the program is actually doing. • Is there something the program was supposed to do, but doesn’t seem to be happening? • Is something happening that shouldn’t? • I’ve got a big hairy expression and it doesn’t do what I expect. – It is often a good idea to break a complex expression into a series of assignments to temporary variables. • More logic errors… 10/17/2012 Think Java (TSG@ROLF) 236 Thank You! 10/17/2012 Think Java (TSG@ROLF) 237 Think Java: Java Programming Language Part 1 Chia James Chang cjameschang@yahoo.com Materials are based on: Professor Allen B. Downey’s “Think Java: How to Think Like a Computer Scientist” 10/17/2012 Think Java (TSG@ROLF) 238