1 cs 177 week 11 recitation slides class design/custom classes

20
1 CS 177 Week 11 Recitation Slides Class Design/Custom Classes

Upload: ralf-lambert

Post on 18-Jan-2016

214 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 1 CS 177 Week 11 Recitation Slides Class Design/Custom Classes

1

CS 177 Week 11 Recitation Slides

Class Design/Custom Classes

Page 2: 1 CS 177 Week 11 Recitation Slides Class Design/Custom Classes

2

Announcements Project 4 due 9 pm. Sunday April 4

Page 3: 1 CS 177 Week 11 Recitation Slides Class Design/Custom Classes

3

ANY QUESTIONS?

Page 4: 1 CS 177 Week 11 Recitation Slides Class Design/Custom Classes

4

Class Design Techniques

Reusability: want to create a class that can be useful to programmers over a period of time without making significant changes.

Documentation: class should be thoroughly documented to allow users/programmers to know exactly how to use your class without ever seeing your code

“Less is More”: class should be easy to follow and use. Too many methods and variables can be confusing. Try to have as many static and constant members as possible in order to make your class as easy to use as possible

Future Proof: designing a class that can be useful in an unpredictable future can be difficult. Design the class to be flexible to allow for easy updates as technology advances

Privacy: Try to hide as much data as possible (i.e. private members) to prevent corruption

Page 5: 1 CS 177 Week 11 Recitation Slides Class Design/Custom Classes

5

Class Variables

Remember all classes have properties and methods. The properties and methods that makeup a class are

called members of the class By default, members are associated with the object

created as an instance of the class, but not the class itself

To create members that are directly associated with the class, use the static keyword. These members are also known as class variables.

Page 6: 1 CS 177 Week 11 Recitation Slides Class Design/Custom Classes

6

Static Members

Remember: static members can be accessed by static and regular methods, but non-static members cannot be accessed by static methods.

Static members can be either public or private like non-static members

How can you tell a static member by looking at the code? Give some examples of static members you’ve used so far in the course. Math.random(), Math.cos() System.out.print() StdIn.readInt()

Page 7: 1 CS 177 Week 11 Recitation Slides Class Design/Custom Classes

7

Static.java Example public class Item { private static int count = 0; private String name; public Item(String s) { name = s; count++; } public String getName() { return name; } public static int getItemsInUnviverse() { return count; } }

public class Static { public static void main(String args[]) { Item item1 = new Item("book"); System.out.println("Name of item1: " +

item1.getName()); Item item2 = new Item("car"); System.out.println("Name of item2: " +

item2.getName()); System.out.println("Total Number of

items: " + Item.getItemsInUnviverse()); } }

Would it make sense to declare the class member name as static?

Page 8: 1 CS 177 Week 11 Recitation Slides Class Design/Custom Classes

8

Static.java Continued

What if we attempted this:

public class Item { private static int count = 0; private String name; public Item(String s) { name = s; count++; } public String getName() { return name; } public static int getItemsInUnviverse() { System.out.println("Current name is " + name); return count; } }

Why would this code result in a compile time error?

A static method cannot access a non-static member

Page 9: 1 CS 177 Week 11 Recitation Slides Class Design/Custom Classes

9

Constants

Used to specify members that will not change after the object has been created

Constants are declared in Java with the final keyword Constants can only be assigned a value once and will

never change afterwards Static members can also be declared as constant (useful

for global data that will never change)

Page 10: 1 CS 177 Week 11 Recitation Slides Class Design/Custom Classes

10

Constant.java Example public class Phone { private final String number; private double price; public Phone(String s, double p) { number = s; price = p; } public double getPrice() { return price; } public String changeNumber(String s) { number = s; return number; } }

What is wrong with this code? Compile time error because you can’t

assign a value to the final variable “number”

Page 11: 1 CS 177 Week 11 Recitation Slides Class Design/Custom Classes

11

Inheritance In Java

In Java, you can create a subclass that inherits from a superclass Key idea: children inherit from the parents and parents pass on

attributes to children Child class has access to all of parents members (properties and

methods) Child can have their own members on top of those of the parents

(child considered to be a specialized version of the parent) Inheritance is an important mechanism of code reuse The protected keyword is used to protect class members across all

inherited classes as well. In other words, protected members are “private” to the entire family of classes.

Page 12: 1 CS 177 Week 11 Recitation Slides Class Design/Custom Classes

12

Overriding Methods In Java

Overriding a method describes when a child class has a member method that has the same name, number of parameters, and type of each parameter as the parent method. However, the body of the method may be different.

In these cases, the child’s version is always used for instances of that child class

Note the move() method in the following examples

Page 13: 1 CS 177 Week 11 Recitation Slides Class Design/Custom Classes

13

Custom Class Example

Now let’s go through a detailed example. I will introduce a family of classes with the Animal class being the parent.

Feel free to make changes along the way to ensure the concepts are clear

Page 14: 1 CS 177 Week 11 Recitation Slides Class Design/Custom Classes

14

Animal.java Class public class Animal { protected double weight; protected static int count; protected final boolean carnivore; protected String location; public Animal(double w, boolean c, String l) { weight = w; carnivore = c; location = l; count++; } public double getWeight() { return weight; } public boolean isCarnivore() { return carnivore; } public String getLocation() { return location; } public static int getAnimalPopulation() { return count; } public static void move() { System.out.println("I am an animal that is moving"); } }

The Animal.java class is our parent class. Thus, it doesn’t extend any other classes

Note the protected declaration for its members. These members need to be accessible from the child classes.

Note that the move function is a static function. Why does this make sense?

Page 15: 1 CS 177 Week 11 Recitation Slides Class Design/Custom Classes

15

Fish.java SubClass public class Fish extends Animal { protected int numFins; protected String type; public Fish(double w, boolean c, int nf, String t)

{ super(w, c, "ocean"); numFins = nf; type = t; } public int getNumFins() { return numFins; } public String getType() { return type; } public static void move() { System.out.println("I am a fish that swims"); } }

Note that the super keyword is used to reference the parent constructor.

The unique members, numFins and type, are defined outside of the super constructor.

Why is it not necessary to increase the static count variable within the Fish constructor?

Notice that the move() method is being overridden. For any Fish object, this is the version that will be used

Page 16: 1 CS 177 Week 11 Recitation Slides Class Design/Custom Classes

16

JellyFish.java SubClass public class JellyFish extends Fish { protected String color; public JellyFish(double w, boolean c, int nf,

String t, String col) { super(w, c, nf, t); color = col; } public String getColor() { return color; } public static void move() { System.out.println("\nI am jellyfish and move

gracefully!"); } public static void attack() { System.out.println("You just got stung by a

jellyfish!!"); } }

Notice the new method attack() on the bottom. Why does it makes sense for this method to be static as well?

Page 17: 1 CS 177 Week 11 Recitation Slides Class Design/Custom Classes

17

StarFish.java SubClass public class StarFish extends Fish { protected int numArms; public StarFish(double w, boolean c, String t) { super(w, c, 0, t); numArms = 5; } public int getNumArms() { return numArms; } public static void move() { System.out.println("\nI am starfish. I can't move!"); }

public void loseArm() { if(numArms > 0) { numArms--; System.out.println("OH NO! You lost an arm!"); } } }

Here we see a constant member numArms. It is assigned a value only once in the constructor for this subclass

loseArm() subtracts an arm if the StarFish still has one

Page 18: 1 CS 177 Week 11 Recitation Slides Class Design/Custom Classes

18

Inheritance.java Example public class Inheritance { public static void main(String args[]) { Animal lion = new Animal(300, true, "grasslands"); System.out.print("Characteristics of a lion: \n"); System.out.println("Weight: " + lion.getWeight()); System.out.println("Carnivore: " + lion.isCarnivore()); System.out.println("Location: " + lion.getLocation()); Fish shark = new Fish(800, true, 1, "shark"); System.out.print("\nCharacteristics of a shark: \n"); System.out.println("Weight: " + shark.getWeight()); System.out.println("Carnivore: " + shark.isCarnivore()); System.out.println("Location: " + shark.getLocation()); System.out.println("Number of Fins: " + shark.getNumFins()); System.out.println("Type: " + shark.getType()); StarFish.Move(); JellyFish.Move(); JellyFish.Attack(); StarFish superstar = new StarFish(10, false, "starfish"); System.out.print("\nUnique Characteristics of a starfish: \n"); System.out.println("Carnivore: " + superstar.isCarnivore()); System.out.println("Number of Fins: " +

superstar.getNumFins()); System.out.println("Number of arms: " +

superstar.getNumArms()); System.out.println("\nTotal population of animals: " +

Animal.getAnimalPopulation()); } }

Notice how we called our static methods move() and attack(). There are no JellyFish or StarFish objects at this point

How many animals would have been counted if we included the count++ code in all of the constructors?

6

Page 19: 1 CS 177 Week 11 Recitation Slides Class Design/Custom Classes

19

Output from Inheritance.java Characteristics of a lion: Weight: 300.0 Carnivore: true Location: grasslands

Characteristics of a shark: Weight: 800.0 Carnivore: true Location: ocean Number of Fins: 1 Type: shark

I am starfish. I can't move!

I am jellyfish and move gracefully! You just got stung by a jellyfish!!

OH NO! You lost an arm! Unique Characteristics of a starfish: Carnivore: false Number of Fins: 0 Number of arms: 4 OH NO! You lost an arm! Number of arms:3

Total population of animals: 3

Page 20: 1 CS 177 Week 11 Recitation Slides Class Design/Custom Classes

20

Final QUESTIONS???