package codingSuggest.overrideAndHide;
/**
* @author Administrator
* 父类
*/
public class Base {
public static void doSomething(){
System.out.println("我是父类的静态方法");
}
public void doAnything(){
System.out.println("我是父类的非静态方法");
}
}
package codingSuggest.overrideAndHide;
/**
* @author Administrator
* 子类
*/
public class Sub extends Base{
public static void doSomething(){
System.out.println("我是子类的静态方法");
}
@Override
public void doAnything(){
System.out.println("我是子类的非静态方法");
}
}
package codingSuggest.overrideAndHide;
public class Client {
public static void main(String[] args) {
Base base = new Sub();
//调用非静态方法
base.doAnything(); //我是子类的非静态方法
//调用静态方法
base.doSomething(); //我是父类的静态方法
/**
* 分析:
* 一个实例对象有两个类型:表面类型和实际类型
* 表面类型是声明时的类型
* 实际类型是对象产生时的类型
* 在例子中,base是表面类型,sub是实际类型
* 对于非静态方法,它是根据对象的实际类型来执行的
* 对于静态方法,它不依赖实例对象,它是通过类名直接访问的
* 如果是通过对象调用静态方法,JVM会通过对象的表面类型查找到静态方法的入口,从而执行它
* 总结:
* 在子类中构建与父类相同的方法名、输入参数、输出参数、访问权限(权限可以扩大),
* 并且父类、子类都是静态方法,这种行为叫做隐藏。
* 与覆写的不同:
* 1.表现形式不同:隐藏用于静态方法,覆写用于非静态方法。
* 在代码上的表现是:@Override注解可以用于覆写,不能用于隐藏
* 2.职责不同:隐藏的目的是为了抛弃父类的静态方法,重现子类方法
* 例如我们的例子:
* sub.doSomething的出现是为了遮盖父类的base.doSomething方法,
* 也就是期望父类的静态方法不要破坏子类的业务行为
* 而覆写则是将父类的行为增强或减弱,延续父类的职责
* 建议:
* 静态方法不能重写,虽然不能重写,但是可以隐藏。
*/
}
}
覆写与隐藏
最新推荐文章于 2022-04-04 21:53:52 发布