阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

面向对象的三大特征-继承

371次阅读
没有评论

共计 5545 个字符,预计需要花费 14 分钟才能阅读完成。

1、继承概述

1.1、什么是继承

继承是面向对象的核心特性,是面向对象的学习重点。同时继承是代码复用的重要方式,可以表示类与类之间的关系,是所有面向对象语言不可缺少的组成部分。

1.2、继承由来

1.2.1、子类与父类

当一个类的属性与行为均与现有类相似,属于现有类的一种时,这一个类可以定义为现有类的子类。

或者换成相反的角度来看,如果多个类具有相同的属性和行为,我们可以抽取出共性的内容定义父类,这时再创建相似的类时只要继承父类即可。

1.2.2、子类与父类关系

子类拥有父类的所有属性与方法,无需重新定义。并且可以直接使用非私有的父类成员。

从类与类之间的设计关系来看, 子类必须属于父类的一种时,才会继承。

我们在完成一个庞大项目体系的时候,都是将共性的内容抽取出,后续构建过程是从各种父类“向外”扩散的。

2、继承定义及使用

2.1、继承定义

格式:

class 子类 extends 父类 {// 父类的非私有方法与属性均继承过来 }

案例:

class Person{private String name; public void eat(){System.out.println(“吃饭”); } //get/set 方法 }

子类继承父类的定义:

class ChinesePerson extends Person{}

2.2、继承使用

继承关系的产生通常是为了定义出功能更为具体、更为强大的子类。所以,定义子类后,一般创建子类对象使用。子类可以直接使用父类非私有的成员变量与成员方法 (注:如果成员变量没有使用 private 修饰,则子类也可直接访问。)

class PersonDemo{public static void main(String[] args) {ChinesePerson  c = new ChinesePerson(); c.setName("张大力"); String name = c.getName(); System.out.println(name);// 打印结果为张大力 c.eat();  // 打印结果吃饭 }

3、继承关系

面向对象的三大特征 - 继承

动物类可以有姓名、年龄的成员变量,可以有吃饭、睡觉的方法。

所有猫科与犬科均有动物的成员变量与成员方法,且猫科与犬科均属于动物,所以猫科与犬科均可以继承动物类。

猫科可以在动物的基础上再添加抓老鼠的方法

犬科可以在动物的基础上再添加看门的方法

犬科与猫科仍可以继续出现子类,如波斯猫、巴厘猫、沙皮狗、斑点狗等,而其子类仍可以再出现该品种的特性。

案例:

/*  * Animal 的类  * 属性  * name * age  * 行为  * 吃  * 睡 */ public class Animal {// 成员变量 private String name; private int age; // 吃 public void eat(){System.out.println("吃"); } // 睡 public void sleep(){System.out.println("睡"); } //-----------get/set------------------- public String getName() {return name; } public void setName(String name) {this.name = name; } public int getAge() {return age; } public void setAge(int age) {this.age = age; } }
/*  * 定义一个猫类  * 属性  *  name    *  age  *  kind  * 行为  *  吃  *  睡  *  抓老鼠  */ public class Cat extends Animal {private String kind; @Override public void eat(){System.out.println("猫吃鱼"); } // 猫特有的功能  抓老鼠 public void catchMouse(){System.out.println("抓耗子"); } public String getKind() {return kind; } public void setKind(String kind) {this.kind = kind; } }
/*  * 定义一个狗类  * 属性  *  name    *  age  *  kind  * 行为  *  吃  *  睡  *  看门  */ public class Dog extends Animal {private String kind; @Override public void eat() {System.out.println("狗吃肉"); } // 狗特有功能  看门 public void lookDoor() {System.out.println("看门"); } public String getKind() {return kind; } public void setKind(String kind) {this.kind = kind; } }
/*  * 自定义类型 家  * 地址  * 行为  * 在家吃饭  */ public class Home {private String address; // 动物在家吃饭 // 在所有使用父类类型的地方均可以传入其子类对象。 public void eatAtHome(Animal a) {// 调用 Animal 的 eat 方法 a.eat();} // 狗在在家吃饭 public void eatAtHome(Dog dog) {System.out.println("狗在家吃了"); // 调用狗的 eat 方法 dog.eat();} // 猫在家吃饭 public void eatAtHome(Cat cat) {System.out.println("猫在家吃了"); // 调用猫的 eat 方法 cat.eat();} public String getAddress() {return address; } public void setAddress(String address) {this.address = address; } }
/**  * 测试家类 */ public class Test {public static void main(String[] args) {//  创建 Home 对象 Home home = new Home(); Animal a = new Animal(); home.eatAtHome(a); // 在所有使用父类类型的地方均可以传入其子类对象。 Dog d = new Dog(); home.eatAtHome(d); Cat c = new Cat(); home.eatAtHome(c); } }

运行结果:

面向对象的三大特征 - 继承

4、继承注意事项

4.1、Java 只支持单继承,不支持多继承。即只能有一个父类。

// 单继承 class A extends B{} class B extends C{} // 多继承, 错误 class A extends B{} class A extends C{}

4.2、父类可以继续有父类。

class A extends B{} class B extends C{}

4.3、所有类均有父类,只有 Object 类没有父类。

class A{} // 相当于 class A extends Object{}// 所有类都继承了 Object 类,继承 Object 类可以省略

4.4、在所有使用父类类型的地方均可以传入其子类对象。

class B{} class A extends B{} // 测试类 class C{public void c(B b){} public static void main(String args[]){new C().c(new A()); } }

5、方法重写

5.1、什么是方法重写

当子类继承父类后,拥有了父类的成员并可以直接调用父类非私有方法。如果子类认为父类提供的方法不够强大,子类可以按照子类自身的逻辑重新定义继承过来的父类方法,这个重新定义一个方法的过程叫做方法重写。(注:在学习完多态和抽象类后我们会对方法重写有更深的理解)

5.2、方法重写格式

子类中定义与父类一样的方法便将父类的方法重写了。此时,当创建子类对象,调用方法时,会调用子类重写后的方法。

案例 1:

父类

public class Person{private String name; public void eat(){System.out.println("吃饭"); } //get/set public String getName() {return name; } public void setName(String name) {this.name = name; } }

子类

public class ChinesePerson extends Person{@Override //@Override 是用于强制规定当前定义的方法一定为重写的方法 public void eat() {System.out.println("按照中国的习惯,使用筷子吃"); } }

子类使用

public class PersonDemo{public static void main(String[] args) {ChinesePerson c = new ChinesePerson(); c.setName("张大力"); // 父类继承方法直接调用 String name = c.getName(); // 父类继承方法直接调用 System.out.println(name); // 打印结果为张大力 c.eat(); // 方法重写后调用的为重写后的方法 // 打印结果:按照中国的习惯,使用筷子吃 } }

运行结果:

面向对象的三大特征 - 继承

案例 2:

public class Person{private String name; String address;// 增加了一个地址成员,可初始化 public void eat(){System.out.println("吃饭"); } //get/set public String getName() {return name; } public void setName(String name) {this.name = name; } }
/*  * 定义类型  学生类  *  * 姓名  年龄  *  * 继承  *   概念 1    *     *   方法重写  *    子类继承父类后,可以直接使用父类的非私有成员,但是如果觉得父类的成员方法不够强大,子类可以按照自身的逻辑  *    将继承过来的父类方法,进行重写(方法重写,方法复写,方法覆盖)*     *   可以使用 @Override 来验证你的方法是不是重写方法。*/ public class Student extends Person{private String number; public void method(){System.out.println(address); System.out.println(getName()); } // 重写父类 eat 方法 @Override public void eat(){System.out.println("学生吃学生套餐"); } public String getNumber() {return number; } public void setNumber(String number) {this.number = number; } } 
/*  * 测试继承后的 Studnet  */ public class StudentDemo {public static void main(String[] args) {// 创建 Studnet 对象 Student s = new Student(); s.setName("柳柳"); s.setNumber("0900112"); s.eat(); String name = s.getName(); System.out.println(name); System.out.println(s.getNumber()); System.out.println("-----------------"); // 子类调用自己特有的方法 s.method();} }

运行结果:

面向对象的三大特征 - 继承

5.3、方法重写规则

子类重写方法时,在声明前加 @Override 可检测该方法是否为重写的方法

访问权限相同或子类方法访问权限更大 (访问权限顺序 public> 默认)

class Fu{void show(){}   public void method(){}} class Zi extends Fu{public void show(){}  // 编译运行没问题   void method(){}      // 编译错误 }

方法名称必须相同

参数列表必须相同

返回值为基本类型时必须相同

返回值为引用类型时相同或子类小 (了解)

案例:

/*  * 方法重写的注意事项  *  子类重写方法时,在声明前加 @Override 可检测该方法是否为重写的方法  *  访问权限相同或子类方法访问权限更大 (访问权限顺序 public> 默认)  *  方法名称必须相同  *  参数列表必须相同  *  返回值为基本类型时必须相同  *  返回值为引用类型时相同或子类小 (了解)  */ public class Fu {public void method(){System.out.println("父类方法"); }     public int sum(){return 0;  }      public Person get(){return null;  } } 
public class Zi extends Fu{// 访问权限相同或子类方法访问权限更大 (访问权限顺序 public> 默认) @Override  public void method(){System.out.println("子类方法"); }  // 返回值为基本类型时必须相同 @Override public int sum(){return 100; } // 返回值为引用类型时相同或子类小 (了解) @Override public Student get(){return null; } }

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-06-06发表,共计5545字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7976507
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件 大家好,我是星哥,很多人都希望能高效地保存微信公众号的文章,用于...
安装并使用谷歌AI编程工具Antigravity(亲测有效)

安装并使用谷歌AI编程工具Antigravity(亲测有效)

  安装并使用谷歌 AI 编程工具 Antigravity(亲测有效) 引言 Antigravity...
升级自动部署更新SSL证书系统、申请godaddy的APIKEY

升级自动部署更新SSL证书系统、申请godaddy的APIKEY

升级自动部署更新 SSL 证书系统、申请 godaddy 的 APIKEY 公司之前花钱购买的 ssl 证书快...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的 Nano Banana Pro?附赠邪修的用法 前言 大家好,我是星哥,今天来介绍谷歌的 ...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face 免费服务器 +Docker 快速部署 HertzBeat 监控平台 ...
安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装 Black 群晖 DSM7.2 系统安装教程(在 Vmware 虚拟机中、实体机均可)! 前言 大家好,...
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸 前言 作为天天跟架构图、拓扑图死磕的...
4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

  4 盘位、4K 输出、J3455、遥控,NAS 硬件入门性价比之王 开篇 在 NAS 市场中,威...
支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare 也瘫了连监控都挂,根因藏在哪? 最近两天的互联网堪称“故障...