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)来增强或减弱父类的方法和行为,但覆写是针对非静态方法(也叫做实例方法,只有生成实例才能调用的方法)的,不能针对静态方法 ...
随机推荐
- gogland golang 颜色&字体 colors&font 配置文件
<scheme name="Ya" version="142" parent_scheme="Darcula"> <opt ...
- ThinkPhp 生成静态页面
//开启静态缓存'HTML_CACHE_ON' => true, //开启缓存'HTML_CACHE_TIME' =>60, //开启缓存时间'HTML_FILE_SUFFIX' => ...
- spring Aop概念
面向切面编程(AOP)通过提供另外一种思考程序结构的途经来弥补面向对象编程(OOP)的不足.在OOP中模块化的关键单元是类(classes),而在AOP中模块化的单元则是切面.切面能对关注点进行模块化 ...
- CodeSmith Generator 6.5 自动生成后的源码分析
1,NetTiers代码结构流程分析: 2,CodeSmithNetTiers使用实践总结 参看流程结构图和实体定义文件关系图,可以看出自动代码生成后,若是手工来调,还是很麻烦的.鉴于此,建议:1,若 ...
- vue环境中生成二维码
<template><div><div id='code'></div><canvas id="canvas">< ...
- 基于SSH的记账管理系统设计与实现-JavaWeb项目-有源码
开发工具:Myeclipse/Eclipse + MySQL + Tomcat 项目简介: Java记账管理系统主要用于财务人员可以从账务中判断公司的发展方向.对个人和家庭而言,通过记账可以制定日后的 ...
- arcgis android 10.2.5开发环境配置
android里要添加arcgis android 的支持,其实本质是添加了jar包,so库,清单文件里申请了权限而已. 插件是为了方便创建arcgis android工程,然后并没有什么卵用. ar ...
- TSQL--可以在触发器中使用COMMIT吗?
很多场景中,我们使用触发器来回滚一些不满足业务逻辑的修改,这没有问题,问题是我能在触发器中提交事务吗? 这个问题很小白,当也来测试一下 /*测试中创建三种表,对表 TB2 插入时触发触发器,在触发器中 ...
- Python【变量】
本文介绍 1.Python运算符 运算符分类 运算符分为:算数运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算 一.算数运算:返回数字 假设变量a=10,b=20 运算符: + 相加a+ ...
- ODBC方式操作oracle数据库
ODBC方式操作oracle数据库 一.查询语句: var strConn = System.Configuration.ConfigurationManager.ConnectionStrings[ ...