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的,那么子类可以用其它类型来覆盖,但是调用时,必须强制转换成子类来调用