Angenommen, Sie haben eine Employee
Klasse, die eine Methode hat greet
. Wenn die greet
Methode aufgerufen wird, wird einfach gedruckt Hello everyone!
. Das ist also die erwartetes Verhalten von greet
Methode
public class Employee {
void greet() {
System.out.println("Hello everyone!");
}
}
Nun, lassen Sie GrumpyEmployee
subclase Employee
und außer Kraft setzen greet
Methode wie unten dargestellt.
public class GrumpyEmployee extends Employee {
@Override
void greet() {
System.out.println("Get lost!");
}
}
Schauen Sie sich nun im folgenden Code die sayHello
Methode. Sie dauert Employee
Instanz als Parameter und ruft die greet-Methode auf, in der Hoffnung, dass sie sagen würde Hello everyone!
Aber was wir bekommen, ist Get lost!
. Diese Verhaltensänderung ist auf Folgendes zurückzuführen Employee grumpyEmployee = new GrumpyEmployee();
public class TestFinal {
static Employee grumpyEmployee = new GrumpyEmployee();
public static void main(String[] args) {
TestFinal testFinal = new TestFinal();
testFinal.sayHello(grumpyEmployee);
}
private void sayHello(Employee employee) {
employee.greet(); //Here you would expect a warm greeting, but what you get is "Get lost!"
}
}
Diese Situation kann sein vermieden wenn die Employee
Klasse gemacht wurde final
. Stellen Sie sich vor, was für ein Chaos ein frecher Programmierer verursachen könnte, wenn String
Klasse wurde nicht deklariert als final
.