方法的继承与属性的继承有很大的不同,属性任何继承方式均可,而方法则有各种限制,于是在这里做了一个简单的总结:

1、修饰符相同的方法覆盖,即只改内部,不改外部

2、访问权限不同的方法覆盖,子类只能相对父类越来越宽松,例如父类是public,子类就不能是缺省或protect,private

3、返回值的类型覆盖,只允许相容的返回类型,例如不能将返回值为int型改为double型,但是复合类型则例外

4、final的方法覆盖,只能是父类无,子类有,而不能是父类有,子类无

5、static(静态)的方法覆盖不能有任何变动,即父类有,子类必须有,父类无,子类也必须无

实例如下:

父类:

  1. package ExtendMethod;
  2.  
  3. public class CommonMethod {
  4. protected int x=100;
  5. public int getX() {//定义一个普通返回值的实例方法
  6. return x;
  7. }
  8. public CommonMethod getObject() {//定义一个返回复合类型的方法
  9. return new CommonMethod();
  10. }
  11. public final void setX(int ix) {
  12. x=ix;
  13. }
  14. protected void proShowMsg() {//定义一个具有保护权限的方法
  15. System.out.println("this is protected ShowMsg() in Common class");
  16. }
  17.  
  18. public void pubShowMsg() {//定义一个具有公共访问权限的方法
  19. System.out.println("this is public showMsg() in Common class");
  20. }
  21. static public void stShowMsg() {//定义一个静态方法
  22. System.out.println("this is static showMsg() in Common class");
  23. }
  24. }

一、修饰符相同的可以任意覆盖:

  1. public class OverrideMember_1 extends Common{
  2. //覆盖父类中的同名实例方法
  3. public void pubShowMsg() {
  4. System.out.println("this is public showMsg in derive class");
  5. }
  6. //覆盖父类中的同名静态方法
  7. static public void stShowMsg() {
  8. System.out.println("this is static showMsg() in derive class");
  9. }
  10. //可以任意覆盖
  11. public static void main(String args[]) {
  12. OverrideMember_1 oa =new OverrideMember_1();
  13. oa.pubShowMsg();
  14. oa.proShowMsg();
  15. }
  16. }

二、访问权限不同的覆盖,只能越来越宽松,private——>public的方向

  1. public class OverrideMember_2 extends Common{
  2. public void proShowMsg() {//覆盖父类中的protect方法,public > protect,正确
  3. System.out.println("this is public ShowMsg()");
  4. }
  5. /*protected void pubShowMsg() {//权限越来越严格,错误,protect < public
  6. System.out.println("this is protect ShowMsg()");
  7. }*/
  8. }

三、返回值类型的覆盖

  1. public class OverrideMember_3 extends Common {
  2. //覆盖getX()方法,但返回的数据类型不同,原方法是int型,错误
  3. /*public double getX() {
  4. return (double)x;
  5. }*/
  6. //覆盖getObject(),返回类型相容,正确,原方法的返回类型是新common对象,复合类型
  7. public OverrideMember_3 getObject() {
  8. return new OverrideMember_3();
  9. }
  10. }

四、final的方法覆盖,只能从无到有,不能从有到无

  1. public class OverrideMember_4 extends Common{
  2. //覆盖getX()方法,并将其指定为最终方法,正确,原方法为public int getX()
  3. public final int getX() {
  4. return x;
  5. }
  6. //覆盖最终方法,错误,原方法为 public final void setX()
  7. /*public void setX(int ix) {
  8. x=ix;
  9. }*/
  10. }

五、static不能有任何改变

  1. public class OverrideMember_5 extends Common{
  2. //试图覆盖实例方法,将其改为静态方法,错误,原型为 public void pubShowMsg()
  3. /*public static void pubShowMsg() {
  4. System.out.println("this is public ShowMsg()");
  5. }*/
  6. //试图覆盖静态方法,并将其指定为实例方法,错误
  7. /*public void stShowMsg() {
  8. System.out.println("this is static ShowMsg()");
  9. }*/
  10. }
  11. //总结,静态与实例之间不能相互转换

java继承方法规则或规律的更多相关文章

  1. 乐字节Java继承|方法重写、super和final关键字

    大家好,乐字节的小乐又来了,上一篇是:乐字节Java|JavaBean.继承与权限修饰,也是属于Java继承的,今天继续Java继承. 一. 方法的重写 父类不满足子类的要求,按需改写.注意 方法签名 ...

  2. Java继承方法隐藏(覆盖)

    方法隐藏 一个类从其超类继承所有非私有静态方法.在子类中重新定义继承的静态方法称为方法隐藏.子类中的重定义静态方法隐藏其超类的静态方法.在类中重定义非静态方法称为方法覆盖.关于方法隐藏的重定义方法(名 ...

  3. java继承方法覆盖

    public class TestB { private void f() { System.out.println("TestB"); } public static void ...

  4. JNI/NDK开发指南(二)——JVM查找java native方法的规则

    通过第一篇文章,大家明白了调用native方法之前,首先要调用System.loadLibrary接口加载一个实现了native方法的动态库才能正常访问,否则就会抛出java.lang.Unsatis ...

  5. Java中方法的继承以及父类未被子类覆盖的方法调用的问题

    在看java继承这一块的时候发现了一个问题,即父类未被子类覆盖的方法是如何调用的? 是子类拥有了父类的该方法只是没有显示表示,还是子类调用了父类的该方法. 为此做了一下验证 代码如下: public ...

  6. Java继承之方法重写

    目录 Java继承之方法重写 代码体现 概念 注意事项 "两同两小一大" 其他注意点 重写与重载 @Override注解 Java继承之方法重写 在Java继承中,子类可以获得父类 ...

  7. Java—继承、封装、抽象、多态

    类.对象和包 1) 面向对象编程(Object Oriented Programming ,简称 OOP):20世纪70年代以后开始流行. 2) 结构化编程与面向对象编程的区别: A. 在结构化编程中 ...

  8. java 继承、重载、重写与多态

    首先是java 继承.重载和重写的概念 继承: 继承的作用在于代码的复用.由于继承意味着父类的所有方法亦可在子类中使用,所以发给父类的消息亦可发给衍生类.如果Person类中有一个eat方法,那么St ...

  9. SpringBoot —— AOP注解式拦截与方法规则拦截

    AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. SpringBoot中AOP的使用 ...

随机推荐

  1. this 指针

    #include<iostream> using namespace std; class A { private: int a; int b; public: A(int a,int b ...

  2. u-boot核心初始化

    异常向量表:异常:因为内部或者外部的一些事件,导致处理器停下正在处理的工作,转而去处理这些发生的事件.ARM Architecture Reference Manual p54页.7种异常的类型:Re ...

  3. php.ini 中文详解

    [PHP]  ; PHP还是一个不断发展的工具,其功能还在不断地删减  ; 而php.ini的设置更改可以反映出相当的变化,  ; 在使用新的PHP版本前,研究一下php.ini会有好处的   ;;; ...

  4. Angular Pipe的应用

    1-在html文件中使用管道:(管道符合使用,用':'号隔开) ①页面中添加: <div class="table_content" *ngFor="let ite ...

  5. iOS7动态调整文字大小

    iOS7添加了动态调整文字的大小,app可以通过接受通知的方式进行设置 iOS 7 introduces Dynamic Type, which makes it easy to display gr ...

  6. linux下lampp(xampp)安装memcached扩展

    原理:根据自己的lampp中的php版本,编译memcache时,引用对应下载的php版本,并安装后的php_config来生成memcache.so文件,再将这个so文件放置到lamppp对应位置, ...

  7. HDU 6035(树形dp)

    题意略. 思路:有n * (n - 1) / 2这么多边,要枚举是不可能的,感觉和数据结构也沾不上边.再加上树上染色,以一条边上不同颜色作为这个边的值,这看起来像是算贡献那种题,和17icpc沈阳的某 ...

  8. Java架构工程师知识图,你都知道么?

    1.工程化专题 (团队大于3个人之后,你需要去考虑团队合作,科学管理)  2.源码分析专题 (好的程序员,一行代码一个设计就能看出来,源码分析带你品味代码,感受架构)  大家可以点击加入群:69757 ...

  9. hdu 2553 N皇后

    这题要打表,不然超时. AC代码 #include<cstdio> #include<cstring> int n,cnt; int vis[3][20]; int ans[1 ...

  10. 决策树--ID3 算法(一)

    Contents      1. 决策树的基本认识      2. ID3算法介绍      3. 信息熵与信息增益      4. ID3算法的C++实现 1. 决策树的基本认识    决策树是一种 ...