Derek Banas created a great simple video quickly describing Design Patterns. Here is the link - https://youtu.be/vNHpsC5ng_E
I am going to text type out the principles discussed below.
class Animal{
private String name;
private double height;
private int weight;
public void setName(String newName){
name = newName;
}
}
class Dog extends Animal{
public void digHole(String newName){
System.out.println("Hole dug");
}
}
Dog grover = new Dog();
grover.setName("Grover");
grover.name = "Grover"; //do not do this!!! (this gets rid of encapsulation)
}
class Dog extends Animal{
String name;
double height;
int weight;
public void setWeight(int newWeight){
if(newWeight > 0){
weight= newWeight;
}
else{
//throw error
}
}}
class Dog extends Animal{
private String name;
private double height;
private int weight;
public void setName(String newName){
name = newName;
}
I am going to text type out the principles discussed below.
What is inheritance?
- What do the classes have in common?
- Abstract out the features
- Override or extend methods that don't work
- "is a" relationship
class Animal{
private String name;
private double height;
private int weight;
public void setName(String newName){
name = newName;
}
}
class Dog extends Animal{
public void digHole(String newName){
System.out.println("Hole dug");
}
}
- Fields and methods are already defined when you extend the super class (aka "parent class")
- You define only the changes
What is main for?
- main creates the objects and then they interact
Dog grover = new Dog();
grover.setName("Grover");
grover.name = "Grover"; //do not do this!!! (this gets rid of encapsulation)
}
What is encapsulation?
- Allows you do to data hiding
- This is done through getters / setters
String name;
double height;
int weight;
public void setWeight(int newWeight){
if(newWeight > 0){
weight= newWeight;
}
else{
//throw error
}
}}
How to hide the data?
- Fields (Instance variables) are private
- Getters / setters are public
class Dog extends Animal{
private String name;
private double height;
private int weight;
public void setName(String newName){
name = newName;
}
public String getName(String newName){
return name;
}
}
private int weight; // field
public double getGrams(){
double gramMult = 453.59; // local variable
return gramMult * weight;
}
}
-------------------------------------
Code: (also found here - http://www.newthinktank.com/2012/08/design-patterns-video-tutorial/)
return name;
}
}
Instance & Local Variables?
- Fields (Instance variables) are private
- Declared in the class
- Local variables are declared in a method
private int weight; // field
public double getGrams(){
double gramMult = 453.59; // local variable
return gramMult * weight;
}
}
Is A?Versus has A?
- Is A? Helps you decide if a class should extend another
- Is a Dog an Animal?
- Is a Dog a Cat?
- Has A? Helps you decide if something is a field
- Dog has a height
When to use Inheritance?
- The subclass 'is a' superclass; ex) dog 'is an' animal
- When a sublcass needs moth of the methods in the superclass
- Almost every method in Animal is used in Dog
- Don't: Use inheritance just to reuse code, or they dont have a is a relationship
-------------------------------------
Code: (also found here - http://www.newthinktank.com/2012/08/design-patterns-video-tutorial/)
Animal.java
public class Animal { private String name; private double height; private int weight; private String favFood; private double speed; private String sound; public void setName(String newName){ name = newName; } public String getName(){ return name; } public void setHeight(double newHeight){ height = newHeight; } public double getHeight(){ return height; } public void setWeight(int newWeight){ if (newWeight > 0){ weight = newWeight; } else { System.out.println("Weight must be bigger than 0"); } } public double getWeight(){ return weight; } public void setFavFood(String newFavFood){ favFood = newFavFood; } public String getFavFood(){ return favFood; } public void setSpeed(double newSpeed){ speed = newSpeed; } public double getSpeed(){ return speed; } public void setSound(String newSound){ sound = newSound; } public String getSound(){ return sound; } // A private method can only be accessed by other public methods // that are in the same class private void bePrivate(){ System.out.println("I'm a private method"); } public static void main(String[] args){ Animal dog = new Animal(); dog.setName("Grover"); System.out.println(dog.getName()); } }
Dog.java
public class Dog extends Animal{ public void digHole(){ System.out.println("Dug a hole"); } public void changeVar(int randNum){ randNum = 12; System.out.println("randNum in method value: " + randNum); } /* This private method can only be accessed through using other * methods in the class */ private void bePrivate(){ System.out.println("In a private method"); } public void accessPrivate(){ bePrivate(); } // The constructor initializes all objects public Dog(){ // Executes the parents constructor // Every class has a constructor whether you make it or not super(); // Sets bark for all Dog objects by default setSound("Bark"); } }
Cat.java
public class Cat extends Animal{ // The constructor initializes all objects public Cat(){ // Executes the parents constructor // Every class has a constructor whether you make it or not super(); // Sets bark for all Dog objects by default setSound("Meow"); } // If you want to make sure a method isn't overridden mark it as Final final void attack(){ // Do stuff that can never change } // A field marked with final can't be changed public static final double FAVNUMBER = 3.14; // A class labeled as final can't be extended }
WorkWithAnimals.java
public class WorkWithAnimals{ int justANum = 10; public static void main(String[] args){ Dog fido = new Dog(); fido.setName("Fido"); System.out.println(fido.getName()); fido.digHole(); fido.setWeight(-1); // Everything is pass by value // The original is not effected by changes in methods int randNum = 10; fido.changeVar(randNum); System.out.println("randNum after method call: " + randNum); // Objects are passed by reference to the original object // Changes in methods do effect the object changeObjectName(fido); System.out.println("Dog name after method call: " + fido.getName()); System.out.println("Animal Sound: " + fido.getSound()); // Create a Dog and Cat object with the super class // but the Dog and Cat reference type Animal doggy = new Dog(); Animal kitty = new Cat(); System.out.println("Doggy says: " + doggy.getSound()); System.out.println("Kitty says: " + kitty.getSound() + "\n"); // Now you can make arrays of Animals and everything just works Animal[] animals = new Animal[4]; animals[0] = doggy; animals[1] = kitty; System.out.println("Doggy says: " +animals[0].getSound()); System.out.println("Kitty says: " +animals[1].getSound() + "\n"); // Sends Animal objects for processing in a method speakAnimal(doggy); // Polymorphism allows you to write methods that don't need to // change if new subclasses are created. // You can't reference methods, or fields that aren't in Animal // if you do, you'll have to cast to the required object ((Dog) doggy).digHole(); // You can't use non-static variables or methods in a static function // System.out.println(justANum); // sayHello(); // You can't call a private method even if you define it in // the subclass // fido.bePrivate(); // You can execute a private method by using another public // method in the class fido.accessPrivate(); // Creating a Giraffe from an abstract class Giraffe giraffe = new Giraffe(); giraffe.setName("Frank"); System.out.println(giraffe.getName()); } // Any methods that are in a class and not tied to an object must // be labeled static. Every object created by this class will // share just one static method public static void changeObjectName(Dog fido){ fido.setName("Marcus"); } // Receives Animal objects and makes them speak public static void speakAnimal(Animal randAnimal){ System.out.println("Animal says: " + randAnimal.getSound()); } // This is a non-static method used to demonstrate that you can't // call a non-static method inside a static method public void sayHello(){ System.out.println("Hello"); } }