Presentation is loading. Please wait.

Presentation is loading. Please wait.

Classes and Objects 2nd Lecture

Similar presentations


Presentation on theme: "Classes and Objects 2nd Lecture"— Presentation transcript:

1 Classes and Objects 2nd Lecture
CMSC 202 Classes and Objects 2nd Lecture

2 Visibility of instance variables and methods
Topics OOP techniques encapsulation data hiding Visibility of instance variables and methods public private Accessor and mutator methods Preconditions and postconditions Method overloading February 2008

3 OOP Techniques Encapsulation Abstraction Information hiding
Combines data and operations into a single entity (a class) Abstraction Discarding details Information hiding A form of abstraction Separating the description of how to use a class from the details of the class’ implementation February 2008

4 The Value of Information Hiding
With information hiding: programmers that use a class do not need to know how the class is implemented, only how to use it, the information the programmer needs to use the class is kept to a minimum, and class implementation may be changed with no impact on those who use the class. February 2008

5 Date2 Class public class Date2 {
In this new date class, the instance variables have been labeled private. public class Date2 { private String month; private int day; private int year; public void print( ) System.out.println(month + “ “ + day + “ “ + year); } // setDate and monthString included A method may use the class’ private instance variables February 2008

6 Visibility Modifiers public class Date2Demo {
Date1 class - public instance variables were used Date2 class - private instance variables are now used public class Date2Demo { public static void main( String[ ] args ) { Date2 myDate = new Date2( ); myDate.month = “July”; // compiler error myDate.day = 4; // compiler error myDate.year = 1950; // compiler error myDate.setDate( 7, 4, 1950 ); // OK – why? myDate.print( ); // OK – why? } February 2008

7 Private Instance Variables
Good programming practice: Label all instance variables as private. The class has complete control over how/when/if the instance variables are changed. How are private instance variables accessed or modified? Accessor and mutator methods give the class user indirect access to the instance variables degree of access is still controlled by the class implementer February 2008

8 Accessors & Mutator Accessor method Mutator method
retrieves the value of a private instance variable conventional to start the name with get Mutator method changes the value of a private instance variable conventional to start the name of an with set February 2008

9 More Accessors and Mutators
Question: Don’t the use of accessors and mutators defeat the purpose of making the instance variable private? Answer: No. The class implementer decides which instance variables will have accessors. Mutators can: validate the new value of the instance variable, and decide whether or not to actually make the requested change. February 2008

10 Copyright © 2008 Pearson Addison-Wesley.
Encapsulation February 2008 Copyright © 2008 Pearson Addison-Wesley. All rights reserved 10

11 Date2 Accessor and Mutator
public class Date2 { private String month; private int day; // private int year; // 4-digit year // accessors return the value of private data public int getDay ( ) { return day; } // mutators can validate the new value public boolean setYear( int newYear ) { if ( newYear < 1000 || newYear > 9999 ) // this is an invalid year return false; } else year = newYear; return true; // rest of class definition follows February 2008

12 Other Methods Classes can provide many methods besides accessors and mutators. Clear communication with the class user is of paramount importance so that he can use the appropriate method, and use class methods properly. Method comments: explain what the method does, and describe how to use the method. Two important types of method comments: precondition comments post-conditions comments February 2008

13 Preconditions and Postconditions
What is assumed to be true when a method is called If any pre-condition is not met, the method cannot correctly perform its function. Postcondition Describes the effect of the method States what will be true after the method executes (assuming all pre-conditions are met) February 2008

14 <month string> <day>, <year>
A Simple Example Recall the print method from Date2 that outputs the month string, day, and year to the screen. The print method might look something like this: /* PreCondition:none PostCondition: The calling object has been written to the screen in the format <month string> <day>, <year> */ public void print( ) { // code here } February 2008

15 Another Common Example
Very often the precondition specifies the limits of the parameters and the postcondition says something about the return value. /* Pre-condition: 1 <= month <= 12 day appropriate for the month 1000 <= year <= 9999 Post-condition: The month, day, and year of the calling object have been set to the parameter values. Returns true if the calling object has been changed Returns false otherwise */ public boolean setDate( int month, int day, int year) { // code here } February 2008

16 What’s in a name? Many different classes can define a method with the same name (e.g. print). Java can determine which method to call based on the type of the calling object. Consider this code snippet: Date2 birthday = new Date2(); Dog fido = new Dog( ); birthday.print( ); fido.print( ); birthday.print( ) will call the print( ) method defined in the Date2 class. fido.print( ) will call the print( ) method defined in the Dog class. February 2008

17 toString One method which should be implemented for all classes is toString. public String toString( ) The toString method returns a String chosen by the class implementer. The string typically contains the values of important instance variables in a readable format. This method is very often used for outputting the “contents” of a class. February 2008

18 Method Overloading Two or more methods in the same class may have the same name. This technique is known as method overloading. February 2008

19 public boolean setDate( int month, int day, int year )
Overloaded setDate The Date2 class setDate method: public boolean setDate( int month, int day, int year ) But suppose we wanted to change only the day and year? We can define another method named setDate like this: public boolean setDate( int day, int year ) (after all, setDate is a good descriptive name for what this method does) February 2008

20 Date3 Class with Overloaded setDate Method
public class Date3 { private String month; private int day; // private int year; // 4 digits public boolean setDate( int newMonth, int newDay, int newYear ) // code here } public boolean setDate( int newDay, int newYear ); // code here, doesn’t change month // print(), monthString( ), setYear( ), etc. follow February 2008

21 Date3Demo Class How does Java know which setDate method to call?
public class Date3Demo { public static void main (String[ ] args) Date3 myDate = new Date3( ); myDate.setDate( 1, 23, 1982 ); myDate.print( ); myDate.setDate( 4, 1999 ); } How does Java know which setDate method to call? February 2008

22 Method Signature In Java (and other OO languages), a method is uniquely identified by its name and its parameter list (parameter types and their order). This is known as its signature. Examples: public boolean setDate(int newMonth, int newDay, int newYear) public boolean setDate(String newMonth, int newDay, int newYear) public boolean setDate(int newDay, int newYear) public boolean setDate(int newDay, String newMonth) February 2008

23 Return Type is Not Enough
Suppose we attempt to overload Date3’s print( ) method by using different return types. public void print( ) { /* code here */ } public boolean print( ) { /* code here */ } This is NOT valid method overloading because the code that calls print( ) can ignore the return value birthday.print( ); The compiler can’t tell which print( ) method to call. Just because a method returns a value doesn’t mean the caller has to use it. February 2008

24 Too Much of a Good Thing Automatic type promotion and overloading can sometimes interact in ways that confuse the compiler. Example: public class X { ... public void printAverage ( int a, double b) //version 1 public void printAverage ( double a, int b) //version 2 } And then consider this: myX = new X( ); myX.printAverage( 5, 7 ); The Java compiler can’t decide whether to promote 7 to 7.0 and call the first version of printAverage or to promote 5 to 5.0 and call the second. The Java compiler is confused and will issue an error stating that the method invocation of myX.printAverage is ambiguous. February 2008

25 Cannot be invoked by the class user
Private Methods Methods may be private Cannot be invoked by the class user Can only be called by other class methods Most commonly used as “helper” methods to support top-down implementation of a public method February 2008


Download ppt "Classes and Objects 2nd Lecture"

Similar presentations


Ads by Google