Object-Oriented Programming Outline Introduction Superclasses and Subclasses protected Members Relationship between Superclass Objects and Subclass Objects Constructors and Finalizers in Subclasses Implicit Subclass-Object-to-Superclass-Object Conversion Software Engineering with Inheritance Composition vs. Inheritance Case Study: Point, Circle, Cylinder Introduction to Polymorphism Type Fields and switch Statements Dynamic Method Binding Object-Oriented Programming Outline final Methods and Classes Abstract Superclasses and Concrete Classes Polymorphism Examples Case Study: A Payroll System Using Polymorphism New Classes and Dynamic Binding Case Study: Inheriting Interface and Implementation Case Study: Creating and Using Interfaces Inner Class Definitions Notes on Inner Class Definitions Type-Wrapper Classes for Primitive Types Introduction • Object-Oriented Programming (OOP) – Inheritance - form of software reusability • New classes created from existing ones • Absorb attributes and behaivors, and add in their own – Override methods - redefine inherited methods • Subclass inherits from superclass – Direct superclass - subclass explicitly inherits – Indirect superclass - subclass inherits from two or more levels up the class heirarchy – Polymorphism • Write programs in a general fashion to handle a wide variety of classes – Abstraction - seeing the big picture Introduction • Object-Oriented Programming – Introduce protected member access – Relationships • "is a" - inheritance – Object of subclass "is a" object of the superclass • "has a" - composition – Object "has a" object of another class as a member – Class libraries • New classes can inherit from them • Someday software may be constructed from standardized, reusable components (like hardware) • Create more powerful software Superclasses and Subclasses • Inheritance example – A rectangle "is a" quadrilateral • Rectangle is a specific type of quadrilateral • Quadrilateral is the superclass, rectangle is the subclass • Incorrect to say quadrilateral "is a" rectangle – Naming can be confusing because subclass has more features than superclass • Subclass more specific than superclass • Every subclass "is an" object of its superclass, but not viceversa – Form tree-like hierarchal structures • Create a hierarchy for class Shape (next slide) Superclasses and Subclasses Shape TwoDimensionalShape Circle Square Triangle ThreeDimensionalShape Sphere Cube Tetrahedron • Using inheritance – Use keyword extends class TwoDimensionalShape extends Shape{ ... } – private members of superclass not directly accessible to subclass – All other variables keep their member access protected Members • In a superclass – public members • Accessible anywhere program has a reference to a superclass or subclass type – private members • Accesible only in methods of the superclass – protected members • Intermediate protection between private and public • Only accessible by methods of superclass, of subclass, or classes in the same package • Subclass methods – Can refer to public or protected members by name – Overridden methods accessible with super.methodName Modifiers The following table shows the access to members permitted by each modifier: Access Levels 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 Relationship between Superclass Objects and Subclass Objects • Object of subclass – Can be treated as object of superclass • Reverse not true – Suppose many classes inherit from one superclass • Can make an array of superclass references • Treat all objects like superclass objects – Explicit cast • Convert superclass reference to a subclass reference (downcasting) • Can only be done when superclass reference actually referring to a subclass object – instanceof operator • if (p instanceof Circle) • Returns true if the object to which p points "is a" Circle Relationship between Superclass Objects and Subclass Objects • Overridding methods – Subclass can redefine superclass methods • When method mentioned in subclass, subclass version used • Access original superclass method with super.methodName – To invoke superclass constructor explicitly • super(); //can pass arguments if needed • If called explicitly, must be first statement • Every Applet has used these techniques – We have overridden init and paint when we extended Japplet • Java implicitly uses class Object as superclass for all classes Relationship between Superclass Objects and Subclass Objects • Upcoming example 4 public class Point { – Every class implicitly inheirts from class Object 8 public Point() – Every constructor must call superclass constructor • Called implicitly by default • If explicit, must be first command 41 public class Circle extends Point { // inherits from Point – Inherits from Point 54 super( a, b ); // call to superclass constructor – Explicitly calls superclass (Point) constructor • Must be first statement in Circle constructor • To call default superclass construcor, use super() Relationship between Superclass Objects and Subclass Objects – Both Point and Circle override toString • To call class Point's toString in class Circle • super.toString() 83 84 Point pointRef, p; Circle circleRef, c; 88 c = new Circle( 2.7, 120, 89 ); 95 pointRef = c; // assign Circle to pointRef – pointRef points to a Circle object • Allowed, because Circle "is a" Point 98 pointRef.toString(); – pointRef knows it is pointing to a Circle object • Calls the proper toString method • Example of polymorphism - more later Relationship between Superclass Objects and Subclass Objects 102 circleRef = (Circle) pointRef; – pointRef is pointing to a Circle • Downcast it to a Circle reference, assign to circleRef (explicit cast) 87 113 p = new Point( 30, 50 ); if ( p instanceof Circle ) { – Operator instanceof • Returns true if object to which p points "is a" Circle • In this case, returns false 1 // Fig. 9.4: Point.java 2 // Definition of class Point 3 1. Point definition 4 public class Point { 5 protected int x, y; // coordinates of the Point 6 Data members Point implicitly inherits from1.1 class 7 // No-argument constructor Object 8 public Point() 9 { 1.2 Constructors 10 // implicit call to superclass constructor occurs here 11 setPoint( 0, 0 ); Notice the default (no argument) 1.3 Methods 12 } constructor. Implicit call to superclass 13 constructor. 14 // Constructor 15 public Point( int a, int b ) 16 { 17 // implicit call to superclass constructor occurs here 18 setPoint( a, b ); 19 } 20 21 // Set x and y coordinates of Point 22 public void setPoint( int a, int b ) 23 { 24 x = a; 25 y = b; 26 } 27 28 // get x coordinate 29 public int getX() { return x; } 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 // get y coordinate public int getY() { return y; } // convert the point into a String representation public String toString() Class { return "[" + x + ", " + y + "]"; } toString overrides ---------------the original toString in class Object 1. Circle Definition } // Fig. 9.4: Circle.java // Definition of class Circle public class Circle extends Point { protected double radius; 1.4 Overridden Point's methodtoString method // inherits from Point // No-argument constructor Point constructor called public Circle() { // implicit call to superclass constructor occurs here setRadius( 0 ); } 1.1 extends Point 1.2 Multiple implicitly constructors // Constructor Point constructor called explicitly, public Circle( double r, int a, int b ) and must be the first statement in the { subclass constructor super( a, b ); // call to superclass constructor setRadius( r ); } // Set radius of Circle public void setRadius( double r ) { radius = ( r >= 0.0 ? r : 0.0 ); } 61 62 // Get radius of Circle 63 public double getRadius() { return radius; } 64 65 // Calculate area of Circle 66 67 public double area() { return Math.PI * radius * radius; } 68 // convert the Circle to a String 69 public String toString() 70 { 71 return "Center = " + "[" + x + ", " + y + "]" + 72 73 74 } "; Radius = " + radius; } 1.3 Overridden toString method 75 // Fig. 9.4: Test.java 76 // Demonstrating the "is a" relationship 77 import java.text.DecimalFormat; 78 import javax.swing.JOptionPane; 1. Initialize objects 79 80 public class InheritanceTest { 81 public static void main( String args[] ) 82 { 83 Point pointRef, p; 84 Circle circleRef, c; 85 String output; 2. Refer to a subclass object with a superclass reference 2.1 toString 86 87 p = new Point( 30, 50 ); 88 c = new Circle( 2.7, 120, 89 ); 89 90 91 because output = "Point p: " + Allowed p.toString() + a subclass object "is a" object "\nCircle c: "superclass + c.toString(); 92 pointRef is actually pointing to a Circle object, so it calls method toString of class Circle. This is an example of polymorphism, more later. Circle to pointRef 93 The that // use the "is a" relationship tocomputer refer toknows a Circle 94 // with a Point reference 95 pointRef = c; // assign 96 97 98 output += "\n\nCircle c (via pointRef): " + pointRef.toString(); 99 100 // Use downcasting (casting a superclass reference to a 101 // subclass data type) to assign pointRef to circleRef 102 circleRef = (Circle) pointRef; 103 104 output += "\n\nCircle c (via circleRef): " + 105 circleRef.toString(); 106 107 DecimalFormat precision2 = new DecimalFormat( 108 output += "\nArea of c (via circleRef): " + 109 2.2 Downcast Downcast pointRef (which is really pointing2.3 to toString a Circle) to a Circle, and assign it to "0.00" ); circleRef 2.4 area precision2.format( circleRef.area() ); 110 111 // Attempt to refer to Point object 112 // with Circle reference 113 if ( p instanceof Circle ) { 114 circleRef = (Circle) p; 115 output += "\n\ncast successful"; // line 40 in Test.java 116 } 117 118 119 120 121 122 123 124 125 126 } else output += "\n\np does not refer to a Circle"; JOptionPane.showMessageDialog( null, output, "Demonstrating the \"is a\" relationship", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); } 3. if statement Test if p (class Point) "is a" Circle. It is not. Program Output Constructors and Finalizers in Subclasses • Objects of subclass – Superclass constructor should be called • Initialize superclass variables – Default constructor called implicitly • Explicit call (using super) must first command • If method finalize defined – Subclass finalize should call superclass finalize as last action – Should be protected • Only subclasses have access 23 protected void finalize() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 // Fig. 9.5: Point.java // Definition of class Point public class Point extends Object { protected int x, y; // coordinates of the Point // no-argument constructor public Point() { x = 0; y = 0; System.out.println( "Point constructor: " + this ); } // constructor public Point( int a, int b ) { x = a; y = b; Only subclass may access System.out.println( "Point constructor: " + this ); } protected methods. // finalizer protected void finalize() { System.out.println( "Point finalizer: " + this ); } // convert the point into a String representation public String toString() { return "[" + x + ", " + y + "]"; } } 1. Class Point 1.1 Constructors 1.2 Finalizer (protected) 32 // Fig. 9.5: Circle.java 33 // Definition of class Circle 34 public class Circle extends Point { // inherits from Point 35 protected double radius; 36 37 // no-argument constructor 38 public Circle() 39 { 40 // implicit call to superclass constructor here 41 radius = 0; 42 System.out.println( "Circle constructor: " + this ); 43 } 44 45 // Constructor 46 public Circle( double r, int a, int b ) 47 { 48 super( a, b ); // call the superclass constructor 49 radius = r; 50 System.out.println( "Circle constructor: " + this ); 51 53 // finalizer 54 protected void finalize() 55 { 56 System.out.println( "Circle finalizer: " + this ); 57 super.finalize(); 59 } 1.1 Constructors 1.2 Finalizer Circle finalizer calls superclass finalizer (in Point). } 52 58 1. Class Circle (extends Point) // call superclass finalize method 60 61 // convert the Circle to a String public String toString() 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 { return "Center = " + super.toString() + "; Radius = " + radius; 1. Class Test } } // Fig. 9.5: Test.java // Demonstrate when superclass and subclass // constructors and finalizers are called. public class Test { public static void main( String args[] ) { Circle circle1, circle2; Mark objects for garbage collection by 4.5, setting 72, 29them ); to null. circle1 = new Circle( circle2 = new Circle( 10, 5, 5 ); circle1 = null; circle2 = null; // mark for garbage collection // mark for garbage collection System.gc(); // call the garbage collector } } Call garbage collector (static method gc of class System). 2. main 2.1 Initialize objects 2.2 System.gc Point constructor: Center = [72, 29]; Radius = 0.0 Circle constructor: Center = [72, 29]; Radius = 4.5 Point constructor: Center = [5, 5]; Radius = 0.0 Circle constructor: Center = [5, 5]; Radius = 10.0 Circle finalizer: Center = [72, 29]; Radius = 4.5 Point finalizer: Center = [72, 29]; Radius = 4.5 Circle finalizer: Center = [5, 5]; Radius = 10.0 Point finalizer: Center = [5, 5]; Radius = 10.0 Program Output Implicit Subclass-Object-to-SuperclassObject Conversion • References to subclass objects – May be implicitly converted to superclass references • Makes sense - subclass contains members corresponding to those of superclass – Referring to a subclass object with a superclass reference • Allowed - a subclass object "is a" superclass object • Can only refer to superclass members – Referring to a superclass object with a subclass reference • Error • Must first be cast to a superclass reference – Need way to use superclass references but call subclass methods • Discussed later in the chapter Composition vs. Inheritance • "is a" relationship – Inheritance • "has a" relationship – Composition, having other objects as members • Example Employee “is a” BirthDate; Employee “has a” Birthdate; //Wrong! //Composition Case Study: Point, Circle, Cylinder • Inheritance example – Class Point • protected variables x, y • Methods: setPoint, getX, getY, toString – Class Circle (extends Point) • protected variable radius • Methods: setRadius, getRadius, area, override toString – Class Cylinder (extends Circle) • protected variable height • Methods: setHeight, getHeight, area (surface area), volume, override toString 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 // Fig. 9.6: Point.java // Definition of class Point package com.deitel.jhtp3.ch09; public class Point { protected int x, y; // coordinates of the Point // no-argument constructor public Point() { setPoint( 0, 0 ); } // constructor public Point( int a, int b ) { setPoint( a, b ); } // Set public { x = y = } x and y coordinates of Point void setPoint( int a, int b ) a; b; // get x coordinate public int getX() { return x; } // get y coordinate public int getY() { return y; } // convert the point into a String representation public String toString() { return "[" + x + ", " + y + "]"; } } 1. Class Point 1.1 Instance variables 2. Constructors 2.1 Methods 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 // Fig. 9.7: Circle.java // Definition of class Circle package com.deitel.jhtp3.ch09; public class Circle extends Point { protected double radius; // inherits from Point // no-argument constructor public Circle() { // implicit call to superclass constructor setRadius( 0 ); } // Constructor public Circle( double r, int a, int b ) { super( a, b ); // call the superclass constructor setRadius( r ); } // Set radius of Circle public void setRadius( double r ) { radius = ( r >= 0.0 ? r : 0.0 ); } // Get radius of Circle public double getRadius() { return radius; } // Calculate area of Circle public double area() { return Math.PI * radius * radius; } 1. Class Circle (extends Point) 1.1 Instance variable 2. Constructors 2.1 Methods 32 33 34 35 36 37 38 39 } // convert the Circle to a String public String toString() { return "Center = " + super.toString() + "; Radius = " + radius; } 2.1 Methods 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 // Fig. 9.8: Cylinder.java // Definition of class Cylinder package com.deitel.jhtp3.ch09; public class Cylinder extends Circle { protected double height; // height of Cylinder // No-argument constructor public Cylinder() { // implicit call to superclass constructor here setHeight( 0 ); } 1. Class Cylinder (extends Circle) 1.1 Instance variable 2. Constructors 2.1 Methods // constructor public Cylinder( double h, double r, int a, int b ) { super( r, a, b ); setHeight( h ); } // Set height of Cylinder public void setHeight( double h ) { height = ( h >= 0 ? h : 0 ); } // Get height of Cylinder public double getHeight() { return height; } 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 } 45 // // Calculate area of Cylinder (i.e., surface area) public double area() { return 2 * super.area() + 2 * Math.PI * radius * height; } // Calculate volume of Cylinder public double volume() { return super.area() * height; } // Convert the Cylinder to a String public String toString() { return super.toString() + "; Height = " + height; } -----------1. Class Test 2. main Fig. 9.8: Test.java 46 // Application to test class Cylinder 47 import javax.swing.JOptionPane; 48 import java.text.DecimalFormat; 49 import com.deitel.jhtp3.ch09.Cylinder; 50 51 public class Test { 52 public static void main( String args[] ) 53 { 54 Cylinder c = new Cylinder( 5.7, 2.5, 12, 23 ); 55 DecimalFormat precision2 = new DecimalFormat( "0.00" ); 56 String output; 57 2.1 Methods 2.1 Initialize object 58 output = "X coordinate is " + c.getX() + 59 "\nY coordinate is " + c.getY() + 60 "\nRadius is " + c.getRadius() + 61 "\nHeight is " + c.getHeight(); 62 63 c.setHeight( 10 ); 64 c.setRadius( 4.25 ); 65 c.setPoint( 2, 2 ); 66 output += 68 "\n\nThe new location, radius " + 69 "and height of c are\n" + c + 70 "\nArea is " + precision2.format( c.area() ) + 71 "\nVolume is " + precision2.format( c.volume() ); 72 73 JOptionPane.showMessageDialog( null, output, 74 "Demonstrating Class Cylinder", 75 JOptionPane.INFORMATION_MESSAGE ); 76 78 } 2.3 Set methods 2.4 Display changes 67 77 2.2 Method calls System.exit( 0 ); } 2.5 area and volume Program Output Introduction to Polymorphism • With polymorphism – Write extensible programs – Generically process superclass objects – Easy to add classes to heirarchy • Little or no modification required • Only parts of program that need direct knowledge of new class must be changed Type Fields and switch Statements • switch statements – Can be used to deal with many objects of different types • Appropriate action based on type • Problems – Programmer may forget to include a type – Might forget to test all possible cases – Every addition/deletion of a class requires all switch statements to be changed • Tracking all these changes is time consuming and error prone – Polymorphic programming can eliminate the need for switch logic • Avoids all these problems automatically Dynamic Method Binding • Dynamic Method Binding – At execution time, method calls routed to appropriate version • Method called for appropriate class • Example – Triangle, Circle, and Square all subclasses of Shape • Each has an overridden draw method – Call draw using superclass references • At execution time, program determines to which class the reference is actually pointing • Calls appropriate draw method final Methods and Classes • Declaring variables final – Indicates they cannot be modified after declaration – Must be initialized when declared • Declaring methods final – Cannot be overridden in a subclass – static and private methods are implicitly final – Program can inline final methods • Actually inserts method code at method call locations • Improves program performance • Declaring classes final – Cannot be a superclass (cannot inherit from it) – All methods in class are implicitly final Abstract Superclasses and Concrete Classes • Abstract classes (abstract superclasses) – Sole purpose is to be a superclass • Other classes inherit from it – Cannot instantiate objects of an abstract class • Can still have instance variables and constructors – Too generic to define real objects – Declare class with keyword abstract • Concrete class – Can instantiate objects – Provide specifics • Class heirarchies – Most general classes are usually abstract • TwoDimensionalShape - too generic to be concrete Polymorphism Examples • Class Quadrilateral – Rectangle "is a" Quadrilateral – getPerimeter method can be performed on any subclass • Square, Parallelogram, Trapezoid • Same method takes on "many forms" - polymorphism – Have an array of superclass references • Array would point to all the objects – Call getPerimeter using the references • Appropriate method called for each class • Adding a new subclass – Simply need to define getPerimeter for that class – Can refer to it with superclass reference Polymorphism Examples • With polymorphism – New classes can be added easily – One method call can cause different actions to occur, depending on object receiving call • References – Can create references to abstract classes • Cannot instantiate objects of abstract classes • abstract methods – Keyword abstract • Any class with an abstract method must be abstract – abstract methods must be overridden in subclass • Otherwise, subclass must be abstract Case Study: A Payroll System Using Polymorphism • Example program – abstract superclass Employee • abstract method earnings – Must be implemented in each subclass – Classes Boss, CommissionWorker, and PieceWorker, HourlyWorker • Override methods toString and earnings – Class Test • Initialize objects • Use an Employee reference and call toString and earnings • Through polymorphism, the appropriate class method is called 1 2 // Fig. 9.9: Employee.java // Abstract base class Employee 3 4 5 6 public abstract class Employee { private String firstName; private String lastName; 7 8 9 10 11 12 13 14 15 16 17 18 19 20 1. Class Employee (abstract base class) Class Employee declared no Employee objects can be created. // Constructor abstract, so public Employee( String first, String last ) { firstName = first; lastName = last; } Employee can still have a 1.2 Methods constructor, used by its derived classes. 1.3 earnings (abstract method) // Return the first name public String getFirstName() { return firstName; } // Return the last name public String getLastName() { return lastName; } abstract methods must be defined in concrete subclasses. 21 22 23 public String toString() { return firstName + ' ' + lastName; } 24 25 26 // Abstract method that must be implemented for each // derived class of Employee from which objects // are instantiated. 27 public abstract double earnings(); 28 } 1.1 Instance variables 29 // Fig. 9.9: Boss.java 30 // Boss class derived from Employee 31 32 public final class Boss extends Employee { 33 private double weeklySalary; 34 35 // Constructor for class Boss 36 public Boss( String first, String last, double s) 37 { 38 super( first, last ); 39 setWeeklySalary( s ); 40 // call superclass constructor } 41 42 // Set the Boss's salary 43 public void setWeeklySalary( 44 45 46 // Get the Boss's pay 47 public double earnings() { return weeklySalary; } 48 // Print the Boss's name 50 public String toString() 51 { 52 53 54 } return "Boss: " + super.toString(); } 1.1 Instance variable 1.2 Define earnings (required) Implementing earnings is required 1.3 Override toString because it was declared abstract and double s )is a concrete class. Boss { weeklySalary = ( s > 0 ? s : 0 ); } 49 1. Class Boss (extends Employee) 55 // Fig. 9.9: CommissionWorker.java 56 // CommissionWorker class derived from Employee 57 58 public final class CommissionWorker extends Employee { 59 private double salary; // base salary per week 60 private double commission; // amount per item sold 61 private int quantity; // total items sold for week 62 63 // Constructor for class CommissionWorker 64 public CommissionWorker( String first, String last, 65 double s, double c, int q) 66 { 67 super( first, last ); // call superclass constructor 68 setSalary( s ); 69 setCommission( c ); 70 setQuantity( q ); 71 } 72 73 // Set CommissionWorker's weekly base salary 74 public void setSalary( double s ) 75 { salary = ( s > 0 ? s : 0 ); } 76 77 // Set CommissionWorker's commission 78 public void setCommission( double c ) 79 { commission = ( c > 0 ? c : 0 ); } 80 81 // Set CommissionWorker's quantity sold 82 public void setQuantity( int q ) 83 { quantity = ( q > 0 ? q : 0 ); } 84 1. Class CommissionWorker (extends Employee) 1.1 Instance variables 1.2 Constructor 85 // Determine CommissionWorker's earnings 86 public double earnings() 87 { return salary + commission * quantity; } 88 89 // Print the CommissionWorker's name 90 public String toString() 91 { 92 return "Commission worker: " + super.toString(); 93 } 94 } 95 // Fig. 9.9: PieceWorker.java 96 // PieceWorker class derived from Employee 97 98 public final class PieceWorker extends Employee { 99 private double wagePerPiece; // wage per piece output 100 private int quantity; // output for week 101 102 // Constructor for class PieceWorker 103 public PieceWorker( String first, String last, 104 double w, int q ) 105 { 106 super( first, last ); // call superclass constructor 107 setWage( w ); 108 setQuantity( q ); 109 } 110 111 // Set the wage 112 public void setWage( double w ) 113 { wagePerPiece = ( w > 0 ? w : 0 ); } 114 1.3 Define earnings (required) 1.4 Override toString ----------------1. Class PieceWorker (extends Employee) 1.1 Constructor 115 // Set the number of items output 116 public void setQuantity( int q ) 117 { quantity = ( q > 0 ? q : 0 ); } 118 119 // Determine the PieceWorker's earnings 120 public double earnings() 121 { return quantity * wagePerPiece; } 122 123 public String toString() 124 { 125 return "Piece worker: " + super.toString(); 126 } 127 } 128 // Fig. 9.9: HourlyWorker.java 129 // Definition of class HourlyWorker 130 131 public final class HourlyWorker extends Employee { 132 private double wage; // wage per hour 133 private double hours; // hours worked for week 134 135 // Constructor for class HourlyWorker 136 public HourlyWorker( String first, String last, 137 double w, double h ) 138 { 139 super( first, last ); // call superclass constructor 140 setWage( w ); 141 setHours( h ); 142 } 143 1.2 Define earnings (required) 1.3 Override toString ---------------1. Class HourlyWorker (extends Employee) 1.1 Constructor 144 // Set the wage 145 public void setWage( double w ) 146 { wage = ( w > 0 ? w : 0 ); } 147 148 // Set the hours worked 149 public void setHours( double h ) 150 1.2 Define earnings (required) { hours = ( h >= 0 && h < 168 ? h : 0 ); } 151 1.3 Override toString 152 // Get the HourlyWorker's pay 153 public double earnings() { return wage * hours; } ----------------------- 154 155 public String toString() 156 { 157 158 return "Hourly worker: " + super.toString(); } 159 } 160 // Fig. 9.9: Test.java 161 // Driver for Employee hierarchy 162 import javax.swing.JOptionPane; References to abstract classes are allowed. 163 import java.text.DecimalFormat; 164 165 public class Test { 166 public static void main( String args[] ) 167 { 168 Employee ref; 169 String output = ""; 170 1. Class Test // superclass reference 1.1 Employee reference 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 Boss b = new Boss( "John", "Smith", 800.00 ); CommissionWorker c = new CommissionWorker( "Sue", "Jones", 400.0, 3.0, 150); 1.2 Through Initialize PieceWorker p = Employee reference ref points to Boss object. new PieceWorker( "Bob", "Lewis",the 2.5, 200 ); Boss versionsobjects polymorphism, appropriate of HourlyWorker h = toString and earnings are called. To check, they are new HourlyWorker( "Karen", "Price", 13.75, 40 ); called through the Boss object as well. DecimalFormat precision2 = new DecimalFormat( "0.00" ); ref = b; // Employee reference to a Boss output += ref.toString() + " earned $" + precision2.format( ref.earnings() ) + "\n" + b.toString() + " earned $" + precision2.format( b.earnings() ) + "\n"; ref = c; // Employee reference to a CommissionWorker output += ref.toString() + " earned $" + precision2.format( ref.earnings() ) + "\n" + c.toString() + " earned $" + precision2.format( c.earnings() ) + "\n"; ref = p; // Employee reference to a PieceWorker output += ref.toString() + " earned $" + precision2.format( ref.earnings() ) + "\n" + p.toString() + " earned $" + precision2.format( p.earnings() ) + "\n"; subclass 2. Method calls through Employee reference 200 ref = h; // Employee reference to an HourlyWorker 201 output += ref.toString() + " earned $" + 202 precision2.format( ref.earnings() ) + "\n" + 203 h.toString() + " earned $" + 204 precision2.format( h.earnings() ) + "\n"; 205 206 207 JOptionPane.showMessageDialog( null, output, "Demonstrating Polymorphism", 208 JOptionPane.INFORMATION_MESSAGE ); 209 210 2. Method calls through Employee reference System.exit( 0 ); } 211 } Program Output New Classes and Dynamic Binding • Dynamic binding (late binding) – Accomodates new classes – Object's type does not need to be known at compile time – At execution time, method call matched with object Case Study: Inheriting Interface and Implementation • Polymorphism example – abstract superclass Shape • Subclasses Point, Circle, Cylinder • abstract method – getName • non-abstract methods – area (return 0.0) – volume (return 0.0) – Class Shape used to define a set of common methods • Interface is the three common methods • Implementation of area and volume used for first levels of heirarchy Case Study: Inheriting Interface and Implementation – Create an array of Shape references • Point to various subclass objects • Call methods using Shape reference 159 arrayOfShapes[ i ].getName() + ": " + 160 arrayOfShapes[ i ].toString() + 1 // Fig. 9.10: Shape.java 2 // Definition of abstract base class Shape 3 4 public abstract class Shape extends Object { 5 public double area() { return 0.0; } 6 public double volume() { return 0.0; } 7 public abstract String getName(); 8 } 9 // Fig. 9.10: Point.java 10 // Definition of class Point Methds area and volume are defined. 11 will 12 public class Point extendsThey Shape { be overridden in the subclasses necessary. 13 protected int x, y; // when coordinates of the Point 14 15 // no-argument constructor 16 public Point() { setPoint( 0, 0 ); } 17 18 // constructor 19 public Point( int a, int b ) { setPoint( a, b ); } 20 21 // Set x and y coordinates of Point 22 public void setPoint( int a, int b ) 23 { 24 x = a; 25 y = b; 26 } 27 28 // get x coordinate 29 public int getX() { return x; } 30 1. Class Shape (abstract superclass) 1.1 getName (abstract method) ---------------------1. Class Point (extends Shape) 1.1 protected data members 1.2 Constructors 1.3 New methods 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 // get y coordinate public int getY() { return y; } // convert the point into a String representation public String toString() abstract { return "[" + x + ", " + y + "]"; } 1.4 Overridden method method getName must be getName (required) overridden in a concrete subclass. --------------------- // return the class name public String getName() { return "Point"; } } // Fig. 9.10: Circle.java // Definition of class Circle public class Circle extends Point { protected double radius; 1. Class Circle (extends Point) // inherits from Point // no-argument constructor public Circle() { // implicit call to superclass constructor here setRadius( 0 ); } // Constructor public Circle( double r, int a, int b ) { super( a, b ); // call the superclass constructor setRadius( r ); } 1.1 protected data member 1.2 Constructors 1.3 New methods 61 62 63 64 65 66 // Set radius of Circle public void setRadius( double r ) { radius = ( r >= 0 ? r : 0 ); } // Get radius of Circle public double getRadius() { return radius; } 67 68 69 // Calculate area of Circle public double area() { return Math.PI * radius * radius; } 70 71 // convert the Circle to a String 72 public String toString() 73 { return "Center = " + 74 "; Radius = " 75 76 77 1.4 Overridden method area 1.5 Overridden method toString Circle overrides method area, super.toString() + Shape. Point did1.6 inherited from not Overridden method getName (required) + radius; } override area, and has the default --------------------implementation (returns 0). // return the class name public String getName() { return "Circle"; } 78 } 79 // Fig. 9.10: Cylinder.java 80 // Definition of class Cylinder 81 82 public class Cylinder extends Circle { 83 protected double height; // height of Cylinder 84 85 // no-argument constructor 86 public Cylinder() 87 { 88 // implicit call to superclass constructor here 89 setHeight( 0 ); 90 } Class Cylinder (extends Circle) 1.1 protected data member 1.2 Constructors 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 } // constructor public Cylinder( double h, double r, int a, int b ) { super( r, a, b ); // call superclass constructor setHeight( h ); } // Set height of Cylinder public void setHeight( double h ) { height = ( h >= 0 ? h : 0 ); } // Get height of Cylinder public double getHeight() { return height; } // Calculate area of Cylinder (i.e., surface area) public double area() { return 2 * super.area() + 2 * Math.PI * radius * height; } // Calculate volume of Cylinder public double volume() { return super.area() * height; } // Convert a Cylinder to a String public String toString() { return super.toString() + "; Height = " + height; } // Return the class name public String getName() { return "Cylinder"; } 1.2 Constructors 1.3 New methods 1.4 Overridden method area 1.5 Overridden method toString 1.6 Overridden method getName 123 // Fig. 9.10: Test.java 124 // Driver for point, circle, cylinder hierarchy 125 import javax.swing.JOptionPane; Class Test (driver) 126 import java.text.DecimalFormat; 127 128 public class Test { 1. import 129 public static void main( String args[] ) 130 { 131 Point point = new Point( 7, 11 ); 1.1 Initialize objects Create an array of Shape 132 Circle circle = new Circle( 3.5, 22, 8 ); 133 Cylinder cylinder = new Cylinder( 10,references. 3.3, 10, 10 ); 1.2 Create array of 134 Shape references 135 Shape arrayOfShapes[]; Point the Shape references 136 towards subclass objects. 137 arrayOfShapes = new Shape[ 3 ]; 1.3 Initialize array 138 139 // aim arrayOfShapes[0] at subclass Point object 140 arrayOfShapes[ 0 ] = point; 2. Call methods using 141 subclass references 142 // aim arrayOfShapes[1] at subclass Circle object 143 arrayOfShapes[ 1 ] = circle; 144 145 // aim arrayOfShapes[2] at subclass Cylinder object 146 arrayOfShapes[ 2 ] = cylinder; 147 148 String output = 149 point.getName() + ": " + point.toString() + "\n" + 150 circle.getName() + ": " + circle.toString() + "\n" + 151 cylinder.getName() + ": " + cylinder.toString(); 152 153 DecimalFormat precision2 = new DecimalFormat( "0.00" ); 154 155 // Loop through arrayOfShapes and print the name, 156 // area, and volume of each object. 157 for ( int i = 0; i < arrayOfShapes.length; i++ ) { 158 output += "\n\n" + 159 arrayOfShapes[ i ].getName() + ": " + 160 arrayOfShapes[ i ].toString() + 161 "\nArea = " + 162 Call methods using superclass precision2.format( arrayOfShapes[ i ].area() ) + 163 "\nVolume = " + 164 precision2.format( 165 references. Appropriate method called because of polymorphism. arrayOfShapes[ i ].volume() ); } 166 167 JOptionPane.showMessageDialog( null, output, 168 "Demonstrating Polymorphism", 169 JOptionPane.INFORMATION_MESSAGE ); 170 171 172 173 } 2.1 Call methods using Shape references System.exit( 0 ); } Program Output Case Study: Creating and Using Interfaces • Interface – Keyword interface – Has set of public abstract methods – Can contain public final static data • Using interfaces – Class specifies it uses interface with keyword implements • Multiple interfaces use comma-separated list – Class must define all abstract methods in interface • Must use same number of arguments, same return type – Using interface like signing a contract • "I will define all methods specified in the interface" – Same "is a" relationship as inheritance Case Study: Creating and Using Interfaces • Using interfaces (continued) – Interfaces used in place of abstract classes • Used when no default implementation – Typically public data types • Interface defined in its own .java file • Interface name same as file name – Previous interfaces • We have used interface ActionListener • Required to define actionPerformed Case Study: Creating and Using Interfaces • Another use of interfaces – Define a set of constants used by many classes public interface Constants { public static final int ONE = 1; public static final int TWO = 2; public static final int THREE = 3; } • Reexamine previous heirarchy – Replace abstract class Shape with interface Shape 1 // Fig. 9.11: Shape.java 2 // Definition of interface Shape 3 4 public interface Shape { 5 public abstract double area(); 6 public abstract double volume(); 7 public abstract String getName(); 8 } Interface Shape is in its own file, Shape.java 1. Shape interface 1.1 abstract methods ----------------------- 9 // Fig. 9.11: Point.java 10 // Definition of class Point 11 1. Class Point 12 public class Point extends Object implements Shape { (implements Shape) 13 protected int x, y; // coordinates of the Point 14 15 // no-argument constructor 16 public Point() { setPoint( 0, 0 ); } Because Point implements interface 17 Shape, it is required to define the 18 // constructor 19 public Point( int a, int b ) { setPoint( a,abstract b ); } methods in Shape. 20 21 // Set x and y coordinates of Point 22 public void setPoint( int a, int b ) 23 { 24 x = a; 25 y = b; 26 } 27 28 29 30 31 32 33 34 // get x coordinate public int getX() { return x; } 35 36 Point required to define the abstract public String toString() 1.2 Define { return "[" + x + ", " + y + "]"; } methods of the interface it implements. 37 38 // return the area 39 public double area() { return 0.0; } 40 41 // return the volume 42 public double volume() { return 0.0; } 43 44 45 46 } // get y coordinate public int getY() { return y; } 1.1 Define method area (required) // convert the point into a String representation method volume (required) 1.3 Define method getName (required) --------------------// return the class name public String getName() { return "Point"; } Class Circle and Cylinder defined as before 123 // Fig. 9.11: Test.java 124 // Driver for point, circle, cylinder hierarchy 125 import javax.swing.JOptionPane; 126 import java.text.DecimalFormat; 127 128 public class Test { 129 public static void main( String args[] ) 130 { 131 Point point = new Point( 7, 11 ); 132 Circle circle = new Circle( 3.5, 22, 8 ); 133 Cylinder cylinder = new Cylinder( 10, 3.3, 10, 10 ); 134 135 Shape arrayOfShapes[]; 136 137 arrayOfShapes = new Shape[ 3 ]; 138 139 // aim arrayOfShapes[0] at subclass Point object 140 arrayOfShapes[ 0 ] = point; 141 142 // aim arrayOfShapes[1] at subclass Circle object 143 arrayOfShapes[ 1 ] = circle; 144 145 // aim arrayOfShapes[2] at subclass Cylinder object 146 arrayOfShapes[ 2 ] = cylinder; 147 148 String output = 149 point.getName() + ": " + point.toString() + "\n" + 150 circle.getName() + ": " + circle.toString() + "\n" + 151 cylinder.getName() + ": " + cylinder.toString(); Use same class Test as before 152 153 DecimalFormat precision2 = new DecimalFormat( "0.00" ); 154 155 // Loop through arrayOfShapes and print the name, 156 // area, and volume of each object. 157 for ( int i = 0; i < arrayOfShapes.length; i++ ) { 158 output += "\n\n" + 159 arrayOfShapes[ i ].getName() + ": " + 160 arrayOfShapes[ i ].toString() + 161 "\nArea = " + 162 precision2.format( arrayOfShapes[ i ].area() ) + 163 "\nVolume = " + 164 precision2.format( arrayOfShapes[ i ].volume() ); 165 } 166 167 JOptionPane.showMessageDialog( null, output, 168 "Demonstrating Polymorphism", 169 JOptionPane.INFORMATION_MESSAGE ); 170 171 172 173 } System.exit( 0 ); } Use same class Test as before Program Output Inner Class Definitions • Inner classes – Till now, all classes defined at file scope (not inside other classes) – Inner classes defined inside other classes • Can access all members of outer class • No special handles needed – Anonymous inner class • Has no name – Frequently used with event handling Inner Class Definitions • Windowed applications – Execute an application in its own window (like an applet) 64 public class TimeTestWindow extends JFrame { • Inherit from class JFrame (javax.swing) rather than JApplet • Call constructor to set title: super( "TitleName" ) – init method replaced by constructor • init not guaranteed to be called (only called for Applets) • Instead, create GUI components in constructor • Instantiate object in main (guaranteed to be called) 117 TimeTestWindow window = new TimeTestWindow(); Inner Class Definitions • Window Title bar Minimize, maximize, and close Inner Class Definitions 123 // INNER CLASS DEFINITION FOR EVENT HANDLING 124 private class ActionEventHandler implements ActionListener { – Event handling – Some class must implement interface ActionListener • Must define method actionPerformed • Class that implements ActionListener "is an" ActionListener 79 // create an instance of the inner class 80 85 ActionEventHandler handler = new ActionEventHandler(); hourField.addActionListener( handler ); – Method addActionListener • Takes object of type ActionListener • Pass it instance of the class that implements ActionListener ("is a" relationship) Inner Class Definitions • Example – We will use the Time class and execute an application in its own window – Use event handling to set the time • Define an inner class that implements ActionListener • Use an object of this class as the event handler 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 // Fig. 9.12: Time.java // Time class definition import java.text.DecimalFormat; // used for number formatting // This class maintains the time in 24-hour format public class Time extends Object { private int hour; // 0 - 23 private int minute; // 0 - 59 private int second; // 0 - 59 // Time constructor initializes each instance variable // to zero. Ensures that Time object starts in a // consistent state. public Time() { setTime( 0, 0, 0 ); } // Set a new time value using universal time. Perform // validity checks on the data. Set invalid values to zero. public void setTime( int h, int m, int s ) { setHour( h ); // set the hour setMinute( m ); // set the minute setSecond( s ); // set the second } // set the hour public void setHour( int h ) { hour = ( ( h >= 0 && h < 24 ) ? h : 0 ); } // set the minute public void setMinute( int m ) { minute = ( ( m >= 0 && m < 60 ) ? m : 0 ); } 1. Time class 1.2 Data members 1.3 Constructors 1.4 Methods 32 33 // set the second 34 35 36 37 38 39 40 41 42 43 44 45 46 public void setSecond( int s ) { second = ( ( s >= 0 && s < 60 ) ? s : 0 ); } 47 public String toString() 48 { 1.4 Methods // get the hour public int getHour() { return hour; } // get the minute public int getMinute() { return minute; } // get the second public int getSecond() { return second; } // Convert to String in standard-time format 49 DecimalFormat twoDigits = new DecimalFormat( "00" ); 50 51 return ( ( getHour() == 12 || getHour() == 0 ) ? 52 12 : getHour() % 12 ) + ":" + 53 twoDigits.format( getMinute() ) + ":" + 54 twoDigits.format( getSecond() ) + 55 ( getHour() < 12 ? " AM" : " PM" ); 56 57 } } 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 // Fig. 9.12: TimeTestWindow.java // Demonstrating the Time class set and get methods import java.awt.*; Set up all GUI components in import java.awt.event.*; constructor. In main, create a import javax.swing.*; TimeTestWindow object, which extends { runs theJFrame constructor. public class TimeTestWindow private Time t; private JLabel hourLabel, minuteLabel, secondLabel; Call to JFrame constructor private JTextField hourField, minuteField, of window. secondField, display; private JButton exitButton; sets title bar public TimeTestWindow() { super( "Inner Class Demonstration" ); 1. import 1.1 Class TimeTestWindow ( extends JFrame) 1.2 Create GUI components in constructor 1.3 Create instance of t = new Time(); class that implements ActionListener Object of inner class ActionEventHandler Container c = getContentPane(); passed as an argument to addActionListener // create an instance of the inner class ActionEventHandler handler = new ActionEventHandler(); c.setLayout( new FlowLayout() ); hourLabel = new JLabel( "Set Hour" ); hourField = new JTextField( 10 ); hourField.addActionListener( handler ); c.add( hourLabel ); c.add( hourField ); 1.4 addActionListener 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 minuteLabel = new JLabel( "Set minute" ); minuteField = new JTextField( 10 ); minuteField.addActionListener( handler ); c.add( minuteLabel ); c.add( minuteField ); secondLabel = new JLabel( "Set Second" ); secondField = new JTextField( 10 ); secondField.addActionListener( handler ); c.add( secondLabel ); c.add( secondField ); display = new JTextField( 30 ); display.setEditable( false ); c.add( display ); 1.5 Create GUI components 2. Methods 3. main 3.1 Create object exitButton = new JButton( "Exit" ); exitButton.addActionListener( handler ); c.add( exitButton ); } public void displayTime() Create { display.setText( "The time is: " + t ); } public static void main( String args[] ) { TimeTestWindow window = new TimeTestWindow(); TimeTestWindow object. 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 } window.setSize( 400, 140 ); window.show(); } // INNER CLASS DEFINITION FOR EVENT HANDLING 4. Inner class private class ActionEventHandler implements ActionListener { ActionEventHandler public void actionPerformed( ActionEvent e ) implements { ActionListener if ( e.getSource() == exitButton ) System.exit( 0 ); // terminate the application else if ( e.getSource() == hourField ) { t.setHour( Use a named Integer.parseInt( e.getActionCommand() ) ); inner class as the event hourField.setText( "" ); handler. Class implements interface } ActionListener, and must define else if ( e.getSource() == minuteField ) { actionPerformed. t.setMinute( Integer.parseInt( e.getActionCommand() ) ); minuteField.setText( "" ); } else if ( e.getSource() == secondField ) { t.setSecond( Integer.parseInt( e.getActionCommand() ) ); secondField.setText( "" ); } displayTime(); } } Program Output Inner Class Definitions • Anonymous inner classes – Have no name – Object created at time class defined • Event handling with anonymous inner classes – Define the inner class inside the call to addActionListener • Create an instance of the class inside the method call • addActionListener takes an object of class ActionListener Inner Class Definitions 24 hourField.addActionListener( 25 new ActionListener() { // anonymous inner class 26 public void actionPerformed( ActionEvent e ) 27 { 28 t.setHour( 29 30 31 32 33 34 Integer.parseInt( e.getActionCommand() ) ); hourField.setText( "" ); displayTime(); } } ); – new creates an object – ActionListener() • Begins definition of anonymous class and calls default constructor • Similar to public class myHandler implements ActionListener – Braces ( {} ) begin and end class defintion Inner Class Definitions 82 84 85 86 TimeTestWindow window = new TimeTestWindow(); window.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent e ) 87 { 88 System.exit( 0 ); 89 } 90 91 } ); – Enables use of close box (window closing event) • addWindowListener registers window event listener • 7 methods need to be defined for interface WindowListener • Adapter classes - already implement interfaces – Extend adapter class and override methods want to define • Adapter class "is a" WindowListener Inner Class Definitions 82 84 85 86 TimeTestWindow window = new TimeTestWindow(); window.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent e ) 87 { 88 System.exit( 0 ); 89 } 90 91 } ); – new WindowAdapter() • Begins anonymous inner class that extends WindowAdapter • Similar to: public class myHandler extends WindowAdapter { 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 // Fig. 9.13: TimeTestWindow.java // Demonstrating the Time class set and get methods import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TimeTestWindow extends JFrame { private Time t; private JLabel hourLabel, minuteLabel, secondLabel; private JTextField hourField, minuteField, secondField, display; public TimeTestWindow() { super( "Inner Class Demonstration" ); 1.2 Constructor t = new Time(); Container c = getContentPane(); An object of an anonymous inner class handler ( 2. Event is used as the event handler. anonymous inner c.setLayout( new FlowLayout() ); hourLabel = new JLabel( "Set Hour" ); hourField = new JTextField( 10 ); hourField.addActionListener( new ActionListener() { // anonymous inner class public void actionPerformed( ActionEvent e ) 27 { 29 1.1 Class TimeTestWindow (extends JFrame) 1.3 Initialze GUI 26 28 1. import t.setHour( Integer.parseInt( e.getActionCommand() ) ); class) 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 hourField.setText( "" ); displayTime(); } } ); c.add( hourLabel ); c.add( hourField ); 2. Event handler ( Each button has a separate inner class anonymous inner as an event handler. class) minuteLabel = new JLabel( "Set minute" ); minuteField = new JTextField( 10 ); minuteField.addActionListener( new ActionListener() { // anonymous inner class public void actionPerformed( ActionEvent e ) { t.setMinute( Integer.parseInt( e.getActionCommand() ) ); minuteField.setText( "" ); displayTime(); } } ); c.add( minuteLabel ); c.add( minuteField ); secondLabel = new JLabel( "Set Second" ); secondField = new JTextField( 10 ); secondField.addActionListener( new ActionListener() { // anonymous inner class public void actionPerformed( ActionEvent e ) 59 60 { t.setSecond( Integer.parseInt( e.getActionCommand() ) ); secondField.setText( "" ); displayTime(); 61 62 63 64 65 66 67 ); c.add( secondLabel ); 68 c.add( secondField ); 3. main } } 3.1 Create TimeTestWindow object 69 70 display = new JTextField( 30 ); 71 display.setEditable( false ); 72 c.add( display ); 73 3.2 addWindowListener } 74 75 76 77 78 79 80 81 82 83 84 85 public void displayTime() { display.setText( "The time is: " + t ); } Use an anonymous inner class ) to handle window events. public static void main( String args[] { TimeTestWindow window = new TimeTestWindow(); window.addWindowListener( new WindowAdapter() { 86 public void windowClosing( WindowEvent e ) 87 { 88 System.exit( 0 ); 89 } 90 } 91 ); 92 93 window.setSize( 400, 120 ); 94 window.show(); 95 } 96 } Program Output Notes on Inner Class Definitions • Notes – Every class (including inner classes) have their own .class file – Named inner classes can be public, protected, private, or have package access • Same restrictions as other members of a class – To access outer class's this reference • OuterClassName.this – Inner class can be static • Does not have access to outer class's non-static members Notes on Inner Class Definitions • Notes (continued) – To create an object of another class's inner class • Create an object of outer class and assign it a reference (ref) • Type statement of form: OuterClassname ref = new OuterClassname(); OuterClassName.InnerClassName innerRef = ref.new InnerClassName(); Type-Wrapper Classes for Primitive Types • Type wrapper classes – Each primitive data type has one • Called Character, Byte, Short, Integer, Long, Float, Double, Boolean – Manipulate primitive types like objects of class Object • Values can be processed polymorphically – Declared final, so methods implicitly final • Cannot be overridden – Numeric classes inherit from Number • Byte, Short, Integer, Long, Float, Double – Many methods are static – Check documentation if manipulating primitive types • Method you need may be defined