重写发生于类的继承,当子类覆盖了父类的相同签名的方法(即方法名和参数列表相同)就产生了重写。
实例如下
class Coo{void f(){System.out.println("父类之f");}}class Doo extends Coo{@Overridevoid f() {// TODO Auto-generated method stubSystem.out.println("子类之f");}}
c类中有f()方法,d类中也有f()方法,且参数列表相同,此时d.f()就覆盖了c.f()。当Main方法中,输入下列代码
Coo c=new Doo();c.f();
控制台结果为子类之f,这是因为重写方法在调用时,进行的是编译绑定,决定使用子类还是父类f()方法的是引用指向的对象而不是引用的类型.
重写除了满足签名必须相同之外还需满足一下三点
1.当方法的返回值类型是引用类型时,子类方法的返回值必须是父类方法的子类或同类
class Sup{}class Sub extends Sup{}class A{public sub say(){return null;}}class B extends A{public Sup say(){ return null;}}
此时编译器会在B中重写的say方法处报错
2.子类方法的访问修饰符范围必须大于等于父类的访问修饰符范围
class Sup{}class Sub extends Sup{}class A{protected void show(){}}class B extends A{void show(){}}
同样编译器会在B类中的show()方法处报错
3.子类方法抛出的异常必须是父类方法抛出异常的子异常
class A{void show ()throws ArithmeticException{}}class B extends A{void show()throws Exception{}}
java中的常量
java中常量由static final修饰的类型就是常量 在程序编译阶段会将其替换为常量