package test1;
import java.io.*;
public class demo {
publicstatic void main(String[] arg){
Shapes=new Circle();
call(s);
}
staticvoid call(Shape s){
s.f1();
s.f2();
s.f3();
((Circle)s).f3();
System.out.println(s.a);
}
}
class Shape{
staticint a=0;
voidf1(){
System.out.println("shape.f1()");
f2();
}
voidf2(){
System.out.println("shape.f2()");
}
staticvoid f3(){
System.out.println("shape.f3()");
}
}
class Circle extendsShape{
inta=1;
voidf2(){
System.out.println("circle.f2()");
}
staticvoid f3(){
System.out.println("circle.f3()");
}
}
运行结果
shape.f1()
circle.f2()
circle.f2()
shape.f3()
circle.f3()
0
如上图代码
1:对于变量,子类的变量只能隐藏父类的变量而不能覆盖(不论1:父类的变量是静态的,子类的变量是非静态的。2:父类的变量是非静态的,子类的变量是静态的。3都是静态。4:都是非静态)。此时若Shape s=new Circle()调用s.a使用的是父类的变量,可以通过强制转换((Circle)s).a来使用子类的变量。
2.对于方法的重写,
2.1如果父类的方法是静态的,那么子类必须已完全相同的静态方法来重写,此重写是隐藏,此时若Shape s=new Circle()调用s.f3()那么使用的是父类的方法。可以通过强制转换((Circle)s).f3()来使用子类的静态方法。
2.2如果父类的方法是default的,那么子类必须已完全相同的default方法来重写,此重写是覆盖,此时若Shape s=new Circle()调用s.f3()那么使用的是父类的方法。
3.如果父类的方法是private的,那么子类可以用其它类型来覆盖,但是调用时,必须强制转换成子类来调用
本文通过一个示例代码解释了Java中子类变量如何隐藏父类变量,以及静态与非静态方法的重写规则。当使用父类引用指向子类对象时,调用成员变量会使用父类的变量,但可以通过强制类型转换访问子类变量。对于静态方法,子类的重写是隐藏,而非静态方法则是覆盖。同时,private方法虽然可以被子类覆盖,但调用时必须通过子类实例进行。
650

被折叠的 条评论
为什么被折叠?



