A reference variable can be declared as a class type or an interface type.If the variable is declared as an interface type, it can reference any object of any class that implements the interface.
Based on the above statement I have made a code on understanding. As said above declared as an interface type, it can reference any object of any class that implements the interface.
But in my code is displaying displayName()
method undefined at objParent.displayName()
:
public class OverridenClass {
public static void main(String[] args) {
Printable objParent = new Parent();
objParent.sysout();
objParent.displayName();
}
}
interface Printable {
void sysout();
}
class Parent implements Printable {
public void displayName() {
System.out.println("This is Parent Name");
}
public void sysout() {
System.out.println("I am Printable Interfacein Parent Class");
}
}
I am sure I have understood the wrong way. Can someone explain the same?
But in my code is displaying displayName()method undefined.
Right, because displayName
is not defined in the Printable
interface. You can only access the methods defined on the interface through a variable declared as having that interface, even if the concrete class has additional methods. That's why you can call sysout
, but not displayName
.
The reason for this is more apparent if you consider an example like this:
class Bar {
public static void foo(Printable p) {
p.sysout();
p.displayName();
}
}
class Test {
public static final void main(String[] args) {
Bar.foo(new Parent());
}
}
The code in foo
must not rely on anything other than what is featured in the Printable
interface, as we have no idea at compile-time what the concrete class may be.
The point of interfaces is to define the characteristics that are available to the code using only an interface reference, without regard to the concrete class being used.
The displayName()
method is displayed as undefined because objParent
declared as type Printable
and the interface does not have such method. To be able to use method displayName()
, you can declare it in interface Printable
:
interface Printable {
void sysout();
void displayName();
}
Or cast objParent
to type Parent
first before calling method displayName()
:
Printable objParent = new Parent();
objParent = (Parent) objParent;
objParent.displayName();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With