letter Q
letter Q

Reputation: 15375

Java object reference mechanisms

I'm kind of stuck on the following question:

What two Java language mechanisms allow the type of an object reference variable to be "different" than the type of the object to which it refers? Give specific examples to illustrate. In what sense are they not different at all?

My current answer is that it is "implement" and "extend" right? And they are similar because they both will make a class that at least will posses all of the method signatures of the super class which can be actual, abstract, or an interface. Is this correct? Thanks in advance!

Upvotes: 5

Views: 819

Answers (3)

Stephen C
Stephen C

Reputation: 718678

That is more or less correct. The second part of your answer should talk about subtyping. In Java, it is not sufficient for objects to just have the same method signatures. There actually has to be a declared subtyping relationship (via extends / implements).

This is not mere pedantry. In some languages (but not Java), the mere existence of compatible method signatures is sufficient for type compatibility. This is called "duck typing".

Upvotes: 3

Adam
Adam

Reputation: 36703

Implements

interface Animal {
   void attackHuman(); // actually public abstract by default
}
class Horse implements Animal {
   public void attackHuman() { }; // must implement
}

// type and reference the same
Horse a1 = new Horse();

// type and reference different
Animal a2 = a1;

Extends

class Animal {
   void attackHuman();
}
class Dinosaur extends Animal {
   // attackHuman() inherited
}

// type and reference the same
Dinosaur a1 = new Dinosaur();

// type and reference different
Animal a2 = a1;

Upvotes: 1

Kumar Vivek Mitra
Kumar Vivek Mitra

Reputation: 33534

See this example....

- Here the Animal is the Super-Class, and the Dog and Cat are inherited out of it.

- You can Create a Dog object using an Animal Object Reference Variable.

- This is known as Class Polymorphism.

public class Test {

public static void main(String[] args){

Animal a = new Dog();
new Hospital().treatAnimal(a);

   }
}

class Animal {

public void sayIt(){

     }
}

class Dog extends Animal{

public void sayIt(){

    System.out.println("I am Dog");
   }
}


class Cat extends Animal{

public void sayIt(){

System.out.println("I am Cat");
     }
}










See the NEXT PAGE for the Remaining Code

class Hospital{

public void treatAnimal(Animal a){


if(a instanceof Dog){             



   a.sayIt();         // Will output "I am Dog"

  }
else{

a.sayIt();         // Will output "I am Cat"

}


  }

}

Upvotes: 0

Related Questions