读了thinkinjava后,说private与static的方法是final的,只是把final关键字给隐藏了。自己测试了下,
public class Father {
private void privateSay(){
System.out.println("father private say!");
}
public static void staticSay(){
System.out.println("father static say");
}
public void publicSay(){
System.out.println("father public say");
}
public static void main(String[] args) {
Father f = new Sun();
f.privateSay();
f.publicSay();
f.staticSay();
}
}
public class Sun extends Father{
@Override
public void publicSay() {
super.publicSay();
System.out.println("sun public say!");
}
private void privateSay(){
System.out.println("sun private say!");
}
public static void staticSay(){
System.out.println("sun static say");
}
public static void main(String[] args) {
Father f = new Sun();
//f.privateSay(); //-->编译错误
f.publicSay();
f.staticSay();
}
}
father类中打印出
father private say!
father public say
sun public say!
father static say
sub类打印出
father public say
sun public say!
father static say
可以看出private与static的方法是默认带有final的,是不能被 重载的,而只有非final的方法是才是后期绑定(执行期绑定)。所以private与static方法没有被重写。
而在Sun类内调用privateSay方法编译时报错 也就 验证了private方法是在前期绑定(编译期绑定)的,报错是因为privateSay是父类的私用方法,就算在子类内重新写了一个同名的方法也不能调用,这样才能保证父类中的私有方法不被覆盖。
staticSay是public但是final所以不能覆盖,最终打印出来的是:father static say。
再说下interface中的变量
public interface StaticVar {
String var = "interface var";
}
public class StaticVarImp implements StaticVar {
String var = "implements var";
public static void main(String[] args) {
StaticVar sv = new StaticVarImp();
System.out.println(sv.var);
}
}
打印出来的是
interface var
接口中的成员变量 默认 是写成public static final的
public:接口是要被其它类实现的所以要用public关键字。
static:每个实现类都公用这个变量,static后内存中就只有一个变量。
final: 不能说在打印sv.var,会因为不能的实现,打印出来的值不同。这样就失去了接口的意义。
接口是概念级抽象,它不表示任何实体,而属性是用于表示某个对象特征,如果接口拥有非静态属性,那岂不违背了接口高度抽象的原则。