java方法的继承,覆盖与重载
java中的继承使用extends关键字,在子类继承了父类之后将会获得父类的全部属性与方法(父类的构造器除外)。如果在定义java类时没有显示定义她的父类,那么这个类默认将扩展java.lang.Object类。因此java.lang.Object是所有类的父类,要么是直接父类,要么就是间接父类。
方法的覆盖(Overridden Methods)
在类继承中,子类可以修改从父类继承来的行为,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的:名称、返回类型、参数列表。如果在新类中定义一个方法,其名称、返回类型及参数表正好与父类中方法的名称、返回类型及参数相匹配,那么,新方法被称做覆盖旧方法。
示例:如下在 Employee 和 Manager 类中的这些方法:
public class Employee {
String name;
int salary;
public String getDetails() {
return " Name: " + name + " \n " + "Salary: " + salary;
}
}
public class Manager extends Employee {
String department;
public String getDetails() {
return " Name: " + name + " \n " + " Manager of " +
department;
}
}
Manager 类有一个定义的 getDetails()方法,因为它是从 Employee 类中继承的。基本的方法被子类的版本所代替或覆盖了。
到底运行哪一个方法?
这里会给我们带来一个麻烦,父子类中有相同的方法,那么在运行时到底调用哪一个方法呢?假设下述方案:
Employee e = new Employee();
Manager m = new Manager();
如果请求 e.getDetails()和 m.getDetails(),就会调用不同的行为。Employee 对象将执行与 Employee
有关的 getDetails 版本, Manager 对象将执行与 Manager 有关的getDetails()版本。
不明显的是如下所示:
Employee e = new Manager();
e.getDetails();
或某些相似效果,比如一个通用方法参数或一个来自异类集合的项。事实上,你得到与变量的运行时类型(即,变量所引用的对象的类型)相关的行为,而不是与变量的编译时类型相关的行为。这是面向对象语言的一个重要特征。它也是多态性的 一个特征,并通常被称作虚拟方法调用。
在前例中,被执行的e.getDetails()方法来自对象的真实类型Manager。因此规则是:编译时看数据类型,运行时看实际的对象类型(new 操作符后跟的构造方法是哪个类的)。一句话:new 谁就调用谁的方法。
覆盖方法的规则
子类的方法的名称以及子类方法参数的顺序必须与父类中的方法的名称以及参数的顺序相同以便该方法覆盖父类版本。下述规则适用于覆盖方法:
- 覆盖方法的返回类型、方法名称、参数列表必须与它所覆盖的方法的相同。
- 覆盖方法不能比它所覆盖的方法访问性差(即访问权限不允许缩小)。
- 覆盖方法不能比它所覆盖的方法抛出更多的异常。
这些规则源自多态性的属性和Java编程语言必须保证“类型安全”的需要。考虑一下这个无效方案:
public class Parent {
public void method() {}
}
public class Child extends Parent {
private void method() {// 编译就会出错
}
}
public class Test {
public void otherMethod() {
Parent p1 = new Parent();
Parent p2 = new Child();
p1.method();
p2.method();
}
}
Java编程语言语义规定,p2.method()导致方法的Child版本被执行,但因为方法被声明为 private,p2(声明为 Parent)不能访问它。于是,语言语义冲突。
方法重载:
如果有两个方法的方法名相同,但参数不一致,哪么可以说一个方法是另一个方法的重载。
* 方法名相同
* 方法的参数类型,个数顺序至少有一项不同
* 方法的返回类型可以不相同
* 方法的修饰符可以不相同
* main方法也可以被重载
例如:
public class Test
{
public static void main(String[] args)
{
Human person = new Human();
person.breath(10);
}
}
class Human
{
/**
* breath() 1
*/
void breath()
{
System.out.println("hu...hu...");
}
/**
* breath() 2
*/
void breath(int rep)
{
int i;
for(i = 0; i < rep; i++) {
System.out.println("lu...lu...");
}
}
int height;
}
java方法的继承,覆盖与重载的更多相关文章
- 四. Java继承和多态3. 继承中的方法的覆盖和重载
在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称.返回值类型.参数列表. 如果在新类中定义一个方法,其名称.返回值类型和参数列表正好与父类 ...
- JAVA方法的重载(overload)和覆盖(override)
方法的重载(overload)和覆盖(override) 有的时候,类的同一种功能有多种实现方式,到底采用哪种实现方式,取决于调用者给定的参数.例如我们最常用的System.out.println() ...
- java中的继承、重载和覆盖是什么意思
继承(英语:inheritance)是面向对象软件技术当中的一个概念.如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A的父类别”也可以称“B是A的超类”.继承可以使得 ...
- Java基础进阶:继承重点摘要,继承详解,方法重写注意事项,方法重载与重写的区别,抽象类,代码块, 附重难点,代码实现源码,课堂笔记,课后扩展及答案
继承重点摘要 *继承的特点: 子类在初始化之前,一定要先完成父类数据的初始化 子类在初始化之前,一定要先访问父类构造,完成父类数据的初始化 系统在每一个构造方法中默认隐藏了一句super(); 如果我 ...
- java 的重写(覆盖) 和重载的区别
方法的的重写(覆盖) 在类继承中,子类可以修改从父类继承来的行为,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的:名称.返回类型.参数列表.如果在子类中定义一个方法,其方法名称.返回值 ...
- Java知多少(29)覆盖和重载
在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称.返回值类型.参数列表. 如果在新类中定义一个方法,其名称.返回值类型和参数列表正好与父类 ...
- Java 面向对象之继承和重写OverWrite,重写和重载的区别,抽象类
01继承的概述 A:继承的概念 a:继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系 b:在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作 ...
- 2017.10.10 java中的继承与多态(重载与重写的区别)
1. 类的继承 继承是面向对象编程技术的主要特征之一,也是实现软件复用的重要手段,使用继承特性子类(subclass) 可以继承父类(superclass)中private方法和属性,继承的目的是使程 ...
- static关键字什么意思?Java中是否可以覆盖一个private或者是static的方法?
答案:“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问.Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译 ...
随机推荐
- ORACLE 定时运行存储过程经常使用时间间隔
君阁-笔记 1.建立存储过程.形如: create or replace procedure deleteTableProcedures is begin delete POST_DAY; del ...
- 轻松把玩HttpClient之封装HttpClient工具类(五),携带Cookie的请求
近期更新了一下HttpClientUtil工具类代码,主要是加入了一个參数HttpContext,这个是用来干嘛的呢?事实上是用来保存和传递Cookie所须要的. 由于我们有非常多时候都须要登录.然后 ...
- 朴素贝叶斯分类器(Naive Bayes)
1. 贝叶斯定理 如果有两个事件,事件A和事件B.已知事件A发生的概率为p(A),事件B发生的概率为P(B),事件A发生的前提下.事件B发生的概率为p(B|A),事件B发生的前提下.事件A发生的概率为 ...
- Struts 2相关配置与基本操作演示(案例Demo)
基本介绍 Struts 2 Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架.其全新的Struts 2 ...
- MySQL参数化查询的IN 和 LIKE
https://stackoverflow.com/questions/650455/c-sharp-parameterized-query-mysql-with-in-clausehttps://s ...
- java 读取clob
java 读取clob CreationTime--2018年7月1日09点41分 Author:Marydon 1.说明 jdbc 数据类型为Clob,与java的String类型相对应. 2. ...
- 〖Android〗sshd for android, 及映射根文件系统至本地盘符
严重问题: 若移植失败将可能直接导致手机***无法开机***,导入相关文件需慎重! 达成效果: 1. ssh 远程登录 Android 终端: 2. sftp 挂载/映射 Android 根文件系统至 ...
- 使用springMVC和Jquery实现JSONP
JSONP这个东东是啥我就不写了,直接贴实现的代码 JAVA代码: /** * * 查询用户是否已经提交认证获取已经是认证会员 * * 使用spring mvc的直接返回string会遇到分号转义后字 ...
- django之创建第7-4个项目-配置views文件实现url传值
即:怎么实现url?name=xiaodeng&age=28等类似传值处理 1.配置views文件 # Create your views here. #coding:utf-8 from d ...
- CentOS下递归遍历文件夹下所有文件,查找指定字符
命令如下: find . | xargs grep -ri "XXX"