07slide_2007 - Chapter 7 Objects and Classes EE3206/EE5805...

Info iconThis preview shows page 1. Sign up to view the full content.

View Full Document Right Arrow Icon
This is the end of the preview. Sign up to access the rest of the document.

Unformatted text preview: Chapter 7 Objects and Classes EE3206/EE5805 Java Programming & Application EE3206/EE5805 1 Objectives To understand objects and classes and use classes to model objects. To To learn how to declare a class and how to create an object of a class. To To understand the roles of constructors and use constructors to create To objects. To use UML graphical notations to describe classes and objects. To To distinguish between object reference variables and primitive data type To variables. To use classes in the Java library. To To declare private data fields with appropriate get and set methods to To make class easy to maintain. To develop methods with object arguments. To To understand the difference between instance and static variables and To methods. To determine the scope of variables in the context of a class. To To use the keyword this as the reference to the current object that invokes To the instance method. To store and process objects in arrays. To To apply class abstraction to develop software. To EE3206/EE5805 Java Programming & Application EE3206/EE5805 2 OO Programming Concepts •Object-oriented programming (OOP) involves programming using objects. An object represents an entity in the real world that can be distinctly identified. For example, a student, a desk, a circle, a button, and even a loan can all be viewed as objects. •An object has a unique identity, state, and behaviors. •The identity is the name of an object. •The state of an object consists of a set of data fields (also known as properties) with their current values. •The behavior of an object is defined by a set of methods. EE3206/EE5805 Java Programming & Application EE3206/EE5805 3 Objects Class Name: Circle Data Fields: radius is _______ Methods: getArea A class template Circle Object 1 Data Fields: radius is 10 Circle Object 2 Data Fields: radius is 25 Circle Object 3 Data Fields: radius is 125 Three objects of the Circle class The three objects have different states (different value of radius), but have the same behavior (method getArea) as defined by the class which is the blueprint of an object. EE3206/EE5805 Java Programming & Application EE3206/EE5805 4 Classes •Classes are constructs that define objects of the same type. •A Java class uses variables to define data fields and methods to define behaviors. •Additionally, a class provides a special type of methods, known as constructors, which are invoked to construct objects from the class. EE3206/EE5805 Java Programming & Application EE3206/EE5805 5 Classes class Circle { /** The radius of this circle */ double radius = 1.0; /** Construct a circle object */ Circle() { } /** Construct a circle object */ Circle(double newRadius) { radius = newRadius; } /** Return the area of this circle */ double getArea() { return radius * radius * 3.14159; } } EE3206/EE5805 Java Programming & Application EE3206/EE5805 6 Data field Constructors Method UML Class Diagram UML Class Diagram Circle radius: double Circle() Circle(newRadius: double) getArea(): double Class name Data fields Constructors and Methods circle1: Circle radius: 10 circle2: Circle radius: 25 circle3: Circle radius: 125 UML notation for objects •Unified Modeling Language (UML) is a standardized specification language for object modeling. •It is a general-purpose modeling language that includes a graphical notation used to create an abstract model of a system, referred to as a UML model. EE3206/EE5805 Java Programming & Application EE3206/EE5805 7 Constructors Circle() { } Circle(double newRadius) { radius = newRadius; } •Constructors are a special kind of methods that are invoked to construct objects. •A constructor with no parameters is referred to as a no-arg constructor. •Constructors must have the same name as the class itself. •Constructors do not have a return type—not even void. EE3206/EE5805 Java Programming & Application EE3206/EE5805 8 Creating Objects Using Constructors • Constructors cannot be invoked as a normal method. They are invoked using the new operator when an object is created. Constructors play the role of initializing objects. You should place your code of initialization inside a constructor. new ClassName(); Example: new Circle(); new Circle(5.0); • EE3206/EE5805 Java Programming & Application EE3206/EE5805 9 Default Constructor •A class may be declared without constructors. In this case, a no-arg constructor with an empty body is implicitly declared in the class. •This constructor, called a default constructor, is provided automatically only if no constructors are explicitly declared in the class. EE3206/EE5805 Java Programming & Application EE3206/EE5805 10 Declaring Object Reference Variables Similar to declaring a variable of primitive data types, you can Similar declare a reference variable for an object, using the syntax: ClassName objectRefVar; Example: Circle myCircle; To reference an object, assign the object to a reference variable. To ClassName objectRefVar = new ClassName(); Example: Circle myCircle = new Circle(); If a data field of a reference type does not reference any object, If the data field holds a special literal value, null. EE3206/EE5805 Java Programming & Application EE3206/EE5805 11 Accessing Objects Referencing the object’s data: Referencing objectRefVar.data e.g., myCircle.radius myCircle.radius Invoking the object’s method: Invoking objectRefVar.methodName(arguments) e.g., myCircle.getArea() myCircle.getArea EE3206/EE5805 Java Programming & Application EE3206/EE5805 12 A Simple Circle Class Objective: Objective: • Demonstrate creating objects, accessing data, and using methods. TestCircle1 Run EE3206/EE5805 Java Programming & Application EE3206/EE5805 13 animation Trace Code Declare myCircle myCircle null Circle myCircle = new Circle(5.0); SCircle yourCircle = new Circle(); yourCircle.radius = 100; EE3206/EE5805 Java Programming & Application EE3206/EE5805 14 animation Trace Code, cont. Circle myCircle = new Circle(5.0); Circle yourCircle = new Circle(); yourCircle.radius = 100; null myCircle : Circle radius: 5.0 Create a circle EE3206/EE5805 Java Programming & Application EE3206/EE5805 15 animation Trace Code, cont. Circle myCircle = new Circle(5.0); Circle yourCircle = new Circle(); yourCircle.radius = 100; Assign object reference to myCircle reference value myCircle : Circle radius: 5.0 EE3206/EE5805 Java Programming & Application EE3206/EE5805 16 animation Trace Code, cont. Circle myCircle = new Circle(5.0); Circle yourCircle = new Circle(); yourCircle.radius = 100; myCircle reference value : Circle radius: 5.0 yourCircle null Declare yourCircle EE3206/EE5805 Java Programming & Application EE3206/EE5805 17 animation Trace Code, cont. Circle myCircle = new Circle(5.0); Circle yourCircle = new Circle(); yourCircle.radius = 100; myCircle reference value : Circle radius: 5.0 yourCircle null : Circle Create a new Circle object radius: 1.0 EE3206/EE5805 Java Programming & Application EE3206/EE5805 18 animation Trace Code, cont. Circle myCircle = new Circle(5.0); Circle yourCircle = new Circle(); yourCircle.radius = 100; myCircle reference value : Circle radius: 5.0 yourCircle reference value Assign object reference to yourCircle : Circle radius: 1.0 EE3206/EE5805 Java Programming & Application EE3206/EE5805 19 animation Trace Code, cont. Circle myCircle = new Circle(5.0); Circle yourCircle = new Circle(); yourCircle.radius = 100; myCircle reference value : Circle radius: 5.0 yourCircle reference value : Circle Change radius in yourCircle radius: 100.0 EE3206/EE5805 Java Programming & Application EE3206/EE5805 20 Caution Recall that you use: Math.methodName(arguments) (e.g., Math.pow(3, 2.5)) to invoke a method in the Math class. Can you invoke getArea() to using Circle1.getArea()? The answer is no. All the methods used before this chapter are static methods, static which are defined using the static keyword. However, getArea() is non-static. It must be invoked from an object using non objectRefVar.methodName(arguments) e.g., myCircle.getArea() More explanations will be given later. EE3206/EE5805 Java Programming & Application EE3206/EE5805 21 Reference Data Fields The data fields can be of primitive types or reference types. The Previously, we have mention that String is a reference types. Previously, For example, the following Student class contains mixed types For of data field. public class Student { String name; // name has default value null int age; // age has default value 0 boolean isScienceMajor; // isScienceMajor has default value false char gender; // c has default value '\u0000' } EE3206/EE5805 Java Programming & Application EE3206/EE5805 22 Default Value for a Data Field All data fields have a default values. All • • • • reference type = null numeric type = 0 boolean type = false char type = '\u0000' public class Test { public public static void main(String args) { Student student = new Student(); System.out.println("name? " + student.name); System.out.println("age? " + student.age); System.out.println("isScienceMajor? " + student.isScienceMajor); System.out.println("gender? " + student.gender); } } EE3206/EE5805 Java Programming & Application EE3206/EE5805 23 No Default Value for Local Variables However, Java assigns no default value to a local variable inside a method. public class Test { public static void main(String args) { int x; // x has no default value String y; // y has no default value System.out.println("x is " + x); System.out.println("y is " + y); } } Compilation error: variables not initialized EE3206/EE5805 Java Programming & Application EE3206/EE5805 24 Differences between Variables of Primitive Data Types and Object Types Created using new Circle() Primitive type Object type int i = 1 Circle c i c 1 reference c: Circle radius = 1 EE3206/EE5805 Java Programming & Application EE3206/EE5805 25 Copying Variables of Primitive Data Types and Object Types Primitive type assignment i = j Before: After: 1 2 i j 2 2 Not being referenced now Garbage i j Object type assignment c1 = c2 Before: c1 c2 After: c1 c2 c1: Circle radius = 5 C2: Circle radius = 9 C2: Circle 1: Circle EE3206/EE5805 JavacProgramming & Application EE3206/EE5805 radius = 5 radius = 9 26 Garbage Collection As shown in the previous figure, after the assignment As statement c1 = c2, c1 points to the same object referenced by c2. The object previously referenced by c1 is no longer The referenced. This object is known as garbage. Garbage is automatically collected by JVM. Garbage TIP: If you know that an object is no longer needed, you TIP: can explicitly assign null to a reference variable for the object. The JVM will automatically collect the space if the object is not referenced by any variable. EE3206/EE5805 Java Programming & Application EE3206/EE5805 27 The Date Class java.util.Date: • You can use the Date class to create an instance for the current date and time and use its toString method to return the date and time as a string. • For Example: java.util.Date date = new java.util.Date(); System.out.println(date.toString()); displays a string like Sun Mar 09 13:50:19 EST 2003. The + sign indicates public modifer java.util.Date +Date() +Date(elapseTime: long) +toString(): String +getTime(): long Constructs a Date object for the current time. Constructs a Date object for a given time in milliseconds elapsed since January 1, 1970, GMT. Returns a string representing the date and time. Returns the number of milliseconds since January 1, 1970, GMT. 28 +setTime(elapseTime: long): Programming & Application time in the object. void Sets a new elapse EE3206/EE5805 Java EE3206/EE5805 The Random Class You have used Math.random() to obtain a random double value between 0.0 and 1.0 (excluding 1.0). A more useful random number generator is provided in the java.util.Random class. java.util.Random +Random() +Random(seed: long) +nextInt(): int +nextInt(n: int): int +nextLong(): long +nextDouble(): double +nextFloat(): float +nextBoolean(): boolean Constructs a Random object with the current time as its seed. Constructs a Random object with a specified seed. Returns a random int value. Returns a random int value between 0 and n (exclusive). Returns a random long value. Returns a random double value between 0.0 and 1.0 (exclusive). Returns a random float value between 0.0F and 1.0F (exclusive). Returns a random boolean value. EE3206/EE5805 Java Programming & Application EE3206/EE5805 29 The Random Class Example If two Random objects have the same seed, they will generate identical sequences of numbers. For example, the following code creates two Random objects with the same seed 3. Random random1 = new Random(3); System.out.print("From random1: "); for (int i = 0; i < 10; i++) System.out.print(random1.nextInt(1000) + " "); Random random2 = new Random(3); System.out.print("\nFrom random2: "); for (int i = 0; i < 10; i++) System.out.print(random2.nextInt(1000) + " "); From random1: 734 660 210 581 128 202 549 564 459 961 From random2: 734 660 210 581 128 202 549 564 459 961 EE3206/EE5805 Java Programming & Application EE3206/EE5805 30 Static & Non-static Non-static (Instant/Object) • Instance variables belong to a specific instance. • Instance methods are invoked by an instance of the class. Static (Class) • Static variables are shared by all the instances of the class. • Static methods are not tied to a specific object. • Static constants are final variables shared by all the instances of the class. • To declare static variables, constants, and methods, use the static modifier. EE3206/EE5805 Java Programming & Application EE3206/EE5805 31 Static Variables, Constants, and Methods instantiate circle1 radius = 1 numberOfObjects = 2 Memory 1 radius Circle radius: double numberOfObjects: int 2 getNumberOfObjects(): int +getArea(): double instantiate circle2 radius = 5 numberOfObjects = 2 5 numberOfObjects radius UML Notation: underline: static variables or methods Each object has it’s own radius (instance variable), but both circle1 and circle2 share the same numberOfObjects (class variable). EE3206/EE5805 Java Programming & Application EE3206/EE5805 32 Example of Using Instance and Class Variables and Method Objective: Objective: • Demonstrate the roles of instance and class variables and their uses. This example adds a class variable numberOfObjects to track the number of Circle objects created. TestCircle2 Run EE3206/EE5805 Java Programming & Application EE3206/EE5805 33 Visibility Modifiers and Accessor/Mutator Methods By default, the class, variable, or method can be By accessed by any class in the same package. public public • The class, data, or method is visible to any class in any package. private private • The data or methods can be accessed only by the declaring class. • The get and set methods are used to read and modify private properties. EE3206/EE5805 Java Programming & Application EE3206/EE5805 34 package p1; public class C1 { public int x; int y; private int z; public void m1() { } void m2() { } private void m3() { } } public class C2 { void aMethod() { C1 o = new C1(); can access o.x; can access o.y; cannot access o.z; can invoke o.m1(); can invoke o.m2(); cannot invoke o.m3(); } } package p2; public class C3 { void aMethod() { C1 o = new C1(); can access o.x; cannot access o.y; cannot access o.z; can invoke o.m1(); cannot invoke o.m2(); cannot invoke o.m3(); } } package p1; class C1 { ... } public class C2 { can access C1 } package p2; public class C3 { cannot access C1; can access C2; } •The private modifier restricts access to within a class; •The default modifier restricts access to within a package; • The public modifier enables unrestricted access. EE3206/EE5805 Java Programming & Application EE3206/EE5805 35 NOTE An object cannot access its private members, as shown in (b). It is OK, however, if the object is declared in its own class, as shown in (a). public class Foo { private boolean x; public static void main(String args) { Foo foo = new Foo(); System.out.println(foo.x); System.out.println(foo.convert()); } private int convert(boolean b) { return x ? 1 : -1; } } (a) This is OK because object foo is used inside the Foo class (b) This is wrong because x and convert are private in Foo. public class Test { public static void main(String args) { Foo foo = new Foo(); System.out.println(foo.x); System.out.println(foo.convert(foo.x)); } } EE3206/EE5805 Java Programming & Application EE3206/EE5805 36 Data Field Encapsulation Why data fields should be private? •To protect data. •To make class easy to maintain. Circle The - sign indicates private modifier -radius: double -numberOfObjects: int +Circle() +Circle(radius: double) +getRadius(): double +setRadius(radius: double): void +getNumberOfObject(): int +getArea(): double The radius of this circle (default: 1.0). The number of circle objects created. Constructs a default circle object. Constructs a circle object with the specified radius. Returns the radius of this circle. Sets a new radius for this circle. Returns the number of circle objects created. Returns the area of this circle. TestCircle3 mutator EE3206/EE5805 Java Programming & Application EE3206/EE5805 accessor 37 Run Immutable Objects and Classes If the contents of an object cannot be changed once the object is created, the object is called an immutable object and its class is immutable called an immutable class. immutable If you delete the set method in the Circle class in the preceding example, the class would be immutable because radius is private and cannot be changed without a set method. A class with all private data fields and without mutators is not necessarily immutable. For example, the following class Student has all private data fields and no mutators, but it is mutable. EE3206/EE5805 Java Programming & Application EE3206/EE5805 38 Example public class Student { private int id; private BirthDate birthDate; public Student(int ssn, int year, int month, int day) { id = ssn; birthDate = new BirthDate(year, month, day); } public int getId() { return id; } public BirthDate getBirthDate() { return birthDate; } } public class Test { public static void main(String args) { Student student = new Student(111223333, 1970, 5, 3); BirthDate date = student.getBirthDate(); date.setYear(2010); // Now the student birth year is changed! } EE3206/EE5805 Java Programming & Application EE3206/EE5805 } public class BirthDate { private int year; private int month; private int day; public BirthDate(int newYear, int newMonth, int newDay) { year = newYear; month = newMonth; day = newDay; } public void setYear(int newYear) { year = newYear; } } 39 What Class is Immutable? For a class to be immutable, it must mark all data fields private, 1. provide no mutator methods, and 2. 2. provide no accessor methods that would 3. return a reference to a mutable data field object. EE3206/EE5805 Java Programming & Application EE3206/EE5805 40 Passing Objects to Methods Passing by value for primitive type value (the value is Passing passed to the parameter) Passing by value for reference type value (the value is the Passing reference to the object) Stack Space required for the printAreas method int times: 5 Circle c: reference Space required for the main method int n: 5 myCircle: reference Pass by value (here the value is 5) Pass by value (here the value is the reference for the object) Heap A circle object TestPassObject Run EE3206/EE5805 Java Programming & Application EE3206/EE5805 41 Scope of Variables The scope of instance and static variables is the The entire class. They can be declared anywhere inside a class, though this is not preferred (lower readability). The scope of a local variable starts from its The declaration and continues to the end of the block that contains the variable. A local variable must be initialized explicitly before it can be used. EE3206/EE5805 Java Programming & Application EE3206/EE5805 42 The this Keyword public class Circle { private double radius; public Circle(double radius) { this.radius = radius; } this must be explicitly used to reference the data field radius of the object being constructed public Circle() { this(1.0); } this is used to invoke another constructor public double getArea() { return this.radius * this.radius * Math.PI; } } Every instance variable belongs to an instance represented by this, which is normally omitted Use this to refer to an instance data field. Use Use this to invoke an overloaded constructor of the Use same class. EE3206/EE5805 Java Programming & Application EE3206/EE5805 43 Array of Objects Circle circleArray = new Circle[10]; An array of objects is actually an array of reference An array variables. So invoking circleArray[1].getArea() involves two levels of referencing as shown in the figure. circleArray references to the entire array. circleArray[1] references to a Circle object. circleArray reference circleArray[0] circleArray[1] … Circle object 0 Circle object 1 Circle object 9 circleArray[9] EE3206/EE5805 Java Programming & Application EE3206/EE5805 44 Array of Objects, cont. Summarizing the areas of ten Summarizing randomly generated circles TotalArea Run EE3206/EE5805 Java Programming & Application EE3206/EE5805 45 Class Abstraction and Encapsulation Class abstraction means to separate class Class implementation from the use of the class. • The creator of the class provides a description of the class and let the user know how the class can be used. The user of the class does not need to know how the class is implemented. The detail of implementation is encapsulated and hidden from the user. encapsulated Class implementation is like a black box hidden from the clients Class Class Contract (Signatures of public methods and public constants) Clients use the class through the contract of the class EE3206/EE5805 Java Programming & Application EE3206/EE5805 46 More Examples EE3206/EE5805 Java Programming & EE3206/EE5805 Application EE3206/EE5805 Java Programming & Application 47 Example: The Loan Class Loan -annualInterestRate: double -numberOfYears: int -loanAmount: double -loanDate: Date +Loan() +Loan(annualInterestRate: double, numberOfYears: int, loanAmount: double) +getAnnualInterestRate(): double +getNumberOfYears(): int +getLoanAmount(): double +getLoanDate(): Date The annual interest rate of the loan (default: 2.5). The number of years for the loan (default: 1) The loan amount (default: 1000). The date this loan was created. Constructs a default Loan object. Constructs a loan with specified interest rate, years, and loan amount. Returns the annual interest rate of this loan. Returns the number of the years of this loan. Returns the amount of this loan. Returns the date of the creation of this loan. +setAnnualInterestRate( Sets a new annual interest rate to this loan. annualInterestRate: double): void Sets a new number of years to this loan. +setNumberOfYears( numberOfYears: int): void +setLoanAmount( loanAmount: double): void +getMonthlyPayment(): double +getTotalPayment(): double Sets a new amount to this loan. Returns the monthly payment of this loan. Returns the total payment of this loan. TestLoanClass Run EE3206/EE5805 Java Programming & Application EE3206/EE5805 48 Example: The Course Class Course -name: String -students: String -numberOfStudents: int +Course(name: String) +getName(): String The name of the course. The students who take the course. The number of students (default: 0). Creates a Course with the specified name. Returns the course name. +addStudent(student: String): void Adds a new student to the course list. +getStudents(): String Returns the students for the course. +getNumberOfStudents(): int Returns the number of students for the course. TestCourse Run EE3206/EE5805 Java Programming & Application EE3206/EE5805 49 ...
View Full Document

Ask a homework question - tutors are online