如果从 中删除displayMsg
,Parent
则将Child.CallMe()
失败,因为Parent
没有定义displayMsg
。仅仅在匿名类中实现它不会暴露Parent
类上的方法。匿名实现将是一个子类。但是由于您将变量分配给一个Parent
类型(不是实际的子类,这可能也不可能),它无法解析此方法。
可以向匿名类添加其他方法,但它们只能在匿名类中可见(除非您解析为反射)。
displayMsg
然而,据我所知,从匿名类中删除不Child
应该产生错误。但是话又说回来,你只是在实例化一个 Parent ......
编辑
但是,我确实怀疑您正在寻找的是简单的继承:
public class Child extends Parent {
@Override
void displayMsg() {
// Child specific displayMsg
}
}
在这种情况下,不需要 in 的内部Parent
实例Child
,因为Child
also 是 , 的实例Parent
,并且继承了它的行为。
编辑 2
回应你自己的答案。假设我们有一个Person
类:
public class Person {
private String name;
private int age;
public String sayHello() {
return "Hi there, my name is " + name + ", and I'm " + age " years old";
}
}
假设我们有一个Employee
扩展类Person
:
public class Employee extends Person {
public String company;
public double salary;
@Override
public String sayHello() {
return super.sayHello() + ". I work at " + company + " and my salary is " + salary;
}
public void goToWork() {
// Go do some work!
}
}
现在,考虑一下:
Person p = new Employee();
p.goToWork(); // Will not work, as the method is declared in the subclass, not in Person
因此,如果我想将员工视为员工,我需要做
Employee e = new Employee();
e.goToWork();
但是,在这两种情况下,我都可以将它们视为Person
Person p = new Employee();
// This works, as it's defined in Person. It will also invoke the actual sayHello
// in the Employee class
String hi = p.sayHello();
goToWork
添加到类是没有意义的Person
,仅仅因为你想调用它声明为Person
. 让我们看看如果我们这样做会产生什么影响。
public class Student extends Person {
private String school;
@Override
public String sayHello() {
return super.sayHello() + ". I'm studying at " + school;
}
public void goToSchool() {
}
}
现在,学生将同时拥有goToWork
和goToSchool
(当然,有些学生也在公司工作,但我们先不要深入研究多重继承......)。而且我也不会goToSchool
进入Person
课堂。同样,如果我想将其Student
视为 a Student
,我需要将其声明为 a Student
:
Student s = new Student();
s.goToSchool();
如果我把所有这些方法都搬到Person
课堂Person
上,无论是什么类型的Person
. 不是所有Person
的人(人)都去上学,也不是所有的人都去工作。