javaimplementation

16
Java Implementation: Part 3 Version 1.1 of 20 March 2013: corrected contract for hashCode() Version 1.2 of 20 March 2013: added slide 6 CompSci 230 Software Construction

Transcript of javaimplementation

Page 1: javaimplementation

Java Implementation: Part 3

Version 1.1 of 20 March 2013: corrected contract for hashCode()

Version 1.2 of 20 March 2013: added slide 6

CompSci 230Software Construction

Page 2: javaimplementation

2

Agenda

COMPSCI 230: S7

Topics: Enum Types Memory allocation: another view of Java’s type system Object Identity, Assignment, Equality, and Copying

The Object class Overriding equals() and toString() Cloning

Nested Classes What and Why

Reading, in The Java Tutorials: Enum Types and Nested Classes pages, in the Classes and Objects Lesson. Object as a Superclass page, in the Interface and Inheritance Lesson. Equality, Relational, and Conditional Operators page, in the Language Basics

Lesson. For reference:

The 3 things you should know about hashCode(), Eclipse Source Developer, available 20 March 2013.

Page 3: javaimplementation

3

Enum Types

COMPSCI 230: S7

“An enum type is a special data type that enables for a variable to be a set of predefined constants. The variable must be equal to one of the values that have been predefined for it. Common examples include

compass directions (values of NORTH, SOUTH, EAST, and WEST) and the days of the week.

“Because they are constants, the names of an enum type's fields are in uppercase letters.

“… define an enum type by using the enum keyword. For example, you would specify a days-of-the-week enum type as:

“You should use enum types any time you need to represent a fixed set of constants. That includes natural enum types such as the planets in our solar system and data sets where you know all possible values at compile time—for example,

the choices on a menu, command line flags, and so on.”

public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY }

Page 4: javaimplementation

4

Memory Allocation

COMPSCI 230: S7

We use a reference variable to refer to instantiated objects. The value in a reference variable is, essentially, a pointer to an object.

A special value (null) indicates that there is no object. The runtime system (the JVM) interprets reference values as an index into a

heap – an area of memory that is set aside, by the JVM, for storing instantiated objects.

Formally: the range of allowable values for a reference variable is defined by its reference type. This is a static property. The reference type of o1 is Object. This means it can point to any instance of Object,

or to any instance of any subclass of Object.

The new operator allocates sufficient memory on the heap to store all the fields of the object it is instantiating.

0xfe100140 :Ball

-class :Class = BallxPos :int =10yPos :int = 20color :Java.awt.Color = RED

int i = 20;Ball b1 = new Ball( 10, i, Color.RED );

i :int = 20b1 :Ball = 0xfe100140

Object o1 = b1;

pointsTo

o1 :Object = 0xfe100140

pointsTo

static typedynami

c type

Page 5: javaimplementation

5

A model of Java’s type system (for reference)

COMPSCI 230: S7

Source: Kollman, R. and Gogolla, M., “Capturing Dynamic Program Behaviour with UML Collaboration Diagrams”, Proc. CSMR, 2001.

Page 6: javaimplementation

6

Variables, revisited “The Java programming language defines the following kinds of variables: … ”

[Variables page of the Language Basics Lesson]

Lifetime Initialisation

Class Variables

Loading: Created when a class is loaded (usually when the app or applet is loaded); destroyed when a class is reloaded (rare), or when the app/applet terminates.

By default. (An explicit initialisation is generally preferred. )

Instance Variables

Instantiation: Created when an object is instantiated; destroyed when an object is garbage-collected.

By default. (An explicit initialisation is generally preferred. )

Local Variables

Invocation: Created when a method (or a brace-delimited block of code, such as a loop body) is entered; destroyed when a method is exited.

Must be initialised explicitly!

Parameters

Invocation: Created when a method is entered; destroyed when a method is exited.

The implicit parameter (this) is the target of the invoking message. The values of explicit parameters are defined in the message.

Page 7: javaimplementation

7

Object Identity

COMPSCI 230: S7

If two reference variables have the same value, they are pointing to the same object. This relationship is called “object identity”. You can test it with the == operator.

0xfe100140 :Ball

-class :Class = BallxPos :int =10yPos :int = 20color :Java.awt.Color = RED

b1 :Ball = 0xfe100140

pointsTo

Ball b1 = new Ball( 10, 20, Color.RED );

o1 :Object = 0xfe100140

pointsTo

Object o1 = b1;

truefalse

System.out.println( o1 == b1 );System.out.println( (String) o1==b1 );

:String = 0xba301030

0xba301030 :String

-class :Class = Stringvalue :char[] = null

pointsTo

Page 8: javaimplementation

8

Equality test: object identity

COMPSCI 230: S7

A box that contains 7 items is not identical to any other box that contains 7 items. But… we would say “3 + 4 equals 7”.

If we want to know whether two boxes are equivalent (= have the same value), we might have to open up the boxes and look inside. The equals() method is implemented as == in Object. You should override equals(), if you define a subclass in which the

“natural definition” for equality differs from the equals() it inherits.

System.out.println( (3+4) == 7 );System.out.println( new Integer(3+4) == new Integer(7) );

truefalse

System.out.println( (new Integer(3+4)).equals(new Integer(7)) );System.out.println( (new Integer(7)).equals(3+4) );

truetrue

System.out.println( (3+4).equals(new Integer(7)) );

System.out.println( ((Integer)(3+4)).equals(new Integer(7)) ); true

Page 9: javaimplementation

9

The hashCode() Method “The Object class, in the java.lang package, sits at the top of the class

hierarchy tree. Every class is a descendant, direct or indirect, of the Object class. Every class you use or write inherits the instance methods of Object. You need not use any of these methods, but, if you choose to do so, you may need

to override them with code that is specific to your class. “The value returned by hashCode() is the object's hash code, which is the

object's memory address in hexadecimal. “By definition, if two objects are equal, their hash code must also be equal.

If you override the equals() method, you change the way two objects are equated and Object's implementation of hashCode() is no longer valid.

Therefore, if you override the equals()method, you must also override the hashCode() method as well.”

The hashCode() method returns an int. Hashcodes are used in HashSet, HashMap, and some other Collection classes

which use a hashing algorithm. These classes will give incorrect results, if equal instances in a Collection have different

hashcodes. They will have poor performance, if many unequal instances share the same hashcode.

Object

Page 10: javaimplementation

10

String Equality – be careful…

COMPSCI 230: S7

Strings are immutable. None of the String methods will modify the value of an existing instance;

instead, a new String instance is created, and returned. Some strings are “interned” (= accessible by a hash lookup, at runtime).

You may get a reference to an existing String instance when you ask for a new String. Then again, you might not…

Moral: you should use equals(), and not ==, to test Strings for equality.

String s3 = new String("Apple");String s4 = new String("Apple");System.out.println("s3==s4:" + (s3==s4));System.out.println("s3.equals(s4):" + s3.equals(s4));

String s1 = "Apple";String s2 = "Apple";System.out.println("s1==s2:" + (s1==s2));System.out.println("s1.equals(s2):" + s1.equals(s2));

TrueTrue

FalseTrue

Page 11: javaimplementation

11

Other Overridable Object Methods

COMPSCI 230: S7

Object has two other methods you might want to override toString(): returns a String representation of the object clone(): create a copy of an existing object public class Object {

... public boolean equals(Object obj) { return (this == obj); } public String toString() { return getClass().getName() ... } protected Object clone() throws CloneNotSupportedException { ... }}

Page 12: javaimplementation

12

The getClass() method

COMPSCI 230: S7

You cannot override getClass(). Can you see why this isn’t allowed?

Point p1 = new Point(10, 20);Class c = p1.getClass ();System.out.println(c.getName());System.out.println(c.getSuperclass().getName());

Pointjava.lang.Object

public class Object { ... // Returns the runtime class of an object public final Class getClass() { ... } ... }

Page 13: javaimplementation

13

Cloning

COMPSCI 230: S7

The clone() method in the Object class Throws an exception, if the class of this object does not

implement the interface Cloneable Creates an object of the same type as the original object Initialises the clone’s instance variables to the same values

as the original object's instance variables This is a shallow copy: any objects that are referenced by instance

variables will not be cloned.

If an object references another object, then you might want to override clone() so that It always throws an exception (i.e. is uncloneable), or It clones the other object, and references it from the clone of

the original -- so that the clone of the original can be modified or destroyed without affecting the original.

Page 14: javaimplementation

Nested Classes

COMPSCI 230: S714

Definition: A class defined inside another class. Motivation: Some classes only make sense in the context

of another enclosing class. Examples: An Enumeration or Iterator object cannot exist by itself. It makes

sense only in association with a collection being enumerated/iterated.

A GUI event handler cannot exist by itself. It makes sense only in association with the GUI component for which it handles events. Reference: the Writing an Event Listener Lesson of the Java Tutorials.

Nested classes define, and enforce, a composition relationship between the outer class and its inner classes:

public class MyRegularClass { ...

}

class MyInnerClass { ...}

Outer class

Inner class

Page 15: javaimplementation

Nested Classes: Some Details

COMPSCI 230: S715

“A nested class is a member of its enclosing class. Non-static nested classes (inner classes) have access to other

members of the enclosing class, even if they are declared private.

Static nested classes do not have access to other members of the enclosing class.

“As a member of [its outer class], a nested class can be declared private, public, protected, or package private. (Recall that outer classes can only be

declared public or package private.)” “There are two additional types of inner classes.

You can declare an inner class within the body of a method. Such a class is known as a local inner class.

You can also declare an inner class within the body of a method without naming it. These classes are known as anonymous inner classes.

You will encounter such classes in advanced Java programming.”

Page 16: javaimplementation

16

Review

COMPSCI 230: S7

Topics: Enum Types Memory allocation: another view of Java’s type system Object Identity, Assignment, Equality, and Copying

The Object class Overriding equals() and toString() Cloning

Nested Classes What and Why

End of Theme A: The OO Programming Paradigm We took a top-down approach: use-case analysis class

design implementation.