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

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

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

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

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

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

实例如下:

父类:

package ExtendMethod;

public class CommonMethod {
protected int x=100;
public int getX() {//定义一个普通返回值的实例方法
return x;
}
public CommonMethod getObject() {//定义一个返回复合类型的方法
return new CommonMethod();
}
public final void setX(int ix) {
x=ix;
}
protected void proShowMsg() {//定义一个具有保护权限的方法
System.out.println("this is protected ShowMsg() in Common class");
} public void pubShowMsg() {//定义一个具有公共访问权限的方法
System.out.println("this is public showMsg() in Common class");
}
static public void stShowMsg() {//定义一个静态方法
System.out.println("this is static showMsg() in Common class");
}
}

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

public class OverrideMember_1 extends Common{
//覆盖父类中的同名实例方法
public void pubShowMsg() {
System.out.println("this is public showMsg in derive class");
}
//覆盖父类中的同名静态方法
static public void stShowMsg() {
System.out.println("this is static showMsg() in derive class");
}
//可以任意覆盖
public static void main(String args[]) {
OverrideMember_1 oa =new OverrideMember_1();
oa.pubShowMsg();
oa.proShowMsg();
}
}

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

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

三、返回值类型的覆盖

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

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

public class OverrideMember_4 extends Common{
//覆盖getX()方法,并将其指定为最终方法,正确,原方法为public int getX()
public final int getX() {
return x;
}
//覆盖最终方法,错误,原方法为 public final void setX()
/*public void setX(int ix) {
x=ix;
}*/
}

五、static不能有任何改变

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

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. Ubuntu下Nginx启动、停止等常用命令

    本文详细介绍Ubuntu下Nginx启动.停止等常用命令.在开发过程中,我们会经常的修改Nginx的配置文件,每次修改配置文件都可以先测试下本次修改的配置文件是否正确,可以利用以下命令: servic ...

  2. python中常见的三种句型if,while,for

    1.if语句: 特别说明:条件后面的冒号不能少,同样必须是英文字符. 特别特别说明:if内部的语句需要有一个统一的缩进,一般用4个空格.python用这种方法替代了其他很多编程语言中的{}. num= ...

  3. 练手项目:利用pygame库编写射击游戏

    本项目使用pygame模块编写了射击游戏,目的在于训练自己的Python基本功.了解中小型程序框架以及学习代码重构等.游戏具有一定的可玩性,感兴趣的可以试一下. 项目说明:出自<Python编程 ...

  4. PHP读取大文本文件并处理数据的思路

    //处理文件 $file = fopen($filename, "r") or exit("Unable to open file!"); $total_lin ...

  5. 关于 iOS 分类(Category)的实现代码

    其实质是对一个类的扩充,对类扩充的方法有两种: (1)通过继承(经常用到) (2)通过分类 一个已知类Name 其头文件Name.h #import <Foundation/Foundation ...

  6. vue.js 安装过程(转载)

      一.简介 Vue.js 是什么 Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核 ...

  7. node.js简单搭建服务,访问本地站点文件

    1.安装nodejs服务(从官网下载安装),node相当于apache服务器 2.在自己定义的目录下新建服务器文件如 server.js 例如,我在D:\nodeJs下创建了server.js文件 v ...

  8. Servlet中文乱码问题解决办法

    首先对于源jsp网站和servlet里面的字符集要一样,一般支持中文的字符集为UTF-8最好采用这个字符集(除此之外还有gb2312); 对于源jsp文件的代码中需要设置 设置你的page里面的字符集 ...

  9. Centos定时启动和清除任务

    因为需要定时并发执行任务,所以查到了crontab这个工具,介绍一下其用法: SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=roo ...

  10. 安装CentOS7

    安装环境:虚拟机*1 使用软件:CentOS7镜像*1 安装过程: 虚拟机配置步骤(主要部分): 1.安装为Linux:CentOS 64位 2.分配1G内存(若需求大可根据实际情况分配) 3.分配4 ...