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

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

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

你可能感兴趣的:(java,private,static,final,interace)