继承类对方法的影响java_4-Java面向对象-继承(上)

什么是继承?继承有哪些特点?我们在Java中如何实现继承?

程序中的继承(面向对象编程思想来源于生活):

AAffA0nNPuCLAAAAAElFTkSuQmCC

解决重复代码的出现问题。抽取共性生成父类。

AAffA0nNPuCLAAAAAElFTkSuQmCC

此时猫和狗直接继承父类将可以直接使用父类的这些成员属性和方法。此时子类当中的方法就可以只写子类所特有的东西。

特点: 1. 利于代码复用;2. 缩短开发周期

继承是: -种类与类之间的关系; 使用已存在的类的定义作为基础建立新类。已存在的类称为父类(基类); 建立的新类称为子类(派生类)。

新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类

满足 "A is a B"的关系就可以形成继承关系;

AAffA0nNPuCLAAAAAElFTkSuQmCC

继承的概念和特点

代码中是通过 extends 关键字实现继承的。

编写父类:class Animal{  // 公共的属性和方法}

编写子类,继承父类:class Dog extends Animal{  //子类特有的属性和方法}class Cat extends Animal{  //子类特有的属性和方法}

java中只能继承一个父类(单继承)。子类可以访问父类非私有成员package cn.mtianyan.inherit;public class Animal {    private String name;    private int month;    private String species;    public Animal(){

}    public String getName() {        return name;

}    public void setName(String name) {        this.name = name;

}    public int getMonth() {        return month;

}    public void setMonth(int month) {        this.month = month;

}    public String getSpecies() {        return species;

}    public void setSpecies(String species) {        this.species = species;

}    // 吃东西

public void eat(){

System.out.println(this.getName()+"在吃东西");

}

}package cn.mtianyan.inherit;public class Cat extends Animal {    private double weight; //体重

public Cat(){

}    public double getWeight() {        return weight;

}    public void setWeight(double weight) {        this.weight = weight;

}    // 跑动的方法

public void run(){

System.out.println(this.getName()+"是一只"+this.getSpecies()+",它在快乐的奔跑");

}

}package cn.mtianyan.inherit;public class Dog extends Animal {    private  String sex; //性别

public void Dog(){

}    public String getSex() {        return sex;

}    public void setSex(String sex) {        this.sex = sex;

}    // 睡觉的方法

public void sleep(){

System.out.println(this.getName()+"现在"+this.getMonth()+"个月大,它在睡觉");

}

}package cn.mtianyan.inherit;public class Test {    public static void main(String[] args) {

Cat one = new Cat();

one.setName("花花");

one.setSpecies("中华田园猫");

one.eat();

one.run();

System.out.println("===============");

Dog two = new Dog();

two.setName("妞妞");

two.setMonth(1);

two.eat();

two.sleep();

}

}

AAffA0nNPuCLAAAAAElFTkSuQmCC

可以看到子类继承了父类之后可以访问父类的非私有成员,但是父类的私有成员子类还是无法直接访问的,但可以通过父类暴露的公有方法实现间接访问。

AAffA0nNPuCLAAAAAElFTkSuQmCC

当然父类对象也不可以访问到子类特有的方法或属性。父类不可以访问子类特有成员(那怕是公有的)

方法的重写

现在狗中的吃东西方法是父类的吃东西的方法,我希望狗有自己独立的吃东西的方法。虽然有父类吃东西的这个能力,但是表现形式是不一样的。

AAffA0nNPuCLAAAAAElFTkSuQmCC

可以通过方法重写来实现。我们之前学过方法重载的概念

方法重载: 1. 同一个类中; 2. 方法名相同,参数列表不同(参数顺序、个数、类型);3. 方法返回值、访问修饰符任意。4. 与方法的参数名无关// 睡觉的方法

public void sleep(){

System.out.println(this.getName()+"现在"+this.getMonth()+"个月大,它在睡觉");

}    // 睡觉方法的重载方法

private String sleep(String name){        return "";

}    // 只要两个参数的类型顺序不同

public void sleep(String name,int month){

}    public void sleep(int month,String name){

}    // 与方法的参数名无关,加上下面的代码会和上面的 sleep(int month,String name)造成重复定义

public void sleep(int age,String month){

}

方法的重写(下)

语法规则:

返回值类型;方法名;参数类型、顺序、个数; 前述要素都要与父类继承的方法相同

前提是有继承关系,子类来重写父类。

方法重写: 1.有继承关系的子类中; 2. 方法名相同,参数列表相同(参数顺序、个数、类型),方法返回值相同;方法的访问修饰符是可以允许有变化的(有条件的)

这种条件性,讲解访问修饰符的时候再说。// 狗类中 子类重写父类吃东西方法

public void eat(){

System.out.println(this.getName()+"最近没有食欲");

}

当子类重写父类方法后,子类对象调用的是重写后的方法。

AAffA0nNPuCLAAAAAElFTkSuQmCC// 动物类中: 吃东西

public void eat(){

System.out.println(this.getName()+"在吃东西");

}// 狗类中 子类重写父类吃东西方法

public void eat(String month){

System.out.println(month+"最近没有食欲");

}

狗类中重写父类的吃东西方法,我使用的是java10,即使参数列表不同也是可以重写的。(这里就不太清楚什么情况了)我测试这样的参数不同的重载,就不能在后面实现父类对象指向子类方法的多态了。后面具体学到再说

方法重写的碎碎念

不止可以定义同名的方法来重写父类的方法,还可以在子类中定义与父类同名的属性。public int temp =150; // 动物类中public int temp =300; // 猫类中

AAffA0nNPuCLAAAAAElFTkSuQmCC

编程联系

编程练习:请使用面向对象的思想,设计自定义类完成如下功能要求:

接收用户输入的信息,选择需要完成的工作任务。其中,可供选择的有:测试工作和研发工作。关于类型设定描述如下:

测试工作属性:工作名称、编写的测试用例个数、发现的Bug数量 方法:工作描述

研发工作属性:工作名称、有效编码行数、目前没有解决的Bug个数 方法:工作描述

AAffA0nNPuCLAAAAAElFTkSuQmCCpackage cn.mtianyan.bug;public class Programmer {    public String getWorkerName() {        return workerName;

}    public Programmer(){

}    public Programmer(String workerName, int usefulCodeNum, int bugCodeNum) {        this.workerName = workerName;        this.usefulCodeNum = usefulCodeNum;        this.bugCodeNum = bugCodeNum;

}    public void setWorkerName(String workerName) {        this.workerName = workerName;

}    public int getUsefulCodeNum() {        return usefulCodeNum;

}    public void setUsefulCodeNum(int usefulCodeNum) {        this.usefulCodeNum = usefulCodeNum;

}    public int getBugCodeNum() {        return bugCodeNum;

}    public void setBugCodeNum(int bugCodeNum) {        this.bugCodeNum = bugCodeNum;

}    private String workerName;    private int usefulCodeNum;    private int bugCodeNum;    public void workerInfo(){

System.out.println("父类信息测试: 开心工作");

}

}package cn.mtianyan.bug;public class TestProgrammer extends Programmer {    public TestProgrammer(){

}    public TestProgrammer(String workerName, int usefulCodeNum, int bugCodeNum) {        this.setWorkerName(workerName);        this.setUsefulCodeNum(usefulCodeNum);        this.setUsefulCodeNum(bugCodeNum);

}    public void workerInfo(){

System.out.print(this.getWorkerName()+"类测试: "+this.getWorkerName()+"的日报是: 今天编写了"+this.getUsefulCodeNum());

System.out.printf("个测试用例,发现了"+this.getBugCodeNum()+"个bug");

}

}package cn.mtianyan.bug;public class DevelopProgrammer extends Programmer {    public DevelopProgrammer(String workerName, int usefulCodeNum, int bugCodeNum) {        this.setWorkerName(workerName);        this.setUsefulCodeNum(usefulCodeNum);        this.setUsefulCodeNum(bugCodeNum);

}    public void workerInfo(){

System.out.print(this.getWorkerName()+"信息类测试: "+this.getWorkerName()+"的日报是: 今天编写了"+this.getUsefulCodeNum());

System.out.printf("行代码,目前仍然有"+this.getBugCodeNum()+"个bug没有解决");

}

}package cn.mtianyan.bug;public class Test {    public static void main(String[] args) {

Programmer programmer = new Programmer();

programmer.workerInfo();

TestProgrammer testProgrammer = new TestProgrammer("测试工作",10,5);

testProgrammer.workerInfo();

System.out.println();

DevelopProgrammer developProgrammer = new DevelopProgrammer("研发工作",1000,10);

developProgrammer.workerInfo();

}

}

这里子类中想要有带参构造函数,父类必须有一个默认构造函数(无参构造函数或全参全默认值构造函数)

访问修饰符

公有的: public; 私有的: private; 受保护的: protected; 默认

private:只允许在本类中进行访问,离开了当前类就不允许被访问了。

public:允许在任意位置访问

protected:允许在当前类,同包中的子类/非子类都可以,跨包子类调用。跨包的非子类不允许调用。

默认: 允许在当前类,跨包子类/非子类都不允许,同包子类/非子类都可调用,访问修饰符本类同包子类其他private√

默认√√

protected√√√

public√√√√

自上而下,访问范围越来越小;自下而上,限制能力越来越强。

大家还记得之前提到的那个问题吗 方法的重写与访问修饰符的关系。

AAffA0nNPuCLAAAAAElFTkSuQmCC

访问修饰符对方法重写的影响

答案: 子类重写父类方法时,访问修饰符是允许改变的。要求是: 访问范围要求大于等于父类的访问范围。

如果父类是public 那么子类的也必须是public

AAffA0nNPuCLAAAAAElFTkSuQmCC

可以看到不遵守,就会报错。

面向对象程序来源于生活,父类当然希望子类比自己的交际范围更强更广。

super关键字的使用(上)

子类可以继承父类的方法,也可以重写自己的方法。那么问题来了,如何判断子类的其他方法中调用的这个方法是父类的还是自己的。//  Animal类 吃东西

public void eat(){

System.out.println(this.getName()+"在吃东西");

}    // 狗类中 子类重写父类吃东西方法

public void eat(){

System.out.println(this.getName()+"最近没有食欲");

}

// 狗类中的睡觉方法

public void sleep(){

eat();

System.out.println(this.getName()+"现在"+this.getMonth()+"个月大,它在睡觉");

}Dog two = new Dog();

two.setName("妞妞");

two.sleep();

运行结果:

AAffA0nNPuCLAAAAAElFTkSuQmCC

可以看到调用的是子类中重写过后的方法。

super关键字是对父类对象的引用。// 狗类中的睡觉方法

public void sleep(){        super.eat();

System.out.println(this.getName()+"现在"+this.getMonth()+"个月大,它在睡觉");

}

此时直接指明调用父类对象的eat方法。而且不止调用成员方法,也可以访问成员属性super.temp = 10;

普通的成员方法都是可以通过super被子类访问到的,但是构造方法是不可以的。因为父类的构造方法是不允许被继承,不允许被重写。虽然它两个不允许,但是它的存在是非常必要的,子类对象的实例化要依赖于父类对象存在默认构造函数(无参或全参全默认值)

继承的初始化顺序

满足继承关系的子类对象是如何产生的?

认识子类对象的实例化过程:package cn.mtianyan.inherit;public class Animal {    private String name;    private int month;    private String species;    public int temp =150;    private static int st1=22;    public static int st2=23;    static {

System.out.println("我是父类的静态代码块");

}

{

System.out.println("我是父类的构造代码块");

}    public Animal(){

System.out.println("我是父类的无参构造方法");

}

}package cn.mtianyan.inherit;public class Cat extends Animal {    private double weight; //体重

// public int temp =300;

public static int st3 =44;    static {

System.out.println("我是子类的静态代码块");

}

{

System.out.println("我是子类的构造代码块");

}    public Cat(){

System.out.println("我是子类的无参构造方法");

}

}

作者:天涯明月笙

链接:https://www.jianshu.com/p/5c14308bccf4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javaSE基础代码案例

package org.test; import java.util.Arrays; import java.util.Scanner;/*** * 项目名称:Test * 类名称:TestMain * 类描述: * 创建人:Mu Xiongxiong * 创建时间:2018-3-29 下午3:49:00 * 修改人&…

迪杰斯特拉算法(最短路径)

描述 算法过程 代码实现 package com.atguigu.dijkstra;import com.sun.xml.internal.fastinfoset.algorithm.BooleanEncodingAlgorithm;import javax.sound.midi.Soundbank; import java.util.Arrays; import java.util.TimerTask;public class DijkstraAlgorithm {public st…

MySQL instr()函数

转载自 MySQL instr()函数 MySQL INSTR函数简介 有时,您想要在字符串中查找子字符串或检查字符串中是否存在子字符串。在这种情况下,您可以使用字符串内置INSTR()函数。 INSTR()函数返回字符串中子字符串第一次出现的位置。如果在str中找不到子字符串…

如何给视频中插入视频,字幕,以及去掉前后广告

昨天白天接到了一个这样的需求,就是剪辑一段视频,给视频中加入插入一个剪短的介绍,然后把没有用的截取掉。 看起来很简单,确实,利用常用的视频剪辑软件就可以直接实现,但是事实并不是这样的,接…

ZKEACMS for .Net Core 深度解析

ZKEACMS 简介 ZKEACMS.Core 是基于 .Net Core MVC 开发的开源CMS。ZKEACMS可以让用户自由规划页面布局,使用可视化编辑设计“所见即所得”,直接在页面上进行拖放添加内容。 ZKEACMS使用插件式设计,模块分离,通过横向扩展来丰富CMS…

java design按钮_DesignJava 设计模式,讲述 的各种 方便在项目中进行 框架结构 Develop 238万源代码下载- www.pudn.com...

文件名称: DesignJava下载收藏√ [5 4 3 2 1 ]开发工具: Java文件大小: 1675 KB上传时间: 2013-11-21下载次数: 2提 供 者: 102426详细说明:JAVA设计模式,讲述java的各种设计模式,方便在项目中进行设计框架结构-JAVA design patterns, j…

剪辑视频、去掉爱剪辑前后广告、视频中添加黑幕简要教程

昨天白天接到了一个这样的需求,就是剪辑一段视频,给视频中加入插入一个剪短的介绍,然后把没有用的截取掉。看起来很简单,确实,利用常用的视频剪辑软件就可以直接实现,但是事实并不是这样的,接下…

弗洛伊德算法

思路分析 代码实现 package com.atguigu.floyd;import java.util.Arrays;public class FloydAlgorithm {public static void main(String[] args) {//测试看看图是否创建成功char[] vertex{A,B,C,D,E,F,G};//创建邻接矩阵int[][] matrixnew int[vertex.length][vertex.length]…

Productivity Power Tools,对于Visual Studio 2017的15个扩展

在Visual Studio 2017正式发布期间,微软公司更新并发布了Productivity Power Tools的扩展版本。Productivity Power Tools的这个版本包括了针对VS 2017的15处扩展。 新版本Productivity Power Tools的优点之一是它允许微软监测哪些组件是开发者最频繁使用的&#xf…

常用数据库复习资料

mast:数据库控制SQL Server的所有方面。这个数据库中包括所有的配置信息、用户登录信息、当前正在服务器中运行的过程的信息。model:数据库是建立所有用户数据库时的模板。当你建立一个新数据库时,SQL Server会把model数据库中的所有对象建立一份拷贝并移…

利用 Azure Functions 实现无服务器体系结构

从工具到机器再到计算机,我们一直在寻找能够自动执行重复工作并让我们所处理的上下文规范化的方法,以便我们可以将重心放在做出高价值的专业化贡献上,从而完成任务并解决问题。 与此同时,很显然,随着 IT 产业的不断发展…

2020蓝桥杯省赛---java---C---3( 跑步训练)

题目描述 代码实现 方式一 方式二 package com.atguigu.lanqiao;public class Main {public static void main(String[] args) {int target10000;int count0;boolean flagtrue;//判断此次是否需要跑步while (true){//如果小于600体力并且需要跑步,证明这一分钟跑…

sqlserver中常用的几个存储过程

sqlserver中的存储过程,何为存储过程呢? 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译&#x…

java枚举类定义性别_Java 枚举类和自定义枚举类和enum声明及实现接口的操作

1.枚举类注:JDK1.5之前需要自定义枚举类JDK 1.5 新增的 enum 关键字用于定义枚举类若枚举只有一个成员, 则可以作为一种单例模式的实现方式1.枚举类的属性1、枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰2、枚举类的使用 private final 修饰的…

2020蓝桥杯省赛---java---B---4( 合并检测)

题目描述 思路分析 假设A国有n个人,感染者有n/100 每k个人一组,共n/k组,共用n/k瓶试剂 按照最坏的情况,每多出一个感染者就多用k瓶试剂, 因此共用n/k(n/100)*k瓶试剂 n是定值,所以求(1/kk/100)最小 由于ab…

visual studio 2017发布dotnet core到docker

docker的好处不用多说,有不了解的可移步《docker入门》,作为一个.net方面的老鸟也想早点搭上docker末班车,减少布署中的各种坑。以下我是在Visual Studio 2017正式版发布后(其实VS2015也是可以的),完全跑起…

JDK环境变量配置

1.变量名: JAVA_HOME 变量值:(变量值填写你的jdk的安装目录,例如本人是 E:\Java\jdk1.8.0)2.变量名: Path 变量值: ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;3.变量名: CLASSPATH 变量…

2020蓝桥杯省赛---java---B---5( REPEAT 程序)

题目描述 【问题描述】附件 prog.txt 中是一个用某种语言写的程序。其中 REPEAT k 表示一个次数为 k 的循环。循环控制的范围由缩进表达,从次行开始连续的缩进比该行多的(前面的空白更长的)为循环包含的内容。例如如下片段:REPEA…

强势解析 eBay BASE 模式、去哪儿及蘑菇街分布式架构

互联网行业是大势所趋,从招聘工资水平即可看出,那么如何提升自我技能,满足互联网行业技能要求?需要以目标为导向,进行技能提升。 本文主要针对分布式系统设计、架构(数据一致性)做了分析,祝各位早日走上属于…

利用老毛头启动盘重装win7

注意:请不要跟着本教程一步一步的做,要先看一遍 1.安装win7安装 安装win7系统所需材料: 老毛桃PE系统 下载地址:http://www.laomaotao.tv/如使用其它PE系统也是一样,这里我用老毛桃为例 Win系统镜像…