方法不会覆盖Eclipse中的包可见方法

从Eclipse Java编译器设置: Method不会覆盖包可见方法

“程序包默认方法在另一个程序包中不可见,因此无法覆盖。启用此选项后,编译器会将此类情况指示为错误或警告。”

如何触发此警告/错误? 我正在寻找一个代码示例。

Foo.java:

package foopackage; public class Foo { String getString() { return "foo"; } } 

Bar.java:

 package barpackage; import foopackage.Foo; public class Bar extends Foo { String getString() { return "bar"; } } 

应该这样做。

从Eclipse帮助文档 :

包默认方法在另一个包中不可见,因此无法覆盖。 启用此选项后,编译器会将此类方案指示为错误或警告。

 package b; public class Foo { void test() {} } 

 package a; import b.Foo; public class Bar extends Foo { void test() {} } 
 package a; public class A { // package protected method foo : no visibility modifier void foo() { } } package b; public class B extends A { // although this method has the same signature as A.foo(), it doesn't // override it because A.foo is not visible to B (other package) void foo() { } } 

请注意以下示例,了解此警告或错误的重要原因示例:

 package a; public class Animal { // Note: no visibility modifier therefore package-private String makeNoise() { return "no noise defined"; } } package b; import a.Animal; public class Cat extends Animal { // Note: Eclipse will show the warning that it doesn't override public String makeNoise() { return "meow"; } } package b; import a.Animal; public class Dog extends Animal { // Note: Eclipse will show the warning that it doesn't override public String makeNoise() { return "bark"; } } package a; import java.util.ArrayList; import java.util.List; import b.Cat; import b.Dog; public class Main { public static void main(String[] args) { // Make a list of Animals List animals = new ArrayList<>(); animals.add(new Cat()); animals.add(new Dog()); // Loop through the animals making their noises for (Animal animal : animals) { System.out.println(animal.makeNoise()); } } } 

复制将整个事物粘贴到Eclipse中,它将对类和包进行排序。 然后运行Main类。 你可能希望它打印出来

 meow bark 

但相反它打印

 no noise defined no noise defined 

这是令人困惑的行为,意外地破坏了多态性。 这样做的原因是Animal子类CatDog实际上根本没有覆盖方法makeNoise ,所以当在makeNoise上调用makeNoise时它会使用Animal实现。

要修复此代码,请将publicprotected修饰符添加到Animal makeNoise方法,然后重新运行它现在将按预期工作的代码。 在这个简单的例子中,它非常清楚发生了什么,但在更复杂的情况下,这种行为可能会非常混乱,可能不正确,所以应该认真对待警告。