所有的抱怨都是你努力的结果。
什么是重写
java中的重写是指子类继承父类的方法,并重新改写父类中已经实现了的方法。
重写的特点:
1.子类和父类在同一个包中,子类拥有父类所有非私有访问修饰符的方法和属性。
2.子类和父类在不同的包中,子类拥有父类所有非私有和非默认访问修饰符的方法和属性。
重写的规则:
子类重写父类的方法要遵循那些规则呢?
普通方法的重写:
1.子类中重写父类的方法,方法名必须一致,且参数列表要相同。
2.子类中重写父类的方法,重写的方法中抛出的异常不能比父类的异常更大。
3.子类中重写父类的方法,重写的方法的访问修饰符不能比父类中被重写的那个方法的访问修饰符更严格。
4.子类中重写父类的方法,子类的返回值要和父类的返回值要有子父级关系或者是子类和父类的返回值类型是相同类型,并且且子类的返回值要能自动转型成父类方法返回值类型。
静态方法和属性的继承:
为什么我这个地方叫继承而不是叫重写呢?
因为static修饰的方法不能被重写,只能被继承。而属性也是只有重新声明和继承,没有重写的概念。静态方法和属性不能被重写(属性没有重写的概念,这里就按重写的方式描述了)只能被继承。
虽然,子类不能重写父类的静态方法和属性,但是java允许子类重新创建一个符合重写规则的静态方法和属性。但是要注意子类的这个按照重写规则创建的静态方法和属性并不是重写。
public class Father{
//父类中的静态方法
public static void test(){
System.out.println("父类中的静态方法");
}
}
public class Son extends Father{
/*
这种情况直接编译不通过,验证了上面所说的静态方法不能重写
@Override
public static void test(){
System.out.println("子类重写父类的静态方法");
}*/
//按照重写规则,重新创建和父类中同名的静态方法
public static void test(){
System.out.println("子类重写父类的静态方法");
}
public static void main(String[] args){
Father f=new Son();
Son s=(Son)f;
f.test();
s.test();
}
}
输出结果:
父类中的静态方法
子类重写父类的静态方法
以上结果符合上述所说。如果父类中存在属性也会和上面代码结果类似,在此就不做验证了。
深入理解重写:
1.子类继承父类的方法,从父类继承过来的方法归子类所有,每个子类创建出来的对象独有一份。
2.父类声明指向子类对象,父类声明只能访问子类和父类公有的部分。
3.子类重写父类的普通方法,如果是父类声明指向子类对象,则父类声明访问的是子类重写方法的实现。产生了一个方法重写的隐藏,就是全部访问的都是子类中的方法。
4.子类按照重写规则在子类中创建和父类同名的静态方法和属性,如果是父类声明指向子类对象,这里会产生一个域的隐藏。父类声明访问的是父类的静态方法和属性。如果是子类声明指向子类对象,那访问的肯定就是子类的静态方法和属性了。注意:这里不管是父类声明还是子类声明访问的都是按照重写规则,在子类重新创建出来和父类的静态方法和属性声明方式完全一致,只是静态方法中内部的实现不同,属性赋值不同。
public class Father{
//父类中的静态方法
public static void test(){
System.out.println("父类中的静态方法");
}
//父类中的普通方法
public void show(){
System.out.println("父类中show普通方法");
}
//父类中的普通方法
public void print(){
System.out.println("父类中print普通方法");
}
}
public class Son extends Father{
/*
这种情况直接编译不通过,验证了上面所说的静态方法不能重写
@Override
public static void test(){
System.out.println("子类重写父类的静态方法");
}*/
//按照重写规则,重新创建和父类中同名的方法
public static void test(){
System.out.println("子类重写父类的静态方法");
}
//重写父类中的普通方法
@Override
public void show(){
System.out.println("子类中重写父类的show普通方法");
}
public static void main(String[] args){
Father f=new Son();
Son s=(Son)f;
f.test();//调用父类的静态方法
s.test();//调用子类按照重写规则与父类同名的静态方法
f.show();//调用子类重写父类的普通方法
f.print();//调用子类从父类继承过来的普通方法
s.show();//调用子类重写父类的普通方法
s.print();//调用子类从父类继承过来的普通方法
}
}
输出结果:
父类中的静态方法 //f.test()
子类重写父类的静态方法 //s.test()
子类中重写父类的show普通方法 //f.show()
父类中print普通方法 //f.print()
子类中重写父类的show普通方法 //s.show();
父类中print普通方法 //s.print()
以上结果符合普通方法重写的隐藏,也符合域的隐藏。
以上就是java中重写的介绍,希望对你有所帮助。