Java 覆写初探
Java 覆写
继承性的主要特征是子类可以根据父类已有的功能进行功能扩展,但是在子类定义属性或方法的时候有可能定义属性和方法和父类同名,在此类情况下就称为:“覆写”。
方法的覆写:【改良原本功能不足的方法】
子类定义的方法与父类方法名称相同、参数的类型及个数、返回值相同的方法。
class A { public void fun() { System.out.println("A.fun()方法") ; } } class B extends A { public void fun() { System.out.println("B.fun()方法") ; } } public class TestAB { public static void main(String args[]) { B b = new B() ; b.fun() ; } }
当发生覆写之后,此时会调用实例化子类中被覆写的方法;{注意:覆写的方法,要和父类的一模一样才可以称为覆写操作}
一个类可能会产生(被继承)多个子类,那么每个子类都会有一个自己的代码方法,子类被实例化后只会执行自己被覆写的方法。【没有被覆写的方法,则调用父类的方法】
但是被覆写的方法不能拥有比父类更严格的访问控制权限
访问控制权限: Public > default > private(最严格的)
同理:如果父类使用了public,子类的覆写方法只能是public;如果父类使用了default,子类的覆写方法只能是public和default ……
class A { public void fun() { print() ; } public void print() { System.out.println("A") ; } } class B extends A { public void print() { System.out.println("B") ; } } public class TestAB { public static void main(String args[]) { B b = new B() ; b.fun() ; } }
说明:实例化子类B,所以fun方法是在B类中执行的,调用的就是B类中的print方法;
class A { public void fun() { print() ; } private void print() { System.out.println("A") ; } } class B extends A { public void print() { System.out.println("B") ; } } public class TestAB { public static void main(String args[]) { B b = new B() ; b.fun() ; } }
说明:这个例子中,就会发现子类中根本没有覆写print()方法,也就是说使用了private对于子类而言是不可见的,就算子类定义一个符合要求的覆写语句,也不可以发生覆写;这个时候子类使用的方法,实际上就相当于子类自己定义了一个新的方法而已。
覆写之后,默认情况下子类所能够调用的一定是被覆写过的方法,如果还想调用父类中的方法,可以使用super.* 关键字;
class A { public void fun() { print() ; } public void print() { System.out.println("A") ; } } class B extends A { public void print() { super.print() ; System.out.println("B") ; } } public class TestAB { public static void main(String args[]) { B b = new B() ; b.fun() ; } }
super()和this()问题研究:
1、 super(参数):调用基类(父类)中的某一个构造函数(默认)
2、 this(参数):调用本类中的另一种形成的构造函数
3、 super()和this()都在构造函数第一行,但不可以同时存在
4、 super:引用当前对象的直接父类的成员(用来访问父类中的隐式继承属性和方法函数)
5、 this:表示引用当前对象名,调用的只是本类中的属性和方法函数
— this()和super()都要在构造函数的首行。
面试题:解释重载与覆写的区别?(Overloading与Overrid的区别)
区别 |
重载 |
覆写 |
名字 |
Overloading |
Overrid |
范围 |
发生在一个类中 |
发生在子类和父类之中 |
定义 |
方法名称、参数类型及个数相同 |
方法名称、参数类型、个数、方法返回值相同 |
权限 |
没有权限的限制 |
被覆写的方法不能拥有比父类严格的访问控制权限 |
在Overloading时,返回值类型是否可以不同?
在发生重载的时候,返回值类型可以不同,但是考虑到程序设计的统一性,重载时,尽量保证返回值类型相同。
属性覆盖:【无意义】
如果子类定义了和父类完全相同的属性名称的时候,就称为属性的覆盖。
class A { String info = "Hello" ; } class B extends A { int info = 100 ; public void print() { System.out.println(this.info) ; //查找本类中的info System.out.println(super.info); //查找父类的info } } public class TestAB { public static void main(String args[]) { B b = new B() ; b.print() ; } }
·发生继承关系后,就会应用覆写操作,覆写的应用主要以 方法覆写 为主;
·如果子类需要使用父类指定的方法,但是发现父类的方法不能满足功能需求,就可以利用覆写方法,来完善父类方法的功能的同时保留父类的方法不被改变。
·被子类覆写的方法不能拥有比父类更为严格的访问控制权限。
Java 覆写初探的更多相关文章
- java覆写hashcode方法
覆写hashcode 1. 把某个非零常数值,例如17,保存在int变量result中: 2. 对于对象中每一个关键域f(指equals方法中考虑的每一个域): 3, boolean型,计算(f? 0 ...
- java覆写equals方法
何时需要重写equals() 当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念). object规范规定,如果要重写equals(),也要重写hashcode() 如何覆写equals() ...
- JAVA覆写Request过滤XSS跨站脚本攻击
注:本文非本人原著. demo的地址:链接:http://pan.baidu.com/s/1miEmHMo 密码:k5ca 如何过滤Xss跨站脚本攻击,我想,Xss跨站脚本攻击令人为之头疼.为什么呢. ...
- 【转】 Java多态特性:重载和覆写的比较
Java重载: 在同一个类中 方法具有相同的名字,相同或不同的返回值,但参数不同的多个方法(参数个数或参数类型) public class MethoDemo{ public static void ...
- Java多态特性:重载和覆写的比較
Java重载: 在同一个类中 方法具有同样的名字,同样或不同的返回值,但參数不同的多个方法(參数个数或參数类型) public class MethoDemo{ public static void ...
- JAVA继承与覆写
实例:数组操作 首先是开发一个整型数组父类,要求从外部控制数组长度,并实现保存数据以及输出.然后子类中实现排序和反转. 基础父类代码如下: class Array { private int data ...
- 黑马程序员——JAVA基础之简述 类的继承、覆写
------- android培训.java培训.期待与您交流! ---------- 继承的概述: 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只 ...
- JAVA中继承时方法的重载(overload)与重写/覆写(override)
JAVA继承时方法的重载(overload)与重写/覆写(override) 重载-Override 函数的方法参数个数或类型不一致,称为方法的重载. 从含义上说,只要求参数的个数或参数的类型不一致就 ...
- [改善Java代码]不要覆写静态方法
建议33: 不要覆写静态方法 我们知道在Java中可以通过覆写(Override)来增强或减弱父类的方法和行为,但覆写是针对非静态方法(也叫做实例方法,只有生成实例才能调用的方法)的,不能针对静态方法 ...
随机推荐
- QT学习之多线程
[为什么要用多线程?] 传统的图形用户界面应用程序都只有一个执行线程,并且一次只执行一个操作.如果用户从用户界面中调用一个比较耗时的操作,当该操作正在执行时,用户界面通常会冻结而不再响应.这个问题可以 ...
- bootstrap-海棠
12 缩略图和警告框 <p class='alert alert-info'>这个是警告组<button class='close' data-dismiss='alert'> ...
- thinkphp+memcache缓存例子
public function dailyRelays() { $history = I('post.history'); $da = new \Home\Model\DailyrelayModel( ...
- django 'set' object does not support indexing
在定义Model之后使用syncdb 同步的时候报出这个错误,检查之后发现是用错了.在model的Meta里面,排序这些用的应该是 ordering = ['last','first','middle ...
- VS2010下安装OpenCV2.4.3
本文记录Windows 7 X86 SP1操作系统环境下,安装与配置OpenCV2.4.3的详细步骤.前置需求:已安装有VS2010. 下载并安装OpenCV 从http://www.opencv.o ...
- IIS虚拟目录加载NFS配置注意事项
1,IIS下挂载的路径不要填写挂载的盘符,填 \\NFSIP地址\NFSID\ ,正确挂载的前提是在windows下开启了NFS客户端的功能. 2,IIS 网站中读写NFS 也不要用盘符,也用 步骤1 ...
- ZKEACMS 模板组件扩展
前言 如果你还不知道ZKEACMS,不妨先了解一下. ASP.NET MVC 开源建站系统 ZKEACMS 推荐,从此网站“拼”起来 官方地址:http://www.zkea.net/zkeacms ...
- python学习之路 一 :编程语言介绍
本节重点 理解编程语言是什么? 大体明白,编程语言是如何与计算机底层通信的编程语言有哪些分类? 分别列举主流编程语言的特点 什么是编程,为什么要编程 一.什么是编程语言?为什么要编程? 编程:是个动词 ...
- orcal 锁表
--查询Oracle正在执行的sql语句及执行该语句的用户 SELECT b.sid oracleID, b.username 登录Oracle用户名, b.serial#, spid 操作系统ID, ...
- javascript实现playfair和hill密码算法
时至期末,补习信息安全概论作业.恰巧遇古典密码学算法中的playfair算法和hill算法,用javascript语言实现起来是在有趣,边查百度边编码,顺便好好补习一下javascript基础. pl ...