Java intro Part 2 1 Access control in Java classes • Public members: accessible to any code that can access the class • Private members: accessible only within the class (no friend functions!) • Protected members: accessible by code in: – Same package – Subclass as inherited member – Used more often than private because it allows extensibility 2 Object creation • A variable of a class type is simply a reference to an object • A declaration is just a declaration, NOT a call to the object’s constructor • To call the constructor, invoke operator new – Allocates dynamic memory for objects – All objects are dynamic objects 3 Constructors in Java • • • • Method with same name as class Performs initializations of object members Has no return type May be overloaded – Can have multiple constructors – But no such thing as default arguments 4 Assignment in Java • For primitive data types, works in familiar manner: – variable represents memory location sized to hold specific data type – value is stored in memory location via assignment operator – example: int x; // allocates 4 bytes of memory x = 5; // stores value 0000 0000 0000 0101 5 Assignment in Java • For objects, variables represent locations that can hold references; Java’s oh-so-gentle way of saying “pointers” • An object reference is created when a constructor is called using the new operator • A variable of the object type stores the reference 6 Objects & assignment • Because variables hold references to objects, and not actual objects, two variables can refer to the same object, as in the example below: Greeter worldGreeter = new Greeter (“world”); Greeter anotherGreeter = worldGreeter; 7 Example continued // worldGreeter and anotherGreeter both store references to // the same object anotherGreeter.setName(“Cate”); // changes the String variable as referenced by both worldGreeter // and anotherGreeter; thus: String s = worldGreeter.sayHello(); System.out.println(s); // prints Hello Cate! instead of Hello world! 8 Copying an object • If it is not your intention to have two variables referencing the same object (it rarely is), can create a copy of an object to store in a second variable using the clone() method • Method is available for all library classes; we will see later how to define it for our own classes 9 clone() method • Returns generic data type Object • Use explicit casting to create reference to desired type • Example: Date aDate = new Date(); // stores reference to current date & time Date anotherDate = (Date)aDate.clone(); // creates new Object, casts as Date & assigns 10 Null references • Because all object variables contain object references, can assign value null to any object variable • This is useful because null is a value that can be tested; should assign null to any variable that doesn’t immediately have an object reference assigned to it 11 Pointers & Java • You may have heard that Java doesn’t use pointers; this is only true in the sense that Java doesn’t use pointers you have to deal with directly – all object variables contain references - they are, in fact, pointers – you can’t create invalid pointers – Java uses automatic garbage collection - you don’t have to worry about reclaiming memory 12 Parameter passing in Java • We can describe two types of parameters in a Java method: – implicit parameter: calling object – explicit parameter: argument passed to method; explicitly defined in method’s parameter list • When necessary, can refer to the implicit parameter using the keyword this 13 Parameter passing in Java • Primitive type arguments (int, double, char, etc.) are passed by value • Objects are passed by reference (since all object variables hold references), but methods can’t change parameter values - basically, it’s pass by const reference • Method can change the state of the calling object (implicit parameter) but not the received object (explicit parameter) 14 Basic Error Handling • Error messages can be sent to System.err (analogous to cerr) instead of System.out example: System.err.println (“Invalid input”); • Still prints to screen, in most cases - can be useful in situations where errors go somewhere else, like a printing terminal 15 Ending a program prematurely • If a program must be aborted because of an input error, can use System.exit(#) (where # represents an integer) • exit is analogous to C++ return statement • System.exit(0) means everything was OK, any other number represents error status 16 Exception Handling • Exception: a run-time event that disrupts program execution • Examples: – file that can’t be opened – input data inappropriate to variable type • Java forces programmer to deal with many such situations ahead of time 17 Exception Handling • Many standard methods, particularly those that perform I/O, are declared to “throw exceptions” • Compiler won’t recognize client methods that don’t handle such exceptions 18 Examples of Exceptions • NullPointerException: attempting to call a method on a null reference • IllegalArgumentException: indicates that data value passed to a method is outside the bounds of its domain; can be used to enforce preconditions • IOException: may occur when attempting to read or write data; for example, attempt to read data of wrong type into a variable 19 Unchecked exceptions • An unchecked exception is one that the compiler doesn’t force the programmer to handle; a NullPointerException is this type of exception – an unchecked exception can cause your program to halt with a runtime error – generally, unchecked exceptions are caused by conditions under the programmer’s control; in other words, errors you could have prevented 20 Checked exceptions • Checked exceptions are caused by external conditions beyond the programmer’s control; for example, I/O exceptions • The compiler insists that the programmer acknowledge such exceptions by providing exception-handling code 21 Exception Handling • Any method that might throw an exception must be invoked in one of two ways: – within a method that announces its propensity to throw the same type of exception: public static void main(String [] args) throws IOException public void read (String filename) throws IOException, ClassNotFoundException – within a method containing a try/catch block described later 22 Exception handling • The method just described lets the exception pass through to a method higher on the chain of method calls • The second method traps the (potential) exception object in your method and treats the error appropriately • Catching exceptions means surrounding the error-prone code with a try block followed by one or more catch clauses 23 General form of try/catch block try { // code that might throw an exception } catch (ExceptionType e) { // code that handles specific exception - can have as many // catch blocks as needed to catch all pertinent exceptions } finally { // optional clause: executes regardless of whether or not // an exception was thrown in try block } 24 Notes on exception handling syntax • The exception mechanism deals with an object, which is an instance of class Throwable (defined in java.lang.*) or one of its subclasses • So catch block looks like a method declaration with a single parameter, the Throwable object 25 Throwable objects • Often contains useful information about exceptions - examples: – name of file that couldn’t be opened – value of illegal array index • Several methods are defined in Throwable class, including .getMessage(), which returns generic message associated with type of exception caught 26 Strings in Java • String is a built-in class (not a simple type) • Sequence of Unicode characters • String methods include: – length: returns number of character in String String name = “Cate Sheller”; int letters = name.length(); – charAt():returns character at specific index value char first = name.charAt(0); 27 Strings in Java • A String variable can hold reference to any String object – so can assign a different reference to same variable: name = “George W. Bush”; – But String object itself is read-only; can’t change first letter of George’s name to Q, for example – it’s NOT an array of char – String buffer class exists which does allow for this kind of manipulation 28 Strings & Assignment • Can assign reference to String to any String variable (as previously noted) • To copy String object use: String name = “Donald Duck”; String name2 = new String(name); 29 Strings & Logical Comparison • Operator == works as it does with pointers in C++: tests to see if 2 variables reference same object • Member method .equals can be used to test contents of 2 strings: if (name2.equals(name)) 30 Strings & Logical Comparison • Member method .compareTo is more general comparison operator: – Returns positive value if calling object is greater than argument – Returns 0 if caller equals argument – Returns negative value if caller is less than argument – Example: if (name2.compareTo(name) > 0) 31 Substrings • The substring method of the String class returns the string described by two arguments: – first argument is position of the first character in the substring – second argument is position of the first character NOT to include in the substring – difference is the length of the substring 32 Substrings • The java.util package includes the StringTokenizer class, which can be used to extract substrings separated by delimiters • A StringTokenizer object is created using two arguments: the string to be broken down, and the delimiting character (space if not specified): String colors = “Red&White&Blue”; StringTokenizer breakup = new StringTokenizer(colors, “&”); 33 StringTokenizer • Once a StringTokenizer is created, can be used to access individual substrings in a sequential fashion • Example: while (breakup.hasMoreTokens()) { String theColor = breakup.nextToken(); … } 34 String Concatenation & Displaying Objects • The + operator concatenates strings with objects of other simple types • For implicit type conversion, can concatenate with an empty string • Since print() and println() work on Strings, the concatenation operation makes output of other types possible 35 String Concatenation & Displaying Objects • For newly-defined data type, can create a toString method which allows output using print or println • For example, the method on the following slide could be used for a Fraction class, with numerator and denominator represented by integer variables n and d 36 toString example public String toString() { return (“” + n + ‘/’ + d); } 37 Converting from String to numeric type • To convert from a String to a primitive numeric type, use the wrapper classes Integer and Double and their parsing methods, parseInt() and parseDouble() • For example: int n; String number = “52402”; n = Integer.parseInt(number); • The parsing methods will throw the unchecked NumberFormatException if the String argument doesn’t contain a number 38 I/O in Java • Java I/O stream library provides System.in, System.out and System.err • To do file I/O, need to declare – FileInputStream object for input – FileOutputStream object for output • No “open” command - use new instead: FileInputStream infile = new FileInputStream(“source.txt”); • No need for “close” - another example of automatic garbage collection 39 Character I/O • Like C++, Java uses streamed I/O • Standard input is represented by System.in (analogous to cin) • System.in.read( ) returns byte as an int: closest analog is cin.get(c) - ASCII input, in other words 40 System.out • Represents stdout • String data can be printed using System.out.print and System.out.println – can print most primitive types, as they can be converted to String – System.out.write prints byte (ASCII character) data 41 Code example import java.io.* class Uppercase { public static void main (String [] args) throws IOException { int x; System.out.println(“Enter text to be converted”); System.out.println (“to uppercase. Hit Ctrl-Z to end”); while ((x = System.in.read()) != -1) { x = Character.toUpperCase((char)x); System.out.write(x); } } } 42 Notes on example • The two lines inside the loop: x = Character.toUppercase((char)x); System.out.write(x); • Form the nucleus of the function: – Character is a class name, and toUppercase is a method defined in that class – the toUppercase method works on char (Unicode) data, so x, which is an int, is cast as char for function to work on it – the write method works on byte (ASCII) data 43 Console char input • As previously noted, System.in.read() reads byte data, not char • To read characters from the console, use System.in to create an InputStreamReader object: InputStreamReader reader = new InputStreamReader(System.in); • To read Strings, create a BufferedReader object from the InputStreamReader, then invoke the readLine() method: BufferedReader kbd = new BufferedReader(reader); String myString = kbd.readLine(); 44 GUI input • A simpler way to read input is via an input dialog box; you can create one by invoking the showInputDialog method of JOptionPane class, which is found in the javax.swing package: String input = JOptionPane.showInputDialog(“Enter a number:”); if (input != null) num = Integer.parseInt(input); // reads a number by extracting it from returned String 45 GUI output • Can also create dialog box for output using showMessageDialog method: JOptionPane.showMessageDialog (null, “Hey!”); // first parameter indicates no parent window // second parameter is message displayed 46 Java intro Part 2 47