A Java class defined within another class is called a nested class. Nested classes are of two types: static and non-static. Non-static nested classes are generally known as inner classes.
An inner class has direct access to all the fields and methods of its encompassing object, even if they are private:
class Outer {
class Inner {
long foo() {
//can access Outer's x
return x * x;
}
}
private int x;
}
A type (e.g., local variable, parameter, or field) declared inside a specific scope (e.g., a method, an inner class) can shadow a type declared in the outer scope if they have the same names. A typical example of shadowing is a local variable or a parameter of a method having the same name as of a class field. In that case, the class field can be accessed by qualifying it with this
:
class A {
int add(int x) {
//parameter 'x' shadows field 'x'
return this.x + x;
}
protected int x;
}
Similarly, if a type declared in an inner class shadows its outer class's field (or method), the outer class's field (or method) could be accessed by a qualified name, as shown below:
class Outer {
class Inner {
long foo(int x) {
//parameter 'x' shadows Outer's x
//can access Outer's x as:
return Outer.this.x * x;
}
}
private int x;
}
In the following code and design, a class Car comprises an inner class EngineEx instance, among other components. The EngineEx extends the Engine class to override and add some behavior specific to the Car, as shown below:
class Engine {
//more methods and fields...
String getName() {
return name;
}
protected String name;
}
class Car {
//more methods...
Engine getEngine() {
return engine;
}
private class EngineEx extends Engine {
@Override
String getName() {
return ____;
}
}
//more fields...
private EngineEx engine = new EngineEx();
private String name;
}
The EngineEx overrides a getName() method whose implementation is partially hidden (____
). This method returns the Engine's name prefixed with the Car's name. Say, if Engine's name is "V8," and the Car's name is "Accord," the EngineEx's getName method returns "Accord V8":
var c = new Car();
/* If Car's name is "Accord" and Engine's name is "V8",
the following will print "Accord V8" */
System.out.println(c.getEngine().getName());
Select all the choices below that are the correct implementation (replace the ____
above) of EngineEx's getName method (Check Explanations
for details):