Java继承、重写与重载
1.java继承
1.1概念
- 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
- 继承可以使用extends和implements这两个关键字来实现继承,而且所有的类都是继承于java.lang.Object,当一个类没有继承的两个关键字, 则默认继承object (这个类在java.lang包中,所以不需要import)祖先类。
1.2继承的特性
- 子类拥有父类非private的属性、方法。
- 子类可以拥有自己的属性和方法。即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
- Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一 个父类,多重继承就是,例如A类继承B类,B类继承C类,所以按照关系就是C类是B类的父类,B类是A类的父类,这是Java继承区别于C++继承的一个特性。
- 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)
1.3格式
1 class 父类{
2 }
3 class 子类 extends 父类{
4 }
1.4实例
1.4.1extends关键字
在Java中,类的继承是单一继承, 也就是说,一个子类只能拥有一个父类, 所以extends只能继承一个类。
1 public class Animal {
2 private String name ;
3 private int id:
4 public Animal() {}
5 public Animal (String myName,int myid) {
6 //初始化属性值.
7 }
8 public void eat() { //吃东西方法的具体实现 }
9 public void sleep() { //睡觉方法的具体实观}
10 }
11
12 public class Penguin extends Animal {
13 }
14
1.4.2implements关键字
使用implements关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔,下面例子中的A与B)。
1 public interface A {
2 public void eat() ;
3 public void sleep() ;
4 }
5 public interface B {
6 public void show() ;
7 }
8 public class C implements A, B{
9 public void eat() {}
10 public void sleep() {}
11 public void show() {}
12 }
1.4.3super与this关键字
super关键字 : 我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字 : 指向自己的引用。
1 class Animal {
2 void eat() {
3 System.out.println(" animal : eat");
4 }
5 }
6 class Dog extends Animal {
7 void eat() {
8 System.out.println(" dog : eat");
9 }
10 void eatTest() {
11 this.eat(); // this 调用自己的方法.
12 super.eat(); // super 调用父类方法
13 }
14 }
15 Animal a = new Animal();
16 a.eat();
17 Dogd = new Dog();
18 d.eatTest();
19
1.4.4构造器
- 子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在F类的构造器中显式地通过super 关键字调用父类的构造器并配以适当的参数列表。
- 如果父类构造器没有参数,则在子类的构造器中不需要使用super 关键字调用父类构造器,系统会自动调用父类的无参构造器。
1 class SuperC1ass {
2 private int n;
3 SuperClass() {
4 System.out.println("SuperClass()");
5 }
6 SuperClass(int n) {
7 System.out.println("SuperClass(int n)");
8 this.n = n;
9 }
10 }
11 // SubClass1类继承
12 class SubClass1 extends SuperClass {
13 private int n;
14 SubClass1(){ //自动调用父类的无参数构造器
15 System.out.println("SubClass1");
16 }
17 public SubClass1(int n) {
18 super(300); //{ 调用父类中带有参数的构造器
19 System.out.println(”SubClass1(int n):" +n);
20 this.n = n;
21 }
22 }
23 // SubClass2类继承
24 class SubClass2 extends SuperClass {
25 private int n;
26 SubClass2() {
27 super(300); //{ 调用父类中带有参数的构造器
28 System.out.println("SubClass2");
29 }
30 public SubClass2(int n){ //自动调用父类的无参数构造器
31 System.out.println("SubClass2(int n):" +n);
32 this.n= n
33 }
34 }
35 System.out.println("-----SubClass类继承-----");
36 SubClass1 sc1 = new SubClass1();
37 SubClass1 sc2 = new SubClass1(100);
38 System.out.println("-----SubC1ass2类继------");
39 SubClass2 sc3 = new SubClass2();
40 SubClass2 sc4 = new SubClass (200);
2.重写(Override)与重载(Overload)
2.1重写规则
- 参数列表必须完全与被重写方法的相同。
- 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5及更早版本返回类型要-样, java7 及更高版本可以不同)。
- 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public, 那么在子类中重写该方法就不能声明为protected.
- 父类的成员方法只能被它的子类重写。
- 声明为final的方法不能被重写。
- 声明为static的方法不能被重写,但是能够被再次声明。
- 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
- 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法。
- 写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是.重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
- 构造方法不能被重写。
- 如果不能继承一个方法,则不能重写这个方法。
2.2重载规则
- 被重载的方法必须改变参数列表(参数个数或类型不一样);
- 被重载的方法可以改变返回类型:
- 被重载的方法可以改变访问修饰符;
- 被重载的方法可以声明新的或更广的检查异常;
- 方法能够在同一个类中或者在一个 子类中被重载。
- 无法以返回值类型作为重载函数的区分标准。
2.3重写与重载的区别
| 区别点 | 重载方法 | 重写方法 |
| 参数列表 | 必须修改 | 一定不能修改 |
| 返回类型 | 可以修改 | 一定不能修改 |
| 异常 | 可以修改 | 可以减少删除,一定不能抛出新的或者更广的异常 |
| 访问 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |
2.4.1重写
重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改
变。即外壳不变,核心重写!
重写的好处在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据
需要实现父类的方法。
1 class Animal {
2 public void move() {
3 System.out.println("动物可以移动");
4 }
5 }
6
7 class Dog extends Animal {
8 public void move() {
9 System. out. print1n("狗可以跑和走");
10 }
11 }
12 Animal a = new Animal(); // Animal对象
13 a.move(); //执行Animal类的方法
14
15 Animal b = new Dog(); //Dog对象
16 b.move(); //执行Dog类的方法
17
2.4.2重载
重载(overloading)是在一个类里面, 方法名字相同,而参数不同。返回类型可以相同
也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一 无的参数类型列表。
最常用的地方就是构造器的重载。
1 public class Overloading {
2 public int test() {
3 System.out.println("test1");
4 return 1;
5 }
6 public void test(int a) {
7 System.out.println("test2");
8 }
9 //以下两个参数类型顺序不同
10 public String test(int a, String s) {
11 System.out.println("test3");
12 return "returntest3";
13 }
14 public String test (String s, int a) {
15 System.out.println(" test4");
16 return "returntest4";
17 }
18 }
19 Overloading o = new overloading();
20 System.out.println(o.test()) ;
21 o.test(1);
22 System.out.println(o.test(1,"test3"));
23 System.out.println(o.test("test4",1));
24
Java继承、重写与重载的更多相关文章
- [转帖]Java中重写和重载与多态的关系
Java中重写和重载与多态的关系 2019-09-05 00:57:41 留下一天今天 阅读数 67 收藏 更多 分类专栏: java进阶之路 版权声明:本文为博主原创文章,遵循CC 4.0 B ...
- 在Python中该如何实现Java的重写与重载
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:清风python PS:如有需要Python学习资料的小伙伴可以加点击 ...
- java知识点--重写与重载
重载(Overload): (1)方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型.重载Overloading是一个类中多态性的一种表现. ...
- Java中重写与重载的辨析
摘要:在我们学习Java过程中,重写与重载使我们在面向对象里要学习的重要知识点之一,那我们看看它们有那些区别: 一.重写 1.概念:简单的说就是子类将从父类继承而来的方法重新实现一次. 2.特点: ① ...
- Java:Java的重写与重载区分
最明显的区别为:重写只存在于子类与父类中,重载存在于一个类中. 具体区别如下: 一.重写(override) override是重写(覆盖)了一个方法,以实现不同的功能.一般是用于子类在继承父类时,重 ...
- Java 方法重写方法重载
1,方法的重载和方法的重写 方法名相同形参列表不通 方法名字的重新定义2,面向过程是分步骤解决问题 用方法组织代码 面向对象是以分类的方式解决问题 用类住址代码3 类是对对象的抽象 对象万事万物都是对 ...
- 浅谈Java中重写与重载的区别
重载和重写是Java中两个截然不同的概念.但是却因为名字相近导致很多人经常混淆. 下面用例子展示出他们之间的区别. 在Java中,重载(overloading) 发生在本类.方法名相同,参数列表不同, ...
- Java中重写与重载的区别
方法重载:关键字overload,方法名和方法的返回类型都相同,方法参数个数和类型不一样方法重写:也叫方法覆盖,关键字override,相对于类继承而言,重写的方法名,返回类型,参数个数,参数类型都要 ...
- java继承-重写-super实例补充
方法重写: 是指子类根据需要父类继承来的方法进行改写,是多态机制的前奏. 重写注意点: 1.重写方法必须和被重写方法具有相同的方法名,参数列表和返回值. 2.重写方法方法不能使用比被重写方法更严格的访 ...
- java的重写、重载、覆盖的差别
多态性 通过继承,一个类能够用作多种类型:能够用作它自己的类型.不论什么基类型,或者在实现接口时用作不论什么接口类型.这称为多态性 重载 每一个类型成员都有一个唯一的签名.方法签名由方法名称和一 ...
随机推荐
- Docker下制作一个容器镜像
操作过程描述: (1)先基于centos的镜像启动一个centos容器 (2)在这个容器中安装nginx (3)然后把这个已经安装了nginx的容器制作成一个docker的镜像 操作:docker c ...
- Python - 进度条库 tqdm
前言 在写生成器的时候,网上看到一个进度条库,感觉蛮有意思,记录下 这个库感觉只有在调试的时候会用到,不做深入学习 内置库,不需要安装 示例代码 from tqdm import tqdm for i ...
- DPDK应用示例指南简介(汇总)
DPDK应用示例指南简介 <DPDK示例>系列文章主要是学习.记录.翻译DPDK官方示例文档.为了更好地理解和学习DPDK, 特通过对源码中的经典示例进行整理,供大家学习.交流和讨论. A ...
- Servlet生命周期和方法
一.五个生命周期方法,有三个很重要,初始化方法.提供服务方法和销毁方法 1.三个主要方法 2.另外两个重写的成员方法只做了解 二.生命周期详解 其中,每次刷新页面都是一次对servlet访问: 页面访 ...
- Spring Boot 入门系列(二十八) JPA 的实体映射关系,一对一,一对多,多对多关系映射!
前面讲了Spring Boot 使用 JPA,实现JPA 的增.删.改.查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用.JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层 ...
- 企业快速开发平台Spring Cloud+Spring Boot+Mybatis+ElementUI 实现前后端分离
鸿鹄云架构一系统管理平台 鸿鹄云架构[系统管理平台]使用J2EE技术来实施,是一个大型分布式的面向服务的JavaEE体系快速研发平台,基于模块化.服务化.原子化.热部署的设计思想,使用成熟领先的无商业 ...
- 将dict.define转化成dict.txt
在使用捷通智能灵云外呼系统V6.1时.需要大量使用到模式码,也就是正则表达式.而老版本365还是使用场景文件. 当要将老版本改编成新版本的时候,需要需要将dict.define文件中的一行行的词条用& ...
- crontab 语法和最快速的学习
1.Cron 时间表语法 # ┌───────────── 分钟 (0 - 59) # │ ┌───────────── 小时 (0 - 23) # │ │ ┌───────────── 月的某天 ( ...
- CodeForce-791B Bear and Friendship Condition(并查集)
Bear Limak examines a social network. Its main functionality is that two members can become friends ...
- linux错误: locate: can not stat () `/var/lib/mlocate/mlocate.db': No such file or directory
命令 locate my.cnf 产生以上错误 此时执行 # updatedb 更新下数据库即可