如果从 中删除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,因为Childalso 是 , 的实例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的人(人)都去上学,也不是所有的人都去工作。