private与static的方法是不是默认为final的测试

来源:互联网 发布:李修贤 周星驰 知乎 编辑:程序博客网 时间:2024/05/21 13:30

读了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{@Overridepublic 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,会因为不能的实现,打印出来的值不同。这样就失去了接口的意义。

接口是概念级抽象,它不表示任何实体,而属性是用于表示某个对象特征,如果接口拥有非静态属性,那岂不违背了接口高度抽象的原则。

原创粉丝点击