Object Oriented Programming with Java
Upcoming SlideShare
Loading in...5
×
 

Object Oriented Programming with Java

on

  • 7,328 views

 

Statistics

Views

Total Views
7,328
Views on SlideShare
4,098
Embed Views
3,230

Actions

Likes
5
Downloads
381
Comments
1

6 Embeds 3,230

http://www.itestiwin.com 3155
http://imp-35.ning.com 67
http://www.slideshare.net 5
http://php.tpu.fi 1
http://182.50.141.149 1
http://staging.itestiwin.com 1

Accessibility

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • Exercise 01
  • Exercise 2
  • Exercise 3
  • Exercise 4 and 5
  • Exercise 6 - 8
  • Exercises 9 – 12
  • Exercise 15 - 17
  • Exercises 13,14 and 18

Object Oriented Programming with Java Object Oriented Programming with Java Presentation Transcript

  • Object Orientated Programming with Java Jussi Pohjolainen Tampere University of Applied Sciences
  • MOTIVATION
  • Job Opportunities?
    • Little acronyms from job descriptions:
      • S60, C++, J2ME, Java, Java EE, SCRUM, JAX-WS 2.0, EJB 3.0, Spring, Hybernate, Struts, SQL, XHTML, CSS, Symbian C++, Perl, PHP, Python, LDAP, MFC, XML, .NET, Visual Basic, AJAX, Objective-C, JSP, Servlet, GTK, Qt, JavaScript, Oracle, SQL Server, DB Design…
    • Where is Object Orientated programming?
  • Developing S60 apps? “ Basic” programming skills OO skills Data Structures / DB UI programming Symbian C++ S60
  • Developing iPhone apps? “ Basic” programming skills OO skills Data Structures / DB UI programming Objective-C iPhone
  • Web-development with Java? “ Basic” programming skills OO skills Data Structures /DB UI programming Java Servlet Www-techniques: Xhtml, CSS, XML Applets JSP
  • OO CONCEPTS
  • Intro to OO
    • Object Orientated programming is a programming paradigm.
    • One way of describing the structure of the application
    • Several paradigms available.
      • Procedural, Functional, ...
    • OO is nowdays one of the most popular.
      • C++
      • Java
      • C#
      • PHP 5
      • ...
  • Benefits
    • Reusability
      • Once you written code, you can reuse it!
    • Management
      • Application is programmed using classes and objects. Pieces that communicate with each other.
    • Maintanence
      • When changing the code, it does not influence the whole application.
  • Basic Concept: Object
    • In real life, the world consists of objects:
      • cars, buildings, trees, ships, humans, flowers..
    • Every object has actions (=methods!) that can incluence other objects
      • jack drives ferrari.
      • Object jack has a method drive that influences some way to object ferrari.
      • jack.drive(ferrari);
    • In OO, you should implement the app so that it consists of objects that influence each other!
  • Example about an Object
    • Datsun 100A is an object
    • Datsun 100A has different actions or methods : drive, brake, park...
    • Datsun 100A has information or attributes : color, amount of gears, amount of doors...
  • Basic Concept: Class
    • Class is a blueprint or template of an object
    • Class describes the state and behaviour to it's objects.
    • Object is created from the class.
  • Example about an Class
    • If Datsun 100A is an object, Car is a class.
    • If one wants to create Datsun 100A, you have to have first the blueprints of the Datsun.
    • Blueprints of an object: Class
    • Class Car -> Object Datsun 100A
  • Examples: Class to Object Class Object Car datsun 100a Human Jack Bauer Color red Laptop MacBook Pro String "some string" Array {1,2,3,2,4} ... ...
  • Class and Object
    • Car - class
    Datsun 100A Lamborghini Diablo Peugeot 406
  • Car's Blueprint
    • When building a Car's blueprint (class), you have to think that what is similar in all car's
    • So what is similar in datsun, lamborghini and peugeot?
  • Objects datsun, lambo, peugeot
    • datsun:
      • brand: Datsun 100A , motor: 1.0, fuzzy dices: yes, color: red
    • lambo
      • brand: Lamborghini Diablo, motor: 8.0, fuzzy dices: no, color: punainen
    • peugeot
      • brand: Peugeot 406, motor: 2.2, fuzzy dices: no, color: blue
  • Car's Blueprint (Class) in UML Car brand motor amountOfDoors color hasFuzzyDices . .
  • From Class to Object datsun Datsun 100A 1.0 3 red true lambo Lamborghini Diablo 8.0 3 red false Car brand motor amountOfDoors color hasFuzzyDices . .
  • Car-class, extension Car brand motor amountOfDoors color hasFuzzyDices drive park brake
  • Class
    • Class is a template or blueprint to object
    • Class holds
      • Attributes (=variables)
      • Actions (=methods)
    • Class instances are called objects
  • CLASSES AND OBJECTS IN JAVA
  • Person Class to Objects george George Smith 40 Teacher 09-12345 Jack Jack Puupää 60 Toimistopäällikkö 03-654321 eat sleep drinkBeer Person firstname lastname age profession phonenumber eat sleep drinkBeer
  • Person – class to Java
    • class Person {
    • public String firstname;
    • public String lastname;
    • public int age;
    • public String profession;
    • public int phonenumber;
    • public void eat() {
    • System.out.println("Eating!");
    • }
    • public void sleep() {
    • System.out.println("Sleeping!");
    • }
    • public void drinkBeer() {
    • System.out.println("Drinking!");
    • }
    • }
    Person firstname lastname age profession phonenumber eat sleep drinkBeer
  • From Class to Object
    • App always starts from the main-method
    • Let's test the Person – class
    • This creates a variable a which type is integer
      • int a;
    • This creates a object jack which type is Person
      • Person jack;
  • From Class to Object
    • class Person {
    • ....
    • }
    • class JustTesting {
    • public static void main(String [] args)
    • {
    • // Declare the object
    • Person jack;
    • // Initialize the object
    • jack = new Person();
    • jack.firstname = "Jack";
    • jack.lastname = "Smith";
    • jack.drinkBeer();
    • }
    • }
  • Example: Car - class
    • class Car
    • {
    • public String brand;
    • public int amountOfGas;
    • public void drive() {
    • amountOfGas--;
    • }
    • }
  • Creating Objects From the Class
    • class Car {
    • ....
    • }
    • class JustTesting {
    • public static void main(String [] args)
    • {
    • Car datsun = new Car();
    • datsun.amountOfGas = 100;
    • datsun.drive();
    • System.out.println(datsun.amountOfGas);
    • Car ferrari = new Car();
    • ferrari.amountOfGas = 300;
    • ferrari.drive();
    • System.out.println(ferrari.amountOfGas);
    • }
    • }
  • Basic Concept - Encapsulation private public method
  • About Attributes
    • Attributes are usually marked as private
    • The reason for this is that other objects cannot change the values as they will
    • You don't for example want that every object in the world can change person's weight to 500kg...
  • Example: Person - class
    • class Person {
    • private String name;
    • private int weight;
    • }
    • class Person {
    • private String name;
    • private int weight;
    • }
    • class JustTesting {
    • public static void main(String [] args)
    • {
    • Person jack = new Person();
    • jack.name = "Jack Smith";
    • jack.weight = 500;
    • }
    • }
    • RESULT:
    • TB308POHJUS-L-2:temp pohjus$ javac Person.java
    • Person.java:9: name has private access in Person
    • jack.name = "Jack Smith";
    • ^
    • Person.java:10: weight has private access in Person
    • jack.weight = 500;
    • ^
    • 2 errors
    • class Person {
    • private String name;
    • private int weight;
    • public void setName(String n) {
    • name = n;
    • }
    • public String getName() {
    • return name;
    • }
    • public void setWeight(int w) {
    • if(w > 0 && w <= 150)
    • weight = w;
    • }
    • public int getWeight() {
    • return weight;
    • }
    • }
    • class JustTesting {
    • public static void main(String [] args)
    • {
    • Person jack = new Person();
    • jack.setName(&quot;Jack Smith&quot;);
    • jack.setWeight(200);
    • System.out.println(jack.getName());
    • }
    • }
  • Accessor and Mutator - methods
    • class Person {
    • private String name;
    • private int weight;
    • // Mutator
    • public void setName(String n) {
    • name = n;
    • }
    • // Accessor
    • public String getName() {
    • return name;
    • }
    • // Mutator
    • public void setWeight(int w) {
    • if(w > 0 && w <= 150)
    • weight = w;
    • }
    • // Accessor
    • public int getWeight() {
    • return weight;
    • }
    • }
  • JAVA TYPES
  • Java Types
    • Java has two type of types
    • 1) Primitive types
      • byte, short, int, long, double, float, char, boolean
    • 2) Class types
      • String, Scanner, Array, JButton, JFrame ...
  • Differences
    • Primitive types are spelled with lowercase:
      • int, double, float...
    • Class types are spelled with uppercase
      • String, Scanner, Person, Cat, Car ...
    • Primitive type declaring and initialization
      • int a = 5;
    • Class type declaring and initialization with new
      • Dog spot = new Dog();
  • Differences
    • Primitive type
      • int a = 5;
    • Class type
      • int [] b= new int[5];
    • b holds memory address
    • a holds value 5.
  • Memory Address?
    • int [] b = new int[2];
    • b[0] = 1;
    • b[1] = 2;
    • // prints 0x01
    • System.out.println(b);
    RAM variable b address value 0x01 1 0x02 2 address value 0x09 0x01
  • Memory Address?
    • int [] b = new int[2];
    • b[0] = 1;
    • b[1] = 2;
    • int [] a = b;
    • // prints 0x01
    • System.out.println(b);
    • // prints 0x01
    • System.out.println(a);
    RAM variable b variable a address value 0x01 1 0x02 2 address value 0x09 0x01 address value 0x19 0x01
  • Output?
    • int [] b = new int[2];
    • b[0] = 1;
    • b[1] = 2;
    • int [] a = b;
    • b[0] = 99;
    • // Output?
    • System.out.println(a[0]);
  • Differences Again
    • Primitive type
      • int a = 5;
    • Class type
      • int [] b= new int[5];
    • b holds memory address
    • a holds value 5.
  • Differences Again
    • Primitive type
      • int a = 5;
    • Class type
      • Person jack = new Person()
    • jack holds memory address
    • a holds value 5.
  • Output?
    • Person jack = new Person();
    • jack.setName(&quot;Jack Smith&quot;);
    • Person james = jack;
    • james.setName(&quot;James Bond&quot;);
    • // output?
    • System.out.println(jack.getName());
  • Methods and Variables
    • public void method(int x) {
    • x++;
    • }
    • public void main(String [] args) {
    • int y = 3;
    • method(y);
    • // Output is 3!
    • System.out.println(y);
    • }
  • Methods and Variables
    • public void method(int [] x) {
    • x[0] = 12;
    • }
    • public void main(String [] args) {
    • int [] y = {1,2,3};
    • method(y);
    • // Output is 12 since array is class type!
    • System.out.println(y[0]);
    • }
  • String
    • String is an exception to the rules
    • String is a class type that acts like primitive type
    • String is the only class type that can be initialized without the new word.
      • String a = &quot;hello&quot;;
    • String is passed by value in methods, so String is copied when moving strings in methods.
  • String and Memory
    • String variables are objects => holds memory address.
    • Comparing contents
      • a.equals(b);
    • Comparing memory addresses
      • a == b
  • CONSTRUCTOR
  • Constructors
    • Constructor is a “init method” that is called when an object is created
    • Java provides default constructor (= constructor with no parameters)
    • Constructor has the same name than the class
    • Constructor does not return anything
    • Constructor usually initalizes class members
  • Example
    • class Car {
    • public Car() {
    • System.out.println(&quot;Constructor!&quot;);
    • }
    • }
    • class Test {
    • public static void main(String [] args) {
    • Car datsun = new Car();
    • }
    • }
    > java Test Constructor!
    • class Car {
    • private String brand;
    • public Car(String b) {
    • brand = b;
    • }
    • public String getBrand() {
    • return brand;
    • }
    • }
    • class Test {
    • public static void main(String [] args) {
    • Car datsun = new Car(&quot;Datsun 100A&quot;);
    • System.out.println( datsun.getBrand() );
    • }
    • }
    > java Test Datsun 100A
  • Multiple Constructors
    • class Car {
    • public Car() {
    • // Do something
    • }
    • public Car(String brand) {
    • // Do something else
    • }
    • }
    • class Test {
    • public static void main(String [] args) {
    • Car datsun = new Car();
    • Car ferrari = new Car(&quot;Ferrari&quot;);
    • }
    • }
  • Problem?
    • class Car {
    • String brand;
    • public Car(String brand) {
    • brand = brand;
    • }
    • }
    • class Test {
    • public static void main(String [] args) {
    • Car datsun = new Car(&quot;Datsun 100a&quot;);
    • }
    • }
    > java Test null
  • Solution
    • class Car {
    • String brand;
    • public Car(String brand) {
    • this.brand = brand;
    • }
    • }
    • class Test {
    • public static void main(String [] args) {
    • Car datsun = new Car(&quot;Datsun 100a&quot;);
    • }
    • }
    > java Test Datsun 100a
  • COMPOSITION
  • Composition
    • Relatioship between objects, where one object owns, or has the other object
    • Car has or owns Motor
    • When Car is build, it's motor is built also
    • When Car is destroyed it's motor is destroyed
  • UML notation
  • Java: Composition
    • // Composition
    • class Car
    • {
    • private Motor motor;
    • public Car() {
    • motor = new Motor();
    • }
    • }
  • One to Many?
  • Java: One to Many
    • class Department
    • {
    • private Professor [] members;
    • private int numberOfMembers;
    • public Department(Professor prof) {
    • members = new Professor[20];
    • members[0] = prof;
    • numberOfMembers = 1;
    • }
    • public void addProfessor(Professor prof) {
    • members[numberOfMembers] = prof;
    • numberOfMembers++;
    • }
    • }
  • INHERITANCE
  • Introduction to Inheritance
    • Inheritance is a relationship between two or more classes where derived class inherites behaviour and attributes of pre-existing (base) classes
    • Intended to help reuse of existing code with little or no modification
  • Inheritance
    • Inheritance can be continous
      • Derived class can inherit another class, which inherits another class and so on
      • When changing the base class all the derived classes changes also
    • Example:
      • Mammal <– Human <– Worker <- Programmer
    • Could mammal be a derived class? If so, what would be the base class?
  • Picture about Inheritance C lass B F eatures: a,b,c C lass D F eatures: a,b,d,e,f a b C lass A features: a,b c d e C lass C F eatures: a,b,d,e f
  • Multiple Inheritance
    • In multiple inheritance a derived class has multiple base classes
    • C++ supports multiple base classes, Java don't
    Driver - license - Y ear of approval Conductor - A ccount number Taxi Driver - area House Boat Houseboat
  • Inheritance and Capsulation
    • private
      • Is accessible only via the base class
    • public
      • Is accessible everywhere (base class, derived class, othe classes)
    • protected
      • Is accessible by the base class and derived classes
  • Basic example
    • What are Programmer's attributes and methods?
    Human string name void sleep() void drink() void eat() Programmer int salary void implementApps() void beNerd()
  • Overriding?
    • What about now?
    Human string name void sleep() void drink() void eat() Programmer int salary void implementApps() void beNerd() void drink() void eat()
  • Overriding
    • Since programmer eats and drinks differently than humans (only Coke and Pizza) the eat and drink methods are overriden in Programmer!
  • Abstract Class
    • Abstract class is a class which you cannot instantiate (create objects)
    • You can inherit abstract class and create objects from the inherited class, if it is concrete one
    • Abstract class in C++ has abstract methods, that do not have implementations
    • These methods forces derived classes to implement those methods
  • Example <<abstract>> Mammal string name void makesound() {abstract} Elephant int trunkLength makesound()
  • Example <<abstract>> Figure int x, y double calculateArea() {abstract} Circle double radius double calculateArea() Rect double length, height double calculateArea()
  • INHERITANCE IN JAVA
  • Example: Basic Inheritance
    • class Human {
    • public void sleep() {
    • System.out.println(&quot;Human sleeps&quot;);
    • }
    • }
    • class Programmer extends Human {
    • }
    • class Test {
    • public static void main(String [] args) {
    • Programmer jussi = new Programmer();
    • jussi.sleep(); // &quot;Human sleeps&quot;
    • }
    • }
  • Example: Overriding
    • class Human {
    • public void sleep() {
    • System.out.println(&quot;Human sleeps&quot;);
    • }
    • }
    • class Programmer extends Human {
    • public void sleep() {
    • System.out.println(&quot;Programmer sleeps&quot;);
    • }
    • }
    • class Test {
    • public static void main(String [] args) {
    • Programmer jussi = new Programmer();
    • jussi.sleep(); // &quot;Programmer sleeps&quot;
    • }
    • }
  • Example: super
    • class Human {
    • public void sleep() {
    • System.out.println(&quot;Human sleeps&quot;);
    • }
    • }
    • class Programmer extends Human {
    • public void sleep() {
    • super.sleep();
    • System.out.println(&quot;Programmer sleeps&quot;);
    • }
    • }
    • class Test {
    • public static void main(String [] args) {
    • Programmer jussi = new Programmer();
    • jussi.sleep();
    • }
    • }
    > java Test Human sleeps Programmer sleeps
  • Constructors and Inheritance
    • class Human {
    • public Human() {
    • System.out.println(&quot;Human&quot;);
    • }
    • }
    • class Programmer extends Human {
    • public Programmer() {
    • System.out.println(&quot;Programmer&quot;);
    • }
    • }
    • class Test {
    • public static void main(String [] args) {
    • Programmer jussi = new Programmer();
    • }
    • }
    > java Test Human Programmer
  • Constructors and Inheritance
    • Constructor allways calls the base classes constructor!
    • When creating a constructor
      • void Human() {
      • }
    • Java adds super() – call to it:
      • void Human() {
      • super(); // calls base classes constructor
      • }
    • class Human {
    • public Human() {
    • System.out.println(&quot;Human&quot;);
    • }
    • }
    • class Programmer extends Human {
    • public Programmer() {
    • System.out.println(&quot;Programmer&quot;);
    • }
    • }
    • class Test {
    • public static void main(String [] args) {
    • Programmer jussi = new Programmer();
    • }
    • }
    > java Test Human Programmer
    • class Human {
    • public Human() {
    • super(); // Java adds this! Calls base classes contructor
    • System.out.println(&quot;Human&quot;);
    • }
    • }
    • class Programmer extends Human {
    • public Programmer() {
    • super(); // Java adds this! Calls base classes contructor
    • System.out.println(&quot;Programmer&quot;);
    • }
    • }
    • class Test {
    • public static void main(String [] args) {
    • Programmer jussi = new Programmer();
    • }
    • }
    > java Test Human Programmer
  • What the...? What base class?
    • class Human {
    • public Human() {
    • // Java adds this! Calls base classes contructor
    • super();
    • System.out.println(&quot;Human&quot;);
    • }
    • }
  • Object
    • Every class derives from a class called Object.
    • // Java adds the extends Object too!
    • class Human extends Object {
    • public Human() {
    • super();
    • System.out.println(&quot;Human&quot;);
    • }
    • }
  • Object clone() equals() finalize() toString() ... Human String name ... http://java.sun.com/javase/6/docs/api/java/lang/Object.html
    • class Human {
    • public Human( int a ) {
    • System.out.println(&quot;Human&quot;);
    • }
    • }
    • class Programmer extends Human {
    • public Programmer() {
    • System.out.println(&quot;Programmer&quot;);
    • }
    • }
    • class Test {
    • public static void main(String [] args) {
    • Programmer jussi = new Programmer();
    • }
    • }
    > javac Test.java > DOES NOT COMPILE!!! Why?
    • class Human {
    • public Human( int a ) {
    • System.out.println(&quot;Human&quot;);
    • }
    • }
    • class Programmer extends Human {
    • public Programmer() {
    • super(); // Java adds this and it calls constructor
    • // Human() that does not exist..
    • System.out.println(&quot;Programmer&quot;);
    • }
    • }
    • class Test {
    • public static void main(String [] args) {
    • Programmer jussi = new Programmer();
    • }
    • }
    • class Human {
    • public Human( int a ) {
    • System.out.println(&quot;Human&quot;);
    • }
    • }
    • class Programmer extends Human {
    • public Programmer() {
    • super(5); // Now it works: Human(int a) exists.
    • System.out.println(&quot;Programmer&quot;);
    • }
    • }
    • class Test {
    • public static void main(String [] args) {
    • Programmer jussi = new Programmer();
    • }
    • }
    • class Human {
    • private String name
    • public Human( String name ) {
    • this.name = name;
    • }
    • }
    • class Programmer extends Human {
    • private int salary;
    • public Programmer(String name, int salary) {
    • super(name);
    • this.salary = salary;
    • }
    • }
    • class Test {
    • public static void main(String [] args) {
    • Programmer jussi = new Programmer(&quot;Jussi&quot;, 5000);
    • }
    • }
  • Abstract Class
    • From abstract class you cannot create objects!
    • Abstract class is usually used with inheritance
    • Abstract class may contain abstract methods.
    • Abstract method forces derived classes to implement the abstract method.
  • Abstract Class: example
    • abstract class Mammal {
    • abstract void makeSound();
    • }
    • class Dog extends Mammal {
    • // You have to implement this!
    • public void makeSound() {
    • System.out.println(&quot;Bark!&quot;);
    • }
    • }
  • Abstract Class: example
    • // Does NOT work, since Mammal is
    • // abstract class
    • Mammal object = new Mammal();
    • // Does work
    • Dog spot = new Dog();
  • Java: Abstract class and Interface
    • Abstract class can hold &quot;normal&quot; methods and abstract methods.
    • Interface holds only abstract methods
    • Abstract class:
      • class A extends someAbstractClass
    • Interface
      • class A implements someInterface
  • Abstract class to Interface
    • abstract class Movable {
    • abstract public void start();
    • abstract public void stop();
    • }
    • interface Movable {
    • public void start();
    • public void stop();
    • }
  • Implementing the Interface
    • interface Movable {
    • public void start();
    • public void stop();
    • }
    • class Car implements Movable {
    • // You have to implement these
    • public void start() {
    • // Do something
    • }
    • public void stop() {
    • // Do something
    • }
    • }
  • Abstract class vs Interface
    • Abstract class can hold normal methods and abstract methods
    • Interface can hold only abstract methods
    • Class can inherite only one base class
    • Class can implement several interfaces!
    • class Car extends Vehicle implements Movable, RunsOnGasoline {
    • // You have to implement these
    • public void start() {
    • // Do something
    • }
    • public void stop() {
    • // Do something
    • }
    • public void reduceGasoline() {
    • // Do something
    • }
    • public void addGasoline() {
    • // Do something
    •   }
    • }
  • POLYMORPHISM
  • int as parameter
    • class Exercise13 {
    • public static void main(String [] args) {
    • int x = 4;
    • myMethod(x);
    • }
    • public static void myMethod(int a) {
    • }
    • }
  • Human parameter
    • class Human {
    • }
    • class Exercise13 {
    • public static void main(String [] args) {
    • Human jack = new Human();
    • myMethod(jack);
    • }
    • public static void myMethod(Human a) {
    • }
    • }
  • Mammal parameter
    • class Mammal {
    • }
    • class Human extends Mammal {
    • }
    • class Dog extends Mammal {
    • }
    • class Exercise13 {
    • public static void main(String [] args) {
    • Human jack = new Human();
    • Dog spot = new Dog();
    • Mammal mammal = new Mammal();
    • // these work! You can pass mammals, dogs and humans to the method!
    • myMethod(jack);
    • myMethod(dog);
    • myMethod(mammal);
    • }
    • public static void myMethod(Mammal a) {
    • }
    • }
  • Object parameter
    • ...
    • class Exercise13 {
    • public static void main(String [] args) {
    • Human jack = new Human();
    • Dog spot = new Dog();
    • Mammal mammal = new Mammal();
    • // these work! You can pass every object to the method
    • myMethod(jack);
    • myMethod(dog);
    • myMethod(mammal);
    • myMethod(&quot;hello&quot;); // String
    • }
    • public static void myMethod(Object a) {
    • }
    • }
  • Calling methods from Mammal
    • class Mammal {
    • }
    • class Human extends Mammal {
    • public void bark() { System.out.println(&quot;Bark!&quot;); };
    • }
    • class Dog extends Mammal {
    • }
    • class Exercise13 {
    • public static void main(String [] args) {
    • Human jack = new Human();
    • Dog spot = new Dog();
    • Mammal mammal = new Mammal();
    • myMethod(jack);
    • myMethod(dog);
    • myMethod(mammal);
    • }
    • public static void myMethod(Mammal a) {
    • a.bark(); // Why this does not work?
    • }
    • }
  • Solution
    • class Exercise13 {
    • public static void main(String [] args) {
    • Human jack = new Human();
    • Dog spot = new Dog();
    • Mammal mammal = new Mammal();
    • myMethod(jack);
    • myMethod(dog);
    • myMethod(mammal);
    • }
    • public static void myMethod(Mammal a) {
    • // Now it works
    • if(a instanceof Dog) {
    • Dog spot = (Dog) a;
    • spot.bark();
    • }
    • }
    • }
  • This works, why?
    • class Mammal {
    • public void giveBirth() { System.out.println(&quot;Giving birth&quot;); };
    • }
    • class Human extends Mammal {
    • }
    • class Dog extends Mammal {
    • }
    • class Exercise13 {
    • public static void main(String [] args) {
    • Human jack = new Human();
    • Dog spot = new Dog();
    • Mammal mammal = new Mammal();
    • myMethod(jack);
    • myMethod(dog);
    • myMethod(mammal);
    • }
    • public static void myMethod(Mammal a) {
    • a.giveBirth(); // Why this works?
    • }
    • }
    • class Movable {
    • public void start();
    • public void stop();
    • }
    • class Vehicle {
    • }
    • class Car extends Vehicle implements Movable {
    • public void start() {
    • // Do something
    •   }
    • public void stop() {
    • // Do something
    •   }
    • }
    • class Exercise13 {
    • public static void main(String [] args) {
    • Car c = new Car();
    • myMethod(c);
    • }
    • // You can pass every object that implements the Movable!
    • public static void myMethod( Movable a ) {
    • a.start();
    • }
    • }