Java 在构造类实例时重写方法

Java 在构造类实例时重写方法,java,android,Java,Android,我的问题与以下代码有关。创建Person类的实例时,将覆盖方法printName。 这是否被视为良好做法?我这样问是因为在android中定义事件侦听器时,这种语法经常出现 import java.util.Scanner; public class myJavaProgramme{ public static void main(String[] args){ Person newPerson = new Person(){ @Override

我的问题与以下代码有关。创建
Person
类的实例时,将覆盖方法
printName
。 这是否被视为良好做法?我这样问是因为在android中定义事件侦听器时,这种语法经常出现

import java.util.Scanner;
public class myJavaProgramme{
    public static void main(String[] args){
        Person newPerson = new Person(){
            @Override
            public void printName(){
                System.out.println("Method Overriden");
            }
        };
        newPerson.printName();
    }
    public static Scanner readConsole = new Scanner(System.in);
}
class Person{
    public void printName(){
        System.out.println(this.name);
    }
    public void setName(String newName){
        this.name = newName;
    }
    private String name = "someName";
}
视情况而定。 创建实例时重写方法对于很少被重用的一次性类来说是很方便的,例如按钮的侦听器类。。。 但对于像Person这样的实体类,它的子类将在许多地方使用。最好是正式地扩展和定义子类

创建Person类的实例时,将重写该类的printName方法

更准确的说法是创建了Person的匿名子类的实例(其中覆盖了方法
printName()
)。您可以通过调用结果对象的
getClass()
方法来区分差异

我问这个问题是因为在android中定义事件侦听器时经常会出现这种语法,所以这被认为是一种良好的实践吗

对于某些特定类型的情况,包括特定的事件听众,这是公认的和长期存在的做法。一般的替代方法是定义一个命名类并实例化它;如果您希望在另一个上下文中重用该类,那么这是一种更好的方法,但对于事件侦听器来说通常不是这样


在最近的Java中,在某些情况下可以使用lambda来代替匿名类的常规服务。我想大多数人在风格上会喜欢匿名类,而不是在两者之间进行选择。

问题是什么?你真正在那里做的是创建一个匿名类,它可以从你的
Person
类型中分配,并覆盖它的
printName
方法。在UI代码中经常使用匿名化,但通常与
抽象类或接口一起使用。“最佳实践”完全取决于上下文-您的最小示例没有提供足够的上下文来推断此处的任何重要内容。大多数情况下都接受接口和抽象方法的内联实现。从“普通”类内联重写函数会使您的代码难以理解。我同意@iamnoten。对于像Person这样的类,一个匿名子类会让你的同事们大吃一惊。也许他们会浪费时间试图找出
printName()
没有达到预期效果的原因。如果要重写,请在IDE的“类层次结构”视图中显示的命名类中执行。