Download Notes

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Lecture Notes
CPSC 326 (Fall 2011)
Today ...
• Java (cont.)
• Start on PL implementation
Reading
• Ch 4
Reminders
• HW 8a and b due
• Proj 1 due
• Proj 2 out
S. Bowers
1 of 13
Lecture Notes
CPSC 326 (Fall 2011)
Arrays
Statically defining an array
int[] theArray = {100, 10, 1000, 20, 200};
Accessing elements
theArray[0];
theArray[1];
theArray[5];
// returns 100
// returns 10
// IndexOutOfBounds Exception (error)
Use length to get the length of an array
len = theArray.length;
Using arrays in loops
for(int i = 0; i < theArray.length; i++)
System.out.println(theArray[i]);
• Or just use a foreach loop
for(int x : theArray)
System.out.println(x);
• Much cleaner ... use foreach whenever possible
S. Bowers
2 of 13
Lecture Notes
CPSC 326 (Fall 2011)
More on declaring Java arrays
• These are all equivalent
int[] theArray;
int [] theArray;
int theArray[];
int theArray [];
// the "standard" approach
// C++ style
• This is not allowed in Java:
int[5] theArray;
• Instead do this:
int[] theArray = new int[5];
• note each element is initialized to a default value
• also, once you declare an array, you cannot initialize it again with a constant
• but you can do this:
theArray = {1, 2, 3, 4, 5};
theArray = new int[] {1, 2, 3, 4, 5};
// compile error
// this works
Array variables are references to array objects
• This means we have to be careful with assignment
int[] smallPrimes = {2, 3, 5, 7};
int[] luckyNumbers = smallPrimes;
luckyNumbers[3] = 8;
S. Bowers
// changes smallPrimes!
3 of 13
Lecture Notes
CPSC 326 (Fall 2011)
Strings
In Java, String (objects) are immutable
• This means String operations always return new strings
• E.g., concatenation (str1 + str2 returns a new String)
• Lots of String helper functions (substring, trim, toLowerCase, indexOf, ...)
S. Bowers
4 of 13
Lecture Notes
CPSC 326 (Fall 2011)
Objects
When you create a new object in Java
• The JVM allocates memory space on the heap
• All Java objects live in the heap
• When an object isn’t needed, the JVM frees up the space for you
• This is done via automatic “garbage collection”
• The garbage collector (JVM) looks for unreachable objects
Example:
1.
2.
3.
4.
5.
6.
7.
8.
Book b = new Book();
Book c = new Book();
Bood d = c;
c = new Book();
d = c;
d = null;
d.getTitle();
b = null;
//
//
//
//
//
//
d references same object as c
c now references a new object
now there is a non-referenced object!
d is now a "null" reference
this generates a NullPointerException
old b object can now be garb. collected
Arrays of object references
Q: What happens to the heap after this statement?
Book[] books = new Book[3];
• Each element in the books array is a null reference
Q: What happens if we call: books[1].turnPage()
• We get a NullPointerException!
S. Bowers
5 of 13
Lecture Notes
CPSC 326 (Fall 2011)
Class Inheritance
Subclassing is done using the “extends” keyword
public class Ball extends Shape {
...
}
• Java only supports “public” inheritance
Implicit versus explicit parameters
• Methods define their “explicit” parameters
public void bounce(int numOfBounces)
– numOfBounces is the implicit parameter
• When a method is called on an object ... the object is passed as an
“implicit” parameter
Ball b = new Ball();
b.bounce(5);
// like calling bounce(b, 5)
• Use the this keyword to access the implicit object parameter ...
public void bounce(int numOfBounces) {
for(int i = 0; i < numbOfBounces; i++)
this.bounce();
}
S. Bowers
6 of 13
Lecture Notes
CPSC 326 (Fall 2011)
Inheritance and Constructors
Constructors are not inherited
• Must define needed constructors for each class
public class Shape {
private String name;
public Shape(String name) {
this.name = name;
}
}
// older convention
public class Ball extends Shape {
public Ball(String theName) {
name = theName;
}
}
Q: What is wrong with the above?
– name is private in Shape
– Instead, call the superclass constructor ...
public class Ball extends Shape {
public Ball(String theName) {
super(theName);
}
}
• super must be the first statement in the constructor
S. Bowers
7 of 13
Lecture Notes
CPSC 326 (Fall 2011)
Casting Objects
Sometimes we need to cast objects to other types
Shape s = new Ball();
Ball b = (Ball)s;
Block d = (Block)a;
// should this work?
// should this work?
• We are circumventing the type system when we cast
• So you have to be very careful!
The Java Cosmic Superclass
All class (implicitly) extend the Object class
• So if we have:
public class Shape {
...
}
• We really have:
public class Shape extends Object {
...
}
• this means ... we always have a common superclass!
Object obj1 = new Ball();
Object obj2 = new Block();
S. Bowers
8 of 13
Lecture Notes
CPSC 326 (Fall 2011)
Object[] anArray = new Object[2] {obj1, obj2};
for(Object obj : anArray)
...
The Object class defines many useful methods
• public String toString()
– returns a string representation of the object
– Called whenever object is cast to a String ...
– Including: "" + obj and System.out.println(obj)
• public boolean equals(Object obj)
– checks equality
public boolean equals(Object obj) {
if(!(obj instanceof Ball))
return false;
Ball that = (Ball)obj;
... check this the same as that ...
}
• public Object clone()
– Creates a copy
S. Bowers
9 of 13
Lecture Notes
CPSC 326 (Fall 2011)
Method Overriding in Java
Q: What is method overriding?
• redefine/tailor a base class method in a derived class
• derived class method must have the same signature as base class
Q: What is overloading? How does it differ?
public class Ball {
...
public void hitWith(Bat theBat) {
move(theBat.getVelocity());
}
}
public class Baseball extends Ball {
...
public void hitWith(Bat theBat) {
if(!(theBat instanceof BaseballBat))
return;
else
hitWith(theBat);
// tries to call super’s hitWith
}
}
Q: Is there a problem here?
– We’re calling the same method!!!
• Instead, we can use the super keyword
S. Bowers
10 of 13
Lecture Notes
CPSC 326 (Fall 2011)
public class Baseball extends Ball {
...
public void hitWith(Bat theBat) {
if(!(theBat instanceof BaseballBat))
return;
else
super.hitWith(theBat);
}
}
Dynamic Binding in Java
• When we do this:
Ball b = new Baseball();
b.hitWith(new BaseballBat());
Q: What should happen?
– The object’s version of the method should be called
– Not the more generic version in Ball
• This is called “dynamic” binding
– Methods are bound at runtime (as opposed to compile time)
– Java mostly uses dynamic binding
– In C++, we have to use the virtual keyword
S. Bowers
11 of 13
Lecture Notes
CPSC 326 (Fall 2011)
Java Interfaces
In Java, a class can subclass (extend) at most one other class
• Different than C++, which allows “multiple” inheritance
Java provides interfaces as a workaround
• An interface is like a fully abstract class
• None of the methods are implemented
• Every class implementing an interface must implement all the methods
• Or else be declared as an abstract class
public interface Shape {
public static final int MAX_SIZE = 109;
public void move();
public Color getColor();
...
}
public interface RoundThing {
public double getRadius();
}
public class Ball implements Shape, RoundThing {
public void move() {
...
}
public Color getColor() {
...
}
S. Bowers
12 of 13
Lecture Notes
CPSC 326 (Fall 2011)
public double getRadius() {
...
}
...
}
• Technically, all methods in a public interface are public
• But good practice to put public anyway
• Interfaces can be used as types!
Shape s = new Ball();
s.move();
Q: Why would we want to do this?
– Allows us to decouple our code from any particular implementation
S. Bowers
13 of 13