3.Java值传递与引用传递( 五 )


上面的代码不叫重写,静态方法与非静态方法区别很大,重写只与非静态,非,非final修饰的方法有关;
静态方法可以被继承,但是,不能被覆盖,即重写 。如果父类中定义的静态方法在子类中被重新定义,那么在父类中定义的静态方法将被隐藏 。可以使用语法:父类名.静态方法调用隐藏的静态方法 。
如果父类中含有一个静态方法,且在子类中也含有一个返回类型、方法名、参数列表均与之相同的静态方法,那么该子类实际上只是将父类中的该同名方法进行了隐藏,而非重写 。换句话说,父类和子类中含有的其实是两个没有关系的方法,它们的行为也并不具有多态性
因此,通过一个指向子类对象的父类引用变量来调用父子同名的静态方法时,只会调用父类的静态方法 。
如果上方的test去掉则输出结果都是“子类” 。
总结:重写需要有继承关系,子类重写父类的方法;方法名必须相同,形参列表不能改变,方法体(就是方法里的代码)可以不同;形参列表不能改变,返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同);修饰符:子类重写方法的范围可以扩大但不能缩小;抛出的异常可以缩小但不能扩大,例如父类的一个方法申明了一个检查异常 ,但是在重写这个方法的时候不能抛出异常,因为是的父类,只能抛出的子类异常 。声明为 final 的方法不能被重写;构造方法不能被重写;
子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 ,final, 的方法;子类和父类不在同一个包中,那么子类只能够重写父类的声明为和的非 final 方法;如果不能继承一个类,则不能重写该类的方法 。
为什么需要重写:父类的功能,子类不一定需要或者不一定满足!
8.Java多态
多态是方法的多态,属性不存在多态的说法 。多态存在的条件:有继承关系,子类重写父类方法,父类引用指向子类对象 。
摘自:java提高篇(四)-----理解java的三大特性之多态 -- 博客园
封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据 。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法 。
继承是为了重用父类代码 。两个类若存在IS-A的关系就可以使用继承 。,同时继承也为实现多态做了铺垫 。那么什么是多态呢?多态的实现机制又是什么?请看我一一为你揭开:
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定 。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性 。
比如你是一个酒神,对酒情有独钟 。某日回家发现桌上有几个杯子里面都装了白酒,从外面看我们是不可能知道这是些什么酒,只有喝了之后才能够猜出来是何种酒 。你一喝,这是剑南春、再喝这是五粮液、再喝这是酒鬼酒….在这里我们可以描述成如下:
酒 a = 剑南春
酒 b = 五粮液
酒 c = 酒鬼酒
这里所表现的的就是多态 。剑南春、五粮液、酒鬼酒都是酒的子类,我们只是通过酒这一个父类就能够引用不同的子类,这就是多态——我们只有在运行的时候才会知道引用变量所指向的具体实例对象 。