Java学习笔记(28)--覆写(Override)详解
2017-09-27 09:24
204 查看
一、覆写概念
既然现在出现了继承的关系,那么就存在了子类和父类的联系,而在子类之中有可能定义和父类完全相同的方法或属性的名称,这个时候就称为覆写了。
二、方法的覆写
当子类定义了和父类在方法名称、返回值类型、参数类型及个数完全相同的方法的时候,称为方法的覆写。
没有覆写的操作:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
运行结果:
这时实例化的是子类对象,但是在子类中没有print()方法,那么就使用从父类中继承而来的pritn()方法。
实现覆写:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
运行结果:
当一个类中的方法被覆写后,如果实例化的是这个子类对象,则调用的方法就是被覆写过的方法。
在进行方法覆写的时候有一点需要注意:被子类所覆写的方法不能拥有比父类更严格的访问控制权限。
如果此时父类之中的方法是default权限,那么子类覆写的时候只能是default或public权限,而如果父类的方法是public,那么子类之中方法的访问权限只能是public。
当一个子类覆写了一个父类方法的时候,子类要想调用父类的被覆写过的方法,要在方法前要加上“super”:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
运行结果:
2
一定要记住操作范围:
(1)this.方法():先从本类查找是否存在指定的方法,如果没有找到,则调用父类操作;
(2)super.方法():直接由子类调用父类之中的指定方法,不再找子类。
问题来了:请问以下的操作是覆写吗?
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
运行结果:
首先从覆写的概念上来讲:现在父类的权限是private,而子类是public,的确是扩大了权限,而且方法的参数名称及个数、返回值类型都一样。但这种情况在开发之中是不会出现的,使用了private定义的操作都无法覆写。
三、this和super的区别
![](https://img-blog.csdn.net/20161010180752669)
四、方法重载与覆写的区别
既然现在出现了继承的关系,那么就存在了子类和父类的联系,而在子类之中有可能定义和父类完全相同的方法或属性的名称,这个时候就称为覆写了。
二、方法的覆写
当子类定义了和父类在方法名称、返回值类型、参数类型及个数完全相同的方法的时候,称为方法的覆写。
没有覆写的操作:
package com.wz.overridedemo; class A { public void print() { System.out.println("Hello World ."); } } class B extends A { } public class Test { public static void main(String args[]) { B b = new B(); b.print(); // 方法从父类继承而来 } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
运行结果:
Hello World .1
这时实例化的是子类对象,但是在子类中没有print()方法,那么就使用从父类中继承而来的pritn()方法。
实现覆写:
package com.wz.overridedemo; class A { public void print() { System.out.println("Hello World ."); } } class B extends A { public void print() { // 方法名称、参数类型及个数、返回值全相同 System.out.println("世界,你好!"); } } public class Test { public static void main(String args[]) { B b = new B(); b.print(); // 方法从父类继承而来 } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
运行结果:
世界,你好!1
当一个类中的方法被覆写后,如果实例化的是这个子类对象,则调用的方法就是被覆写过的方法。
在进行方法覆写的时候有一点需要注意:被子类所覆写的方法不能拥有比父类更严格的访问控制权限。
如果此时父类之中的方法是default权限,那么子类覆写的时候只能是default或public权限,而如果父类的方法是public,那么子类之中方法的访问权限只能是public。
当一个子类覆写了一个父类方法的时候,子类要想调用父类的被覆写过的方法,要在方法前要加上“super”:
package com.wz.overridedemo; class A { public void print() { System.out.println("Hello World ."); } } class B extends A { public void print() { super.print(); System.out.println("世界,你好!"); } } public class Test { public static void main(String args[]) { B b = new B(); b.print(); // 方法从父类继承而来 } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
运行结果:
Hello World . 世界,你好!1
2
一定要记住操作范围:
(1)this.方法():先从本类查找是否存在指定的方法,如果没有找到,则调用父类操作;
(2)super.方法():直接由子类调用父类之中的指定方法,不再找子类。
问题来了:请问以下的操作是覆写吗?
package com.wz.overridedemo; class A { private void print() { System.out.println("Hello World ."); } public void fun() { this.print(); } } class B extends A { public void print() { // 不叫覆写 System.out.println("世界,你好!"); } } public class Test { public static void main(String args[]) { B b = new B(); b.fun(); // 方法从父类继承而来 } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
运行结果:
Hello World .1
首先从覆写的概念上来讲:现在父类的权限是private,而子类是public,的确是扩大了权限,而且方法的参数名称及个数、返回值类型都一样。但这种情况在开发之中是不会出现的,使用了private定义的操作都无法覆写。
三、this和super的区别
四、方法重载与覆写的区别
相关文章推荐
- 学习笔记之JavaSE(28)--JavaAPI详解3
- Java学习笔记之Pattern类的用法详解(正则表达式)
- 黑马程序员--Java基础加强学习笔记之重载和覆写、可变参数、枚举
- ibatis学习笔记(三)>>>>>>>java实体跟表映射.xml文件详解
- java个人学习笔记10(extends+super+override+final)
- Java学习笔记之Formatter的用法详解
- Java学习笔记之JFreeChart详解
- 黑马程序员 java学习笔记 Day11:反射机制详解
- java学习笔记之文件IO流详解
- java 从零开始,学习笔记之基础入门<Hibernate_配置详解>(三十六)
- java学习笔记—实现一个类MyInputStream(28)
- Java学习笔记28
- effective-java 学习笔记 覆写hashCode
- Java学习笔记之Http协议详解
- JAVA学习笔记-函数的复写(override)
- FreeBSD学习笔记28-pureftpd使用详解(3)-Pureftpd的权限控制
- ibatis学习笔记(三)>>>>>>>java实体跟表映射.xml文件详解
- 黑马程序员J_ava学习笔记_Java中的基本数据类型转换详解
- Java网络编程学习笔记(3)ServerSocket用法详解
- Java学习笔记之Formatter的用法详解(输出格式化)