从Eclipse Java编译器设置:方法不会覆盖包可见方法
“包默认方法在另一个包中不可见,因此无法覆盖。启用此选项后,编译器会将此类方案指示为错误或警告。”
如何触发此警告/错误?我正在寻找一个代码示例。
答案 0 :(得分:5)
package foopackage;
public class Foo {
String getString() {
return "foo";
}
}
package barpackage;
import foopackage.Foo;
public class Bar extends Foo {
String getString() {
return "bar";
}
}
应该这样做。
包默认方法在其他包中不可见,因此无法覆盖。启用此选项后,编译器会将此类方案指示为错误或警告。
答案 1 :(得分:0)
package b;
public class Foo {
void test() {}
}
和
package a;
import b.Foo;
public class Bar extends Foo {
void test() {}
}
答案 2 :(得分:0)
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() {
}
}
答案 3 :(得分:0)
为什么此警告或错误很重要的示例,请考虑以下示例:
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<Animal> 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());
}
}
}
Copy将整个内容粘贴到Eclipse中,它将整理出类和包。然后运行Main
类。您可能希望它能打印
meow
bark
但是它会打印
no noise defined
no noise defined
这是令人困惑的行为,意外地破坏了多态性。这样做的原因是Animal
子类Cat
和Dog
实际上根本没有覆盖方法makeNoise
,因此在{ {1}}使用makeNoise
实现。
要修复此代码,请在Animal
Animal
方法中添加public
或protected
修饰符,然后重新运行该代码,现在该代码将按预期运行。在这个简单的示例中,它很清楚发生了什么,但是在更复杂的情况下,此行为可能会造成极大的混乱,甚至可能是错误的,因此应认真对待警告。