Inheritance Flashcards

1
Q

What will the following code print when compiled and run?
… main

List list = new ArrayList<>();

StringBuilder sb = new StringBuilder("mrx");         
String s = sb.toString();         
list.add(s);         
System.out.println(s.getClass());         System.out.println(list.getClass());
A
class java.lang.String 
class java.util.ArrayList
The getClass method always returns the Class object for the actual object on which the method is called irrespective of the type of the reference. 
Since s refers to an object (and not the reference) of class String, s.getClass returns Class object for String and similarly list.getClass returns Class object for ArrayList.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q
Consider the following code:   
interface Flyer { 
   String getName(); 
}  
class Bird implements Flyer {     
   public String name;    
   public Bird(String name) {         
      this.name = name;    
   }     
  public String getName(){ 
    return name; 
  } 
}  
class Eagle extends Bird {     
    public Eagle(String name){         
                     super(name);     
     } 
}  
public class TestClass {     
    public static void main(String[] args) throws Exception {         
       Flyer f = new Eagle("American Bald Eagle");         
        //PRINT NAME HERE    
    } 
} 

Which of the following lines of code will print the name of the Eagle object?

System.out.println(f.name);
System.out.println(f.getName());
System.out.println(((Eagle)f).name); 
System.out.println(((Bird)f).getName());
System.out.println(Eagle.name); 
System.out.println(Eagle.getName(f));
A

While accessing a method or variable, the compiler will only allow you to access a method or variable that is visible through the class of the reference.

When you try to use f.name, the class of the reference f is Flyer and Flyer has no field named “name”, thus, it will not compile.

But when you cast f to Bird (or Eagle), the compiler sees that the class Bird (or Eagle, because Eagle inherits from Bird) does have a field named “name” so ((Eagle)f).name or ((Bird)f).name will work fine.

f.getName() will work because Flyer does have a getName() method.

interface Flyer { 
   String getName(); 
}  
class Bird implements Flyer {     
   public String name;    
   public Bird(String name) {         
      this.name = name;    
   }     
  public String getName(){ 
    return name; 
  } 
}  
class Eagle extends Bird {     
    public Eagle(String name){         
                     super(name);     
     } 
}  
public class TestClass {     
    public static void main(String[] args) throws Exception {         
       Flyer f = new Eagle("American Bald Eagle");         
        //PRINT NAME HERE    
    } 
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly