You are on page 1of 10

Note that integer division by 0 raises an exception, whereas floating-point divi sion by 0 yields an infinite or NaN result ------------------------------------------------------------------------There

are also >> and << operators, which shift a bit pattern to the right or le ft. These operators are often convenient when you need to build up bit patterns to do bit masking: int fourthBitFromRight = (n & (1 << 3)) >> 3; Finally, a >>> operator fills the top bits with zero, whereas >> extends the sig n bit into the top bits. There is no <<< operator.' ------------------------------------------------------------------------For example, because && has a higher precedence than ||, the expression a && b || c means (a && b) || c Because += associates right to left, the expression a += b += c means a += (b += c) That is, the value of b += c (which is the value of b after the addition) is add ed to a. ---------------------------In C++, it is possible to redefine a variable inside a nested block. The inner d efinition then shadows the outer one. This can be a source of programming errors; hence, Java does not allow it. ---------------------------------The case labels must be integers or enumerated constants. You cannot test string s. For example, the following is an error: String input = . . .; switch (input) // ERROR { case "A": // ERROR . . . break; . . . } -------------------------Finally, there is a continue statement that, like the break statement, breaks th e regular flow of control. The continue statement transfers control to the header of the innerm ost enclosing loop. Scanner in = new Scanner(; while (sum < goal) { System.out.print("Enter a number: "); n = in.nextInt();

if (n < 0) continue; sum += n; // not executed if n < 0 } If n < 0, then the continue statement jumps immediately to the loop header, skip ping the remainder of the current iteration. ----------------To print out a quick and dirty list of the elements of a two-dimensional array, call System.out.println(Arrays.deepToString(a)); ----------------------------------To construct a Date object, you combine the constructor with the new operator, as follows: new Date() This expression constructs a new object. The object is initialized to the curren t date and time. --------------You may find it surprising that the second choice works even though the Employee .java file is never explicitly compiled. However, when the Java compiler sees the Empl oyee class being used inside, it will look for a file named Employe e.class. If it does not find that file, it automatically searches for and then co mpiles it. Even more is true: if the time stamp of the version of that it fin ds is newer than that of the existing Employee.class file, the Java compiler will automatica lly recompile the file. ---------------------------Date d = harry.getHireDay(); double tenYearsInMilliSeconds = 10 * 365.25 * 24 * 60 * 60 * 1000; d.setTime(d.getTime() - (long) tenYearsInMilliSeconds); // let's give Harry ten years added seniority The reason is subtle. Both d and harry.hireDay refer to the same object (see Fig ure 4 5). Applying mutator methods to d automatically changes the private state of the emp loyee object! If you need to return a reference to a mutable object, you should clone it first . A clone is an exact copy of an object that is stored in a new location. We discuss cloning in detail in Chapter 6. Here is the corrected code: class Employee { . . . public Date getHireDay() { return (Date) hireDay.clone(); } . . .

} As a rule of thumb, always use clone whenever you need to return a copy of a mut able data field. ----------------------In Java, arrays of subclass references can be converted to arrays of superclass references without a cast. For example, consider this array of managers: Manager[] managers = new Manager[10]; It is legal to convert this array to an Employee[] array: Employee[] staff = managers; // OK Sure, why not, you may think. After all, if manager[i] is a Manager, it is also an Employee. But actually, something surprising is going on. Keep in mind that managers and staff are references to the same array. Now consider the statement staff[0] = new Employee("Harry Hacker", ...); The compiler will cheerfully allow this assignment. But staff[0] and manager[0] are the same reference, so it looks as if we managed to smuggle a mere employee into the mana gement ranks. That would be very bad calling managers[0].setBonus(1000) would try to acce ss a nonexistent instance field and would corrupt neighboring memory. To make sure no such corruption can occur, all arrays remember the element type with which they were created, and they monitor that only compatible references are st ored into them. For example, the array created as new Manager[10] remembers that it is an array of managers. Attempting to store an Employee reference causes an ArrayStoreExceptio n. ----------------------------------------------The toString method is a great tool for logging. Many classes in the standard cl ass library define the toString method so that you can get useful information about the stat e of an object. -------------------------The ArrayList class is similar to an array, but it automatically adjusts its cap acity as you add and remove elements, without your needing to write any code. Instead of using the pleasant [] syntax to access or change the element of an ar ray, you use the get and set methods. For example, to set the ith element, you use staff.set(i, harry); This is equivalent to a[i] = harry; for an array a. To get an array list element, use Employee e = staff.get(i); This is equivalent to Employee e = a[i]; Sometimes, you need to add elements in the middle of an array list. Use the add method with an index parameter:

int n = staff.size() / 2; staff.add(n, e); Similarly, you can remove an element from the middle of an array list: Employee e = staff.remove(n); The elements located above it are copied down, and the size of the array is redu ced by one. Inserting and removing elements is not terribly efficient. It is probably not wo rth worrying about for small array lists. But if you store many elements and frequently inser t and remove in the middle of a collection, consider using a linked list instead. As of Java SE 5.0, you can use the for each loop to traverse the contents of an ar ray list: for (Employee e : staff) do something with e This loop has the same effect as for (int i = 0; i < staff.size(); i++) { Employee e = staff.get(i); do something with e } Listing 5 4 is a modification of the EmployeeTest program of Chapter 4. The Employ ee[] array is replaced by an ArrayList<Employee>. Note the following changes: You don t have to specify the array size. You use add to add as many elements as you like. You use size() instead of length to count the number of elements. You use a.get(i) instead of a[i] to access an element. void set(int index, T obj) puts a value in the array list at the specified index, overwriting the previous contents. T get(int index) gets the value stored at a specified index. void add(int index, T obj) shifts up elements to insert an element. T remove(int index) removes an element and shifts down all elements above it. The removed element is returned. Compatibility between Typed and Raw Array Lists When you write new code with Java SE 5.0 and beyond, you should use type paramet ers, such as ArrayList<Employee>, for array lists. However, you may need to interoper ate with existing code that uses the raw ArrayList type. Suppose that you have the following legacy class: public class EmployeeDB { public void update(ArrayList list) { ... } public ArrayList find(String query) { ... } } You can pass a typed array list to the update method without any casts. ArrayList<Employee> staff = ...; employeeDB.update(staff); The staff object is simply passed to the update method. CAUTION: Even though you get no error or warning from the compiler, this call is not completely safe. The update method might add elements into the array list that are not of t ype

Employee. When these elements are retrieved, an exception occurs. This sounds sc ary, but if you think about it, the behavior is simply as it was before Java SE 5.0. The int egrity of the virtual machine is never jeopardized. In this situation, you do not lose securit y, but you also do not benefit from the compile-time checks. java.util.ArrayList<T> 1.2 Parameters: index the position (must be between 0 and size() - 1) obj the new value Parameters: index the index of the element to get (must be between 0 and size() - 1) Parameters: index the insertion position (must be between 0 and size()) obj the new element Parameters: index the position of the element to be removed (must be between 0 and size() - 1) ---------------------------------------------------------------------In most cases, you get the illusion that the primitive types and their wrappers are one and the same. There is just one point in which they differ considerably: identit y. As you know, the == operator, applied to wrapper objects, only tests whether the object s have identical memory locations. The following comparison would therefore probably fa il: Integer a = 1000; Integer b = 1000; if (a == b) ... However, a Java implementation may, if it chooses, wrap commonly occurring value s into identical objects, and thus the comparison might succeed. This ambiguity is not what you want. The remedy is to call the equals method when comparing wrapper objects. ----------------------------------------public static void triple(int x) // won't work { x = 3 * x; // modifies local variable } Could we overcome this by using an Integer instead of an int? public static void triple(Integer x) // won't work { ... } The problem is that Integer objects are immutable: the information contained ins ide the wrapper can t change. You cannot use these wrapper classes to create a method that modifies numeric parameters If you do want to write a method to change numeric parameters, you can use one o f the holder types defined in the org.omg.CORBA package. There are types IntHolder, Bo oleanHolder, and so on. Each holder type has a public (!) field value through which you can a ccess the

stored value. public static void triple(IntHolder x) { x.value = 3 * x.value; } ----------------A program that can analyze the capabilities of classes is called reflective. The reflection mechanism is extremely powerful. As the next sections show, you can use it to Analyze the capabilities of classes at runtime; Inspect objects at runtime, for example, to write a single toString method that works for all classes; Implement generic array manipulation code; and Take advantage of Method objects that work just like function pointers in langua ges such as C++. ----------------Using a combination of forName and newInstance lets you create an object from a class name stored in a string. String s = "java.util.Date"; Object m = Class.forName(s).newInstance(); -----------------------The three classes Field, Method, and Constructor in the java.lang.reflect packag e describe the fields, methods, and constructors of a class, respectively. All three classes ha ve a method called getName that returns the name of the item. The Field class has a m ethod getType that returns an object, again of type Class, that describes the field ty pe. The Method and Constructor classes have methods to report the types of the parameters, and the Method class also reports the return type. All three of these classes also have a method called getModifiers that returns an integer, with various bits turned on and off , that describes the modifiers used, such as public and static. You can then use the st atic methods in the Modifier class in the java.lang.reflect package to analyze the in teger that getModifiers returns. Use methods like isPublic, isPrivate, or isFinal in the Mo difier class to tell whether a method or constructor was public, private, or final. All you have to do is have the appropriate method in the Modifier class work on the integer that getMo difiers returns. You can also use the Modifier.toString method to print the modifiers. The getFields, getMethods, and getConstructors methods of the Class class return arrays of the public fields, methods, and constructors that the class supports. This includes public members of superclasses. The getDeclaredFields, getDeclaredMethods, and getDecla

redConstructors methods of the Class class return arrays consisting of all fields, methods, and constructors that are declared in the class. This includes private and protected members, but not members of superclasses. ---------------------------------------Inner classes are useful when you design collections of cooperating classes. In particular, inner classes enable you to write concise, p rofessionallooking code to handle GUI events. --------------------------------------According to the language standard: The implementor must ensure sgn(x.compareTo(y)) = sgn(y.compareTo(x)) for all x and y. (This implies that x.c ompareTo( y) must throw an exception if y.compareTo(x) throws an exception.) Here, sgn is the sign of a number: sgn(n) is 1 if n is negative, 0 if n equals 0, and 1 if n is positive. In plain English, if you flip the parameters of compareTo, the sign (but not nec essarily the actual value) of the result must also flip. As with the equals method, problems can arise when inheritance comes into play. Because Manager extends Employee, it implements Comparable<Employee> and not Com parable< Manager>. If Manager chooses to override compareTo, it must be prepared to compa re managers to employees. It can t simply cast the employee to a manager: class Manager extends Employee { public int compareTo(Employee other) { Manager otherManager = (Manager) other; // NO ... } ... } That violates the antisymmetry rule. If x is an Employee and y is a Manager, then the call x.compareTo(y) doesn t throw an exception it simply compares x and y as employees. B ut the reverse, y.compareTo(x), throws a ClassCastException. This is the same situation as with the equals method that we discussed in Chapte r 5, and the remedy is the same. There are two distinct scenarios. If subclasses have different notions of comparison, then you should outlaw compa rison of objects that belong to different classes. Each compareTo method should start out with the test if (getClass() != other.getClass()) throw new ClassCastException(); If there is a common algorithm for comparing subclass objects, simply provide a single compareTo method in the superclass and declare it as final. For example, suppose that you want managers to be better than regular employees, regardless of the salary. What about other subclasses such as Executive and Secretary? If y ou need

to establish a pecking order, supply a method such as rank in the Employee class . Have each subclass override rank, and implement a single compareTo method that takes the r ank values into account. ----------------------------------------------------------Why caNT WE HAVE eery interface as abstarct calss: There is, unfortunately, a major problem with using an abstract base class to ex press a generic property. A class can only extend a single class. Suppose that the Emplo yee class already extends a different class, say, Person. Then it can t extend a second clas s. class Employee extends Person, Comparable // ERROR But each class can implement as many interfaces as it likes: class Employee extends Person implements Comparable // OK Other programming languages, in particular C++, allow a class to have more than one superclass. This feature is called multiple inheritance. The designers of Java c hose not to support multiple inheritance, because it makes the language either very complex (as in C++) or less efficient (as in Eiffel). Instead, interfaces afford most of the benefits of multiple inheritance while av oiding the complexities and inefficiencies. ----------------------------------------------------------However, unlike the inner classes that we used in previous examples, we do not w ant to have a reference to any other object inside a Pair object. That reference can be suppressed by declaring the inner class static ------------------------------------------------------In particular, programs in the sandbox have the following restrictions: They can never run any local executable program. They cannot read from or write to the local computer s file system. They cannot find out any information about the local computer, except for the Ja va version used and a few harmless operating system details. In particular, code in the sandbox cannot find out the user s name, e-mail address, and so on. Remotely loaded programs cannot communicate with any host other than the server from which they were downloaded; that server is called the originating host. Thi s rule is often called remote code can only phone home. The rule protects users from code that might try to spy on intranet resources. (As of Java SE 6, a Java Web Start application can make other network connections, but the program user must consent.) All pop-up windows carry a warning message.This message is a security feature to ensure that users do not mistake the window for a local application. The fear is that an unsuspecting user could visit a web page, be tricked into running remote code

, and then type in a password or credit card number, which can be sent back to the web server. In early versions of the JDK, that message was very ominous: Untrusted Java Applet Window . Every successive version watered down the warning a bit Unauthenticated Java Applet Window , then Warning: Java Applet Window . Now it is simply Java Applet Window or Java Application Window . --------------------------------------------The JNLP API The JNLP API allows unsigned applications to run in the sandbox and at the same time access local resources in a secure way. The API provides the following services: Loading and saving files Accessing the clipboard Printing Downloading a file Displaying a document in the default browser Storing and retrieving persistent configuration information Ensuring that only a single instance of an application executes (added in Java S E 5.0) ----------------------------------------javascript book javaScript: The Definitive Guide by David Flanagan, Francis Lu uses JavaScripttoJava communication to solve an age-old problem: to resize an applet so that it i sn t bound by hardcoded width and height attributes. This is a good example of the integration between Java and JavaScript. -------------------------------------------------NOTE: You have to be careful with the cursor analogy. The remove operation does no t quite work like the BACKSPACE key. Immediately after a call to next, the remove method indeed removes the element to the left of the iterator, just like the BACKSPACE key wou ld. However, if you just called previous, the element to the right is removed. And you can t ca ll remove twice in a row. Unlike the add method, which depends only on the iterator position, the remove m ethod depends on the iterator state. -----------------------------------Keys must be unique. You cannot store two values with the same key. If you call the put method twice with the same key, then the second value replaces the first one. In fact, put

returns the previous value stored with the key parameter. The remove method removes an element with a given key from the map. The size met hod returns the number of entries in the map There are three views: the set of keys, the collection of values (which is not a set), and the set of key/value pairs. The keys and key/value pairs form a set because ther e can be only one copy of a key in a map. The methods Set<K> keySet() Collection<K> values() Set<Map.Entry<K, V>> entrySet() return these three views. (The elements of the entry set are objects of the stat ic inner class Map.Entry.) Note that the keySet is not a HashSet or TreeSet, but an object of some other cl ass that implements the Set interface. The Set interface extends the Collection interface. Therefore , you can use a keySet as you would use any collection. For example, you can enumerate all keys of a map: Set<String> keys = map.keySet(); -----------------------------Converting between Collections and Arrays Because large portions of the Java platform API were designed before the collect ions framework was created, you occasionally need to translate between traditional ar rays and the more modern collections. If you have an array, you need to turn it into a collection. The Arrays.asList w rapper serves this purpose. For example: String[] values = . . .; HashSet<String> staff = new HashSet<String>(Arrays.asList(values)); Obtaining an array from a collection is a bit trickier. Of course, you can use t he toArray method: Object[] values = staff.toArray(); But the result is an array of objects. Even if you know that your collection con tained objects of a specific type, you cannot use a cast: String[] values = (String[]) staff.toArray(); // Error! The array returned by the toArray method was created as an Object[] array, and y ou cannot change its type. Instead, you use a variant of the toArray method. Give it an ar ray of length 0 of the type that you d like. The returned array is then created as the sa me array type: String[] values = staff.toArray(new String[0]); If you like, you can construct the array to have the correct size: staff.toArray(new String[staff.size()]); In this case, no new array is created. --------------------------------------