Java——覆写(概念、覆写的意义、覆写的要求)
1、方法的覆写
当子类定义了与父类中完全一样的方法时(参数名称、参数类型及个数、返回值类型),这样的操作就为方法的覆写。
【举例】:观察方法的覆写
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
B b = new B();
b.print();
}
}
class A{
public void print(){
System.out.println("********A*********");
}
}
class B extends A{
}
B是A的子类,B中没有定义方法
此时,在B中定义与A中完全一样的方法:
class B extends A{
public void print(){
System.out.println("********B*********");
}
}
以上实例化的是B类,B类中定义了与其父类完全相同的方法print(),所以最后调用的一定是被覆写过的方法。
1)方法覆写的意义:
- 1、父类中定义的方法名称是其他程序认可的,但是子类使用时发现,原有方法不能满足现在的操作要求,但要保留原方法名称,因此出现了覆写的概念;
- 2、this方法与super方法的区别:
--this.方法():先找本类中是否有指定的方法,若没有,则使用父类继承的方法; --super.方法():不查找本类的方法,直接找父类的方法;
2)但是覆写本身也是有要求的:
被覆写的方法不能有比父类更严格的访问控制全权限。对于访问控制权限,严格来讲一共有四个,目前我们接触有3个,
private < default < public,即若父类中的方法使用了public访问权限声明,子类只能使用public,若父类使用的是default,子类只能使用default或public。举例如下:
class A{
public void print(){
System.out.println("********A*********");
}
}
class B extends A{
void print(){
System.out.println("********B*********");
}
}
但是有一点需要注意,在父类中若是用private声明的方法,该方法不能被子类所覆写,且这样的操作没有什么实际意义。实际开发中,对于方法的定义,基本都使用public声明。
【注意】Overloading与Override的区别?在进行OverLoading时能否改变返回值类型?
No. |
区别 |
方法重载 |
方法覆写 |
---|---|---|---|
1 |
单次 |
Overloading |
Override |
2 |
范围 |
发生在一个类中 |
发生在继承关系中 |
3 |
定义 |
方法名称相同,参数类型及个数不同 |
方法名称、参数类型、个数及返回值全部相同 |
4 |
权限 |
没有权限要求 |
被覆写的方法不能有比父类更为严格的访问控制权限 |
进行方法重载时,可以使用不同的返回值类型,但是从设计标准来说,不建议这么做。
2、属性覆盖
当子类中定义了与父类属性名称相同的属性,就成为属性的覆盖。
【举例】:观察属性的覆盖
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
B b = new B();
System.out.println(b.info);
}
}
class A{
String info = "hello";
}
class B extends A{
int info = 1;
}
实际开发的标准要求来讲,类的属性必须使用private封装,封装后,覆盖属性就没有意义了。
【注意】:this与super的区别?
No. |
区别 |
this |
super |
---|---|---|---|
1 |
概念 |
表示调用本类属性、方法 |
调用父类属性、方法 |
2 |
构造要求 |
调用构造方法时必须在构造方法的首行,所以this()与super()不能同时出现,但是子类永远会调用父类的构造方法 |
|
3 |
特殊要求 |
表示当前对象 |
---- |
使用this实际上会先从本类查找需要的内容,若没有,查询父类,而使用super,直接去查找父类。
3、总结
1)所以类中的属性都必须用private定义,这样属性覆盖就没有意义了;
2)方法 的覆写调用特点:
- 看实例化的是哪个子类的对象;
- 观察调用的方法是否已经被子类覆写过,若是,则调用覆写过的方法,否则,调用从父类继承而来的方法。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- ubuntu15.10下hadoop2.7.2的安装与配置详解
- linux服务器被植入ddgs、qW3xT.2挖矿病毒的处理实战记录
- Linux 创建修改删除用户和组的方法
- 详解Ubuntu16.04安装nvidia驱动+CUDA+cuDNN的教程
- linux free命令详解
- Linux下memcache编译安装与基本使用教程
- Linux中MongoDB如何实现远程自动备份详解
- 覆盖原先的PATH导致命令失效提示command not found的解决方法
- Linux中可以节省你时间的15个命令别名
- Linux下利用unzip命令如何解压多个文件详解
- linux查看磁盘使用情况方法
- 详解Linux(centos7)下安装OpenSSL安装图文方法
- 面试官:考你几个简单的事件问题吧
- 如何创建Linux的swap交换分区文件的方法步骤
- Linux利用keepalived实现lvs的高可用性的操作方法