1.java可能继承静态变量与静态方法
class AA{
public static void a(){
System.out.println("a");
}
}
class B extends AA{
static void bb(){
a();
}
}
class Test {
public static void main(String[] args) {
B.a();//输出a,证明静态方法可以被继承
}
}
//在子类中并没有必要通过再造一个方法,在这个方法中调用父类中的方法。
//子类默认的继承了父类的所有非private修饰的方法。也就是说,通过子类类名(对于静态方法来说)或对象名来直接调用父类的方法。
2.静态方法和静态变量不能被覆盖
class A{
protected static int num=2;
public static void a(){
System.out.println("a");
}
}
class B extends A{
protected static int num=4;
public static void a(){
System.out.println("b");
}
}
public class Test1 {
public static void main(String[] args) {
A a = new B();
a.a();//输出结果是a,说明静态方法不能再子类之中被覆盖。
System.out.println(a.num);//输出2,说明静态变量是不能被在子类中被覆盖的。
System.out.println(A.num);
System.out.println(B.num);//通过类名调用被覆盖的静态变量可以显示子类的被覆盖的静态变量。
}
}
java不推荐用对象调用static方法,这会使人混淆,请大家注意。但编译的时候,静态变量的值已经确定,而对于多态中的编译问题,对于一个静态变量java只会看父类之中是不是有这个变量。也就是说多态对于静态变量和静态方法是没有作用的。java的这个规定是可以理解的。静态的说明只有一个固定的地址,一旦确定之后,就不能更改。而java中的多态是指当子类中的方法或变量覆盖了父类中的时,编译的时候,java首先不会确定他们的具体内容,当具体执行时看其属于什么子类在确定最后的执行。这样的话两者正好相互矛盾。因此,静态的问题并不存在多态问题,因为它是一成不变的。