Basic -2 Classes and Objects. Classes and Objects A class is a complex data TYPE An object is an...
-
Upload
cali-blease -
Category
Documents
-
view
252 -
download
0
Transcript of Basic -2 Classes and Objects. Classes and Objects A class is a complex data TYPE An object is an...
Basic -2Classes and Objects
Classes and Objects
A class is a complex data TYPE An object is an instance of a class. Example:
Class: Person Objects: several Person instances are
all around you
Trivial Example: Class Person A Person has some properties
Attributes or fields In addition it may have some behavior
methods A java class defines properties and
behavior common to all people (all Person objects)
Each person gets their own field copies
Class Person - example
class Person {
String name;
int height; // in inches
int weight; // in pounds
// we’ll worry about methods later
void setWeight(int newWeight) { }
void setHeight(int newHeight){ }}
Objects An object is an instance of a class type
An object variable is a reference to the object’s data structure Object variable can be seen as a pointer
Declaring an object variabile != creating an object Declaration provides a null pointer Must create an object with the new
keyword Calls a constructor method of the class
(optionally with arguments) Dynamic allocation
Person p1;
p1 = new Person();
p1.name = “ your name”;
Variable declaration
Object instantiatio
n
Object Variables
Multiple variables can point to same object
A variable can point to NO object its value is null
NOTE: passing an object as parameter in a method actually passes a copy of the reference Method manipulates the
same referenced object
Person p1, p2; p1=new Person(); p1.name = “John”; p2 = p1; System.out.println(p1.name);System.out.println(p2.name);
{ Person p3; p3=new Person(); p3.name = “Dan”; p2=p3; System.out.println(p2.name); }
Illustration
p1
p3
name: “John”height: 0weight: 0
name: “Dan”height: 0weight: 0
p2
Java graciously initializes primitive
fields for you
Object creation caveats
What if we don’t use new?Person p;
System.out.println(p.name);
H:>javac Person.java
Person.java:15: Variable p may not have been initialized.
System.out.println(p.name);
^
1 error
Second Try
Person p = new Person();
p = null;
System.out.println(p.name);
Compilation works fine but …
H:>java Person
Exception in thread "main" java.lang.NullPointerException:
at Person.main(Person.java:16)
Object equality: ==
RECALL: variables are referencesPerson p1 = new Person();Person p2 = new Person();p1.name = “Jane”;p2.name = “Jane”;If(p1 == p2) System.out.println(“Same!");else System.out.println(“Different!");
: Person“Jane ”
: Person“Jane”
p1
p2
More on equality: equals() All classes are equipped with a
method equals() For comparing objects of same classCan be (re-)defined wrt class logic
boolean equals(Person otherPerson) { if name.equals(otherPerson.name) {
System.out.println(“Same!");return true;
} System.out.println(“Different!"); return false;}
Object Destruction
Programmer cannot explicitly destroy an instantiated object
JVM takes care of “garbage collection” Implicitly frees up memory from “useless” objects
Object is useless when program keeps no more references to it e.g when program exits the context where object was
created (block, method variables) Or when variables point to other objects or are
assigned the null value
Let’s play around with Person …p1.weight = 200; // bad but dealable
p1.weight = 700; // unfortunate, but possible
p1.weight = -20; // unreal
Solution: Have class modify attribute. Allows sanity checks.
Provide that behavior through a method
p1.setWeight(700); // OK. Weight is now 700.
p1.setWeight(-20);
*** Error, weight must be positive number
// weight still 700
Solution? …
class Person {
…
void setWeight(int newWeight) {
if (newWeight < 0)
System.err.println(
“*** Error, weight must be positive number”);
else
weight = newWeight;
}
… New problem
p1.setWeight(-20);*** Error, weight must be positive
number
p1.weight = -20; // Yo, I’m the boss
Assigning weight directly bypasses sanity check by the setWeight() method. We still have a problem.
Solution: change attribute visibility to make the bare weight attribute inaccessible from outside Person
New solution
Class Person {private String name;private int height; // in inchesprivate int weight; // in pounds
public void setWeight(int newWeight) {if (newWeight < 0)
System.err.println(“*** Error, weight must be positive number”);
elseweight = newWeight;
}} Within same class
no dot notation and no visibility issues
New solution in action
class Test { public static void main(String args[]) { Person p1 = new Person(); p1.weight = 20; }}
>javac Test.java>Test.java:4: Variable weight in class Person not
accessible from class Test. p1.weight = 20; ^1 error
Denied!
Finish up
Need to add a getWeight(), since we can no longer access weight directly
public int getWeight(void) {
return weight;}
Also, need get() and set() functions for name and height.
Accessor Functions for Encapsulation
Generally make fields private and provide public getField() and setField() accessor functions.
For this course – ALWAYS unless there’s a specific reason not to Usually there isn’t Need to justify explicitly otherwise!
Encapsulation keeps programs tidy Enables clear definition of interactions between classes
Public parts of a class represents its Application Programming Interfaces (API)
Private parts hide details of the class implementation If interface remains stable, even if implementation changes, the
rest of application is unaffected Example: height in cm. and weight in Kg.
More on Visibility
Methods / Attributes public private package (default) protected
/** Represents a 2d geometric point */package 2d;class Point {
private float x,y; // coordinates
public Point(float coordX, float coordY){ x=coordX; y=coordY; } public void move(float dX, float dY){ x+=dX; y+=dY; } public String desc(){ return “Point (" + x + ", " + y + ")"; }}
Constructor with parameters
Point
- float x,y
+ Point(float, float)+ move(float dx, float dy) + String desc() At-a-glance look
at the class API
Constructors Multiple constructors with
different sets of parameters No need to specify result type
new operator invoked with parameters matching those of some constructor
If programmer provides no constructor, Java provides default constructor (no parameters)
public class Point {
private float x,y;
public Point() { x=y=0; // same as default }
public Point(float coordX, float coordY) { x=coordX; y=coordY; }
public Point(float xy) { this(xy,xy); }}
Constructor chaining
Default Constructor
Takes no parameters, initializes everything to defaults 0, null etc.
Graciously provided by Java for absent-minded programmers ;-)
Only exists if there are no explicitly defined constructors
Any constructor, even one taking parameters, means no default
Overloading
Multiple constructors is a prominent example of overloading
Multiple methods can have same name but different signatures
public class Point {
private float x,y;
public void move(float dx, float dy){ x+=dx; y+=dy; }
public void move(float dxy){ move(dxy, dxy); }}
Strings Strings in Java are objects of class
java.lang.StringJava.lang is a fundamental libraryString has a lot of nice features:
check it out in the java API!
Turning objects into Strings
All classes have a method toString() to provide a textual description of objects
Can be (re-)defined wrt class logic
public class Person { ... public String toString() {
String ret;ret = name + “ is tall ”;ret += height;ret += “ inches and weighs ”;ret += weight;ret += “ pounds.” return ret;
} ...}
Turning objects into Strings
toString()can be invoked implicitllyWhen object is used within String
manipulation operationsPerson assistant=new Person(“Mike”);
System.out.println(“the assistant is: "+ assistant);
Summary
Introduction to the Java language What is Java, what is a Java program Style, Javadocs
Language basics Types, variables Classes, objects, arrays Visibility and encapsulation
Some utilities String, toString() System.out