1 相关问题
(1)应用父类静态字段会不会初始化子类?
(2)父类的静态方法能不能被子类重写?
(3)父类的静态变量被继承后,子类修改静态变量,为什么父类的也跟着变了?
2 解决思路-不能
2.1 概念
(1)覆盖,又称重写(Override)。发生在子类与父类之间。
子类是可以继承父类的某些方法的,当父类的方法对子类不适用时,需要在子类中写一个和父类一样的方法(当然方法内的程序块是不一样的),此处**“一样”指方法名必须一样、返回值类型互相兼容、参数个数顺序类型必须一致等等**。此时如果子类要用这一方法,就会直接调用覆盖过的方法,而当没有检测到重写时,才会调用从父类继承下来的方法。举例子:因为不同动物的叫声和食物都不同,所以要将父类中的方法覆盖掉。
(2)重载(Overload)。一般发生在同一类的不同方法间。
重载要求两个方法方法名一样,参数列表不一样(类型、顺序、个数等)。这样两个方法间互为不同的方法,调用哪一个时由参数决定。
注意:重载与返回参数无关。
class A {
void a(int i, float j) { }
void a(float i, int j) { } // 两个方法接收的参数类型顺序不同,所以是两个不同的方法
}
class B {
void b(int i) { }
void b() { } // 参数个数不同,第二个方法无参数
}
class C {
void c(int i) { }
void c(float i) { } // 参数类型不同
}
java父子类之间是否存在重载的现象?
(3)静态方法:java中,static修饰符修饰的方法就是静态方法。所谓静态就是指:在编译之后所分配的内存会一直存在(不会被回收),直到程序退出内存才会释放这个空间。static类型的变量是归类所有,不是类的实例所有,一般用类名引用。
2.2 原因
因为静态方法从程序开始运行后就已经分配了内存,也就是说已经写死了。所有引用到该方法的对象(父类的对象也好子类的对象也好)所指向的都是同一块内存中的数据,也就是该静态方法。子类中如果定义了相同名称的静态方法,并不会重写,而应该是在内存中又分配了一块给子类的静态方法,没有重写这一说,我们应该称之为隐藏。
3 演示
(1)代码
class Base {
public static int countBase = 111;
public static int count = 0;
}
class ClassOne extends Base {
public static int count = 1;
}
public class Test {
public static void main(String args[]) {
System.out.println("父类引用父类countBase值:" +Base.countBase);
System.out.println("子类引用父类的countBase值:" +ClassOne.countBase + "\n");
System.out.println("父类原来的count值:" +Base.count);
System.out.println("子类原来的count值:" + ClassOne.count);
ClassOne.count++;
System.out.println("父类加1后的count值:" + Base.count);
System.out.println("子类加1后的count值:" + ClassOne.count);
}
}
(2)结果