面向对象2:继承

目录

2.1继承

2.2 继承的好处

2.3 权限修饰符

2.4 单继承、Object

2.5 方法重写

2.6 子类中访问成员的特点

2.7 子类中访问构造器的特点



面向对象1:静态

2.1继承

向对象编程之所以能够能够被广大开发者认可,有一个非常重要的原因,是因为它有三大特征,继承、封装和多态

接下来,使用继承来编写代码,注意观察继承的特点。

public class A{//公开的成员public int i;public void print1(){System.out.println("===print1===");}//私有的成员private int j;private void print2(){System.out.println("===print2===");}
}

然后,写一个B类,让B类继承A类。在继承A类的同时,B类中新增一个方法print3

public class B extends A{public void print3(){//由于i和print1是属于父类A的公有成员,在子类中可以直接被使用System.out.println(i); //正确print1(); //正确//由于j和print2是属于父类A的私有成员,在子类中不可以被使用System.out.println(j); //错误print2();}
}

接下来,我们再演示一下,创建B类对象,能否调用父类A的成员。再写一个测试类

public class Test{public static void main(String[] args){B b = new B();//父类公有成员,子类对象是可以调用的System.out.println(i); //正确b.print1();//父类私有成员,子类对象时不可以调用的System.out.println(j); //错误b.print2(); //错误}
}

来看看继承的内存原理。

子类对象实际上是由子、父类两张设计图共同创建出来的。

所以,在子类对象的空间中,既有本类的成员,也有父类的成员。但是子类只能调用父类公有的成员。

2.2 继承的好处

  • 先写一个父类 People,用来设计Teacher和Consultant公有的成员。

public class People{private String name;public String getName(){return name;}public void setName(String name){this.name=name;}
}
  • 再写两个子类Teacher继承People类,同时在子类中加上自己特有的成员。

public class Teacher extends People{private String skill; //技能public String getSkill(){return skill;}public void setSkill(String skill){this.skill=skill;}public void printInfo(){System.out.println(getName()+"具备的技能:"+skill);}
}
  • 最后再写一个测试类,再测试类中创建Teacher、Consultant对象,并调用方法。

public class Test {public static void main(String[] args) {// 目标:搞清楚继承的好处。Teacher t = new Teacher();t.setName("播仔");t.setSkill("Java、Spring");System.out.println(t.getName());System.out.println(t.getSkill());t.printInfo();}
}

执行代码,打印结果如下:

只需要记住 :继承可以提高代码的复用性  

2.3 权限修饰符

在刚才使用继承编写的代码中我们有用到两个权限修饰符,一个是public(公有的)、一个是private(私有的),实际上还有两个权限修饰符,一个是protected(受保护的)、一个是缺省的(不写任何修饰符)。

什么是权限修饰符呢?

权限修饰符是用来限制类的成员(成员变量、成员方法、构造器...)能够被访问的范围。

每一种权限修饰符能够被访问的范围如下  

2.4 单继承、Object

Java语言只支持单继承,不支持多继承,但是可以多层继承

2.5 方法重写

什么是方法重写

当子类觉得父类方法不好用,或者无法满足父类需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法,这就是方法重写。

 注意:重写后,方法的访问遵循就近原则。下面我们看一个代码演示

写一个A类作为父类,定义两个方法print1和print2

public class A {public void print1(){System.out.println("111");}
​public void print2(int a, int b){System.out.println("111111");}
}

再写一个B类作为A类的子类,重写print1和print2方法。

public class B extends A{// 方法重写@Override // 安全,可读性好public void print1(){System.out.println("666");}
​
​// 方法重写@Overridepublic void print2(int a, int b){System.out.println("666666");}
}

接下来,在测试类中创建B类对象,调用方法

public class Test {public static void main(String[] args) {// 目标:认识方法重写,掌握方法重写的常见应用场景。B b =  new B();b.print1();b.print2(2, 3);}
}

执行代码,我们发现真正执行的是B类中的print1和print2方法

 

知道什么是方法重写之后,还有一些注意事项,需要和大家分享一下。

- 1.重写的方法上面,可以加一个注解@Override,用于标注这个方法是复写的父类方法
- 2.子类复写父类方法时,访问权限必须大于或者等于父类方法的权限public > protected > 缺省
- 3. 重写的方法返回值类型,必须与被重写的方法返回值类型一样,或者范围更小
- 4. 私有方法、静态方法不能被重写,如果重写会报错。

关于这些注意事项( 总结起来就8个字:声明不变,重新实现

方法重写的应用场景

方法重写的应用场景之一就是:子类重写Object的toString()方法,以便返回对象的内容。

2.6 子类中访问成员的特点

原则:在子类中访问其他成员(成员变量、成员方法),是依据就近原则的  

2.7 子类中访问构造器的特点

子类中访问构造器的语法规则

  • 首先,子类全部构造器,都会先调用父类构造器,再执行自己。

    执行顺序,如下图按照① ② ③ 步骤执行:

子类访问构造器的应用场景

  • 如果不想使用默认的super()方式调用父类构造器,还可以手动使用super(参数)调用父类有参数构造器。

时候我们也需要访问自己类的构造器。语法如下

this(): 调用本类的空参数构造器
this(参数): 调用本类有参数的构造器

 this和super的用法在总结一下 访问本类成员:
    this.成员变量    //访问本类成员变量
    this.成员方法    //调用本类成员方法
    this()           //调用本类空参数构造器
    this(参数)      //调用本类有参数构造器
    
访问父类成员:
    super.成员变量    //访问父类成员变量
    super.成员方法    //调用父类成员方法
    super()           //调用父类空参数构造器
    super(参数)      //调用父类有参数构造器
    
注意:this和super访问构造方法,只能用到构造方法的第一句,否则会报错。

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

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

相关文章

1921:【02NOIP普及组】过河卒

1921:【02NOIP普及组】过河卒 【题目描述】 如图,A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。 同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有…

联合体与枚举

联合体与枚举 联合体枚举问题 联合体 联合体也是由一个或多个成员构成的数据类型,它最大的特点是只为最大的一个成员开辟空间,其他成员共用这个空间,这个东西也叫共用体!!! union Un {char c;int i; };int main() {union Un un { 0 };un.c 0x01;//先为最大的成员开辟空间un.…

开源免费的Linux服务器管理面板分享

开源免费的Linux服务器管理面板分享 一、1Panel1.1 1Panel 简介1.2 1Panel特点1.3 1Panel面板首页1.4 1Panel使用体验 二、webmin2.1 webmin简介2.2 webmin特点2.3 webmin首页2.4 webmin使用体验 三、Cockpit3.1 Cockpit简介3.2 Cockpit特点3.3 Cockpit首页3.4 Cockpit使用体验…

C++ //练习 6.10 编写一个函数,使用指针形参交换两个整数的值。在代码中调用该函数并输出交换后的结果,以此验证函数的正确性。

C Primer(第5版) 练习 6.10 练习 6.10 编写一个函数,使用指针形参交换两个整数的值。在代码中调用该函数并输出交换后的结果,以此验证函数的正确性。 环境:Linux Ubuntu(云服务器) 工具&…

酒店押金预授权怎么开通?微信酒店押金+房态+门锁关联 +电子押金单 解决方案

一、酒店押金管理有哪些? 1.渠道有银行预授权 2.微信押金支付 3.酒店押金系统 4.支付押金管理 二、银行预授权模式 酒店押金预授权通常是在客人办理入住时进行的,酒店会要求客人提供信用卡或借记卡的卡号、有效期、持卡人姓名等信息,然后…

第3讲 小程序TabBar搭建

tabBar,底部三个tab,对应三个页面,创建投票,关于锋哥,我的。 新建三个页面 pages.json 页面定义 "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/col…

蓝桥杯嵌入式第11届真题(完成) STM32G431

蓝桥杯嵌入式第11届真题(完成) STM32G431 题目 代码 程序和之前的大同小异,不过多解释 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief :…

AtCoder Beginner Contest 340 C - Divide and Divide【打表推公式】

原题链接:https://atcoder.jp/contests/abc340/tasks/abc340_c Time Limit: 2 sec / Memory Limit: 1024 MB Score: 300 points 问题陈述 黑板上写着一个整数 N。 高桥将重复下面的一系列操作,直到所有不小于2的整数都从黑板上移除: 选择…

二、DataX安装

DataX安装 一、简介二、系统要求三、部署 一、简介 官方地址:https://github.com/alibaba/DataX/blob/master/userGuid.md 二、系统要求 LinuxJDK(1.8以上,推荐1.8) Centos7.9的java1.8安装命令:yum install java-1.8.0-openjdk.x86_64 Py…

Git分支和迭代流程

Git分支 feature分支:功能分支 dev分支:开发分支 test分支:测试分支 master分支:生产环境分支 hotfix分支:bug修复分支。从master拉取,修复并测试完成merge回master和dev。 某些团队可能还会有 reale…

孙悟空吃蟠桃 - 华为OD统一考试

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C 题目描述 孙悟空爱吃蟠桃,有一天趁着蟠桃园守卫不在来偷吃。已知蟠桃园有 N 棵蟠桃树,每棵树上都桃子,守卫将在 H 小时后回来。 孙悟空…

华为数通方向HCIP-DataCom H12-821题库(单选题:441-460)

第441题 下面是一台路由输出的信息,关于这段信息描述正确的是 <R1>display bgp peerBGP local router ID : 2.2.2.2Local AS number : 100Total number of peers : 2 Peers in established state : 0Peer V AS MsgRcvd MsgSent OutQ Up/Down …

Java:什么是向上转型与向下转型(详细图解)

目录 一、什么是向上转型 1、概念 2、代码示例 3、向上转型的优缺点 二、什么是向下转型 1、向下转型的概念 ​编辑 2、代码示例 三、向下转型的缺点及 instanceof 的使用 1、向下转型的缺点 2、instanceof的使用 一、什么是向上转型 1、概念 向上转型就是创建一个…

Java并发基础:PriorityBlockingQueue全面解析!

内容概要 PriorityBlockingQueue类能高效处理优先级任务&#xff0c;确保高优先级任务优先执行&#xff0c;它内部基于优先级堆实现&#xff0c;保证了元素的有序性&#xff0c;同时&#xff0c;作为BlockingQueue接口的实现&#xff0c;它提供了线程安全的队列操作&#xff0…

C/C++内存管理:new、delete功能及原理实现

目录 一、C/C内存分布 二、C中内存管理方式 2.1new/delete操作内置类型 2.2 new和delete操作自定义类型 三、operator new与operator delete函数 四、new和delete的实现原理 4.1内置类型 4.2自定义类型 五、定位new 一、C/C内存分布 int globalVar 1; static int sta…

阅读 - 搭建博客

搭建博客的几种方式 1. 使用在线的博客系统&#xff0c;如语雀、掘金、CSDN等。 优点&#xff1a;直接创建账号使用即可&#xff0c;简单方便&#xff0c;不需要维护 缺点&#xff1a;文章分散在各个平台&#xff0c;不易于管理 2. github pages hugo、hexo等静态博客系统…

MATLAB知识点:fibonacci函数(★☆☆☆☆)返回斐波那契数列

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章&#xff1a;课后习题讲解中拓展的函数 在讲解第…

01 前言

目录 什么是CC发展史C的重要性如何学习C关于本专栏 1. 什么是c C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff0c; 20…

java实现多级目录树(递归实现)

一.应用场景 有时候需要我们后台给前台传树结构的数据&#xff0c;要怎么查询? 怎么返回数据呢&#xff1f; 二.数据库表设计以及数据内容(以部门举例) id 主键 parent_id 父级部门id depart_name 部门名词 sort 部门排序三.实体类 Data public…

线性判别分析(LDA)

一、说明 LDA 是一种监督降维和分类技术。其主要目的是查找最能分隔数据集中两个或多个类的特征的线性组合。LDA 的主要目标是找到一个较低维度的子空间&#xff0c;该子空间可以最大限度地区分不同类别&#xff0c;同时保留与歧视相关的信息。 LDA 是受监督的&#xff0c;这意…