Date post: | 02-Jan-2016 |
Category: |
Documents |
Upload: | amergin-hone |
View: | 28 times |
Download: | 4 times |
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
OO Support in Java: Classes (Part 2)
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
INTRODUCTION
• The following topics will be discussed:– Constructor Methods– Method Overloading
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
CONSTRUCTOR METHODS• Consider the following class definition:
class Account {private String acctNo;private boolean active;private String owner;
public void displayInfo( ) {System.out.println("Acct number: "+acctNo);System.out.println("Owner: "+owner);System.out.print("Status: ");if (!active)
System.out.print("NOT ");System.out.println("ACTIVE");
}}
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
• What happens when the following statements are executed?
Account acct = new Account( );acct.displayInfo( );
• When an object is created, its attributes should be initialized. Example:
Account acct = new Account( );acct.initialize("010-99333-03",
"Nada Asyiqin", true);acct.displayInfo( );
Problem: It is easy to forget to initialize newly created objects.
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
• Can object initialization be done during object creation?
• Two common ways of initializing attributes during object creation:– Via instance variable initializers– Via constructor methods
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
Variable initializers
Method 1: Instance Variable Initializer
class Piggybank {private int cents = 0;private String owner = null;
public void deposit(int amt) {cents += amt;
}
public void withdraw(int amt) {cents -= amt;
}}
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
• For each Piggybank object created, its instance variable cents will be initialized to 0 and owner to null.
for (int i=0; i < 3; i++)new Piggybank( );
: Piggybank
cents 0
owner null
: Piggybank
cents 0
owner null
: Piggybank
cents 0
owner null
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
Constructormethod
Method 2: Constructor Methodsclass Piggybank {
private int cents;private String owner;
public Piggybank( ) {cents = 0;owner = null;
}public void deposit(int amt) {
cents += amt;}public void withdraw(int amt) {
cents -= amt;}
}
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
• The constructor method is executed each time a Piggybank object is created. When executed, – the cents attribute of the created object is initialized to
0. – the owner attribute is set to null.
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
• Now consider the following code:
for (int i=0; i < 3; i++)new Piggybank( ); public Piggybank( ) {
cents = 0;owner = null;
}
: Piggybank
cents 0
owner null
: Piggybank
cents 0
owner null
: Piggybank
cents 0
owner null
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
• The constructor method is a suitable place for putting in the necessary code for initializing an object when it is being created.
• Constructors are not allowed to return any value at the end of their execution.In fact, constructors do not have a return type.
public Piggybank( ) {cents = 0;owner = null;
}
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
• Another restriction: the name of a constructor must be the same as the name of the class.
class Piggybank {…
}
public Piggybank( ) {cents = 0;owner = null;
}
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
• Constructors can be parameterized. For an object to execute a constructor with parameters, the required parameters need to be passed when that object is created.
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
Contoh:class Piggybank {
private int cents;private String owner;
public Piggybank(int amt, String name) {cents = amt;owner = name;
}public void deposit(int amt) {
cents += amt;}public void withdraw(int amt) {
cents -= amt;}
}
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
• An example of creating a Piggybank object:Piggybank pb = new Piggybank(100,“Raziq”);
public Piggybank(int amt, String name) {cents = amt;owner = name;
}
: Piggybank
cents 100
owner “Raziq”
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
• Each class must have at least one constructor method.
• If no constructors are defined for a class, the Java compiler will automatically insert a default constructor.
• The default constructor inserted will be parameterless and has an empty body.
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
Example:
class Account {private String acctNo;private boolean active;private String owner;public Account(String nbr, String name) {
acctNo = nbr;owner = name;active = false;
}public void displayInfo( ) {
System.out.println(“Account number: "+acctNo);System.out.println(“Owner: "+owner);System.out.print("Status: ");if (!active)
System.out.print(“NOT ");System.out.println("ACTIVE");
}}
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
class Application {public static void main(String[ ] args) {
Account acct;acct = new Account("010-99333-03",
"Nada Asyiqin");acct.displayInfo( );
}}
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
Method Overloading• Consider the following program code:
class Form {
private int length;private char chr;private int length;private char chr;
public Form(int lgth, char c) {length = lgth;chr = c;
}
public Form(int lgth, char c) {length = lgth;chr = c;
}
private void displayBody(char c) {for (int i=0; i < length; i++)
System.out.print(c);}
private void displayBody(char c) {for (int i=0; i < length; i++)
System.out.print(c);}
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
private void displayHead() {System.out.print(":>");
}
private void displayHead() {System.out.print(":>");
}
public void displayDefault() {displayBody(chr);displayHead();
}
public void displayDefault() {displayBody(chr);displayHead();
}
public void displayDiffChar(char c) {displayBody(c);displayHead();
}
public void displayDiffChar(char c) {displayBody(c);displayHead();
}
public void displayVarLgth(int factor, char c) {for (int i=0; i < factor; i++)
displayBody(c);displayHead();
}
public void displayVarLgth(int factor, char c) {for (int i=0; i < factor; i++)
displayBody(c);displayHead();
}}
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
class Application {
}
public static void main(String[] args) {Form form = new Form(3, 'x');form.displayDefault();System.out.println();form.displayDiffChar('*');System.out.println();form.displayVarLgth(3, '=');
}
public static void main(String[] args) {Form form = new Form(3, 'x');form.displayDefault();System.out.println();form.displayDiffChar('*');System.out.println();form.displayVarLgth(3, '=');
}
The output:xxx:>***:>= = = = = = = = = :>
: Form
length 3
chr ‘x’
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
• The tasks performed by the methods displayDefault(), displayDiffChar() and displayVarLgth() are basically similar i.e. to display a Form object. Is it possible to use the same name for all of those methods?
• This is allowable in Java because of its support for method overloading.Overloading a method means using the same name for more than one method in a class definition.
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
Method Overloading• The program code after method overloading:
class Form {
private int length;private char chr;private int length;private char chr;
public Form(int lgth, char c) {length = lgth;chr = c;
}
public Form(int lgth, char c) {length = lgth;chr = c;
}
private void displayBody(int c) {for (int i=0; i < length; i++)
System.out.print(c);}
private void displayBody(int c) {for (int i=0; i < length; i++)
System.out.print(c);}
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
private void displayHead() {System.out.print(":>");
}
private void displayHead() {System.out.print(":>");
}
public void display() {displayBody(chr);displayHead();
}
public void display() {displayBody(chr);displayHead();
}
public void display(char c) {displayBody(c);displayHead();
}
public void display(char c) {displayBody(c);displayHead();
}
public void display(int factor, char c) {for (int i=0; i < factor; i++)
displayBody(c);displayHead();
}
public void display(int factor, char c) {for (int i=0; i < factor; i++)
displayBody(c);displayHead();
}}
method overloadingapplied
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
class Application {
}
public static void main(String[] args) {Form form = new Form(3, 'x');form.display();System.out.println();form.display('*');System.out.println();form.display(3, '=');
}
public static void main(String[] args) {Form form = new Form(3, 'x');form.display();System.out.println();form.display('*');System.out.println();form.display(3, '=');
}
public void display () {displayBody(chr);displayHead();
}
public void display () {displayBody(chr);displayHead();
}
public void display (char c) {displayBody(c);displayHead();
}
public void display (char c) {displayBody(c);displayHead();
}
public void display(int factor, char c) {for (int i=0; i < factor; i++)
displayBody(c);displayHead();
}
public void display(int factor, char c) {for (int i=0; i < factor; i++)
displayBody(c);displayHead();
}
: Form
length 3
chr ‘x’
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
Example 2:• The println() method is actually overloaded
in the PrintStream class. int pbhInt;double pbhDbl;System.out.println("UKM");System.out.println('X');System.out.println(pbhInt);System.out.println(pbhDbl);
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
• How is Java able to differentiate methods with the same name?
It differentiates those methods based on the type and sequence of their parameters.
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
class Test {
}
public void doThis(double x) {System.out.println(“1stMethod");
}
public void doThis(double x) {System.out.println(“1stMethod");
}
public void doThis(float x) {System.out.println(“2ndMethod");
}
public void doThis(float x) {System.out.println(“2ndMethod");
}
public void doThis(double x, String y) {System.out.println(“3rdMethod");
}
public void doThis(double x, String y) {System.out.println(“3rdMethod");
}
public static void main(String[] args) {Test t = new Test();t.doThis(3.3);t.doThis(3.3F);t.doThis('k');t.doThis(5.2, “try");// t.doThis(“ERROR");
}
public static void main(String[] args) {Test t = new Test();t.doThis(3.3);t.doThis(3.3F);t.doThis('k');t.doThis(5.2, “try");// t.doThis(“ERROR");
}
No match
1stMethod
2ndMethod
2ndMethod
3rdMethod
Automatic casting occurs char => int => float
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
• The output:1stMethod2ndMethod2ndMethod3rdMethod
• Note that the message in the commented statement in the main( ) method does not match with any of the doThis() methods in the Test class.
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
• Note also thatt.doThis('k');
results in the execution of the doThis(float) method. Since there is no doThis(char) method defined in the Test class, Java automatically casts the actual parameter to find the closest match. doThis(char) => doThis(int) => doThis(float)
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
• It is common to define classes with overloaded constructor methods. This provides their users with more than one way of creating instances.
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
Example 1:
class Rectangle {
…}
public Rectangle() {width = 1;height = 1;
}
public Rectangle() {width = 1;height = 1;
}
public Rectangle(int size) {width = size;height = size;
}
public Rectangle(int size) {width = size;height = size;
}
public Rectangle(int w, int h) {width = w;height = h;
}
public Rectangle(int w, int h) {width = w;height = h;
}
private int width, height;private int width, height;
Constructor methods are overloaded
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
class Application {
}
public static void main(String[] args) {Rectangle r1 = new Rectangle(5);Rectangle r2 = new Rectangle(3, 4);Rectangle r3 = new Rectangle();...
}
public static void main(String[] args) {Rectangle r1 = new Rectangle(5);Rectangle r2 = new Rectangle(3, 4);Rectangle r3 = new Rectangle();...
}
Executes first constructor
Executes second constructor
Executes third constructor
©Sufian Idris, Marini Abu BakarJabatan Sains KomputerUniversiti Kebangsaan Malaysia
Example 2:• The Date class provided in the Java class library
defines a number of constructors including the following:public Date();public Date(long milliseconds);public Date(int year, int month, int day);public Date(int year, int month, int day, int hour, int minute);public Date(int year, int month, int day, int hour, int minute,
int second);