方法不会覆盖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
子类Cat
和Dog
实际上根本没有覆盖方法makeNoise
,所以当在makeNoise
上调用makeNoise
时它会使用Animal
实现。
要修复此代码,请将public
或protected
修饰符添加到Animal
makeNoise
方法,然后重新运行它现在将按预期工作的代码。 在这个简单的例子中,它非常清楚发生了什么,但在更复杂的情况下,这种行为可能会非常混乱,可能不正确,所以应该认真对待警告。