【我与Java的成长记】之封装,继承详解(一)(能看懂文字就能明白系列)

在这里插入图片描述

系列文章目录

能看懂文字就能明白系列
C语言笔记传送门
Java笔记传送门
🌟 个人主页:古德猫宁-

🌈 信念如阳光,照亮前行的每一步


文章目录

  • 系列文章目录
    • 🌈 *信念如阳光,照亮前行的每一步*
  • 前言
  • 一、封装(Encapsulation)
    • 封装的概念
    • 封装举例
    • 访问限定符
  • 二、继承(Inheritance)
    • 继承的概念
    • 继承的语法
    • 父类成员的访问
      • 1、子类中访问父类的成员变量
      • 2、子类中访问父类的成员方法


前言

面向对象的开发范式其实是对现实世界的理解和抽象的方法,那么具体如何将现实世界抽象成代码呢?这就需要运用面向对象的三大基本特征,分别是封装,继承,多态。

本节目标:

  1. 封装
  2. 继承

本节重点:都是重点


一、封装(Encapsulation)

封装的概念

所谓封装,就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的类或者对象隐藏信息
比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机,通过键盘输入,显示器USB插孔等,让用户和计算机进行交互,完成日常事物。但实际上:电脑真正工作的确却是CPU,显卡,内存等一些硬件元件。
对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内存是如何设计的等,用户只需知道,怎么开机,怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机,鼠标以及键盘插孔等,让用户可以与计算机进行交换即可。

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互

封装举例

举个简单的例子:

class Rectangle {private int length;//被private修饰的成员变量只能在类中访问,不能被其他类访问private int width;public Rectangle(int length,int width){//构造方法this.length = length;this.width = width;}public int area(){//获得矩形面积return this.length*this.width;}
}
public class test1{public static void main(String[] args) {Rectangle rectangle = new Rectangle(3,9);System.out.println(rectangle.area());}
}

在这里插入图片描述

在上面的代码中有两个类,Rectangle类中的width和length被private修饰,所以只能在Rectangle类中访问,不能被其他类访问,这时我们可以借助 area方法计算并返回值,然后在test1类中调用area方法获得值并输出,如果要在test1访问Rectangle类中的length编译器则会报错。

访问限定符

Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者成员变量能否直接在类外使用。Java提供了四种访问限定符。
在这里插入图片描述
在这里插入图片描述
注意:

  • default权限指:什么都不写时的默认权限。
  • 访问权限除了可以限定类中的成员的可见性,也可以控制类的可见性。
  • 一般情况下成员变量设置为private,成员方法设置为public。

二、继承(Inheritance)

继承的概念

继承机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有的类特性的基础上进行扩展,增加新功能,这样产生新的类,称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用。

比如:猫和狗,它们是动物
那我们用java可以这样设计:

//dog
public class Dog {String name;int age;public void bark(){System.out.println(name+"正在汪汪叫");}public void eat(){System.out.println(name+"正在吃饭");}
}
//Cat
public class Cat {String name;int age;public void maiomiao(){System.out.println(name+"正在喵喵叫");}public void eat(){System.out.println(name+"正在吃饭");}
}

观察上面的两段代码,我们发现猫和狗类中存在大量重复,如图所示:
在这里插入图片描述
这时候我们就可以将这些共性抽取出来,实现代码复用,即继承。

继承的语法

在Java中如果要表示类之间的继承关系,需要借助extends关键字,具体如下:

修饰符 class 子类 extends 父类{
//…
}

注意:

  1. 子类会将父类中的成员变量或者成员方法继承到子类中。
  2. 子类继承父类之后,必须要新添加自己特有的成员,体现出与父类的不同,否则就没必要继承了。

那我们就可以尝试对上面的猫类和狗类的代码进行优化了
比如:我们可以创建一个动物类,专门来放猫和狗的共性

public class Animal {int age;String name;public void eat(){System.out.println(name+"正在吃饭");}
}

class Dog extends Animal{public void bark(){System.out.println(name+"正在汪汪叫");}
}
class Cat extends Animal{public void maiomiao(){System.out.println(name+"正在喵喵叫");}
}
public class test1{public static void main1(String[] args) {Dog dog = new Dog();//实例化对象System.out.println(dog.age);// dog类中并没有定义任何成员变量,System.out.println(dog.name);// name和age属性肯定是从父类Animal中继承下来的dog.eat();// dog访问的eat()方法也是从Animal中继承下来的}
}

在这里插入图片描述
在这里插入图片描述
上述图示中,Dog和Cat都继承了Animal类,其中:Animal类称为父类/基类或者超类,Dog和Cat可以称为Animal的子类/派生类,继承之后,子类可以复用父类中成员,子类在实现时只需关心自己新增的成员即可。

从继承概念中可以看出继承最大的作用就是:实现代码复用,还有就是来实现多态(后面讲到)

父类成员的访问

在继承体系中,子类将父类中的方法和字段继承下来了,那在子类中能否直接访问父类继承下来的成员呢?

1、子类中访问父类的成员变量

一、子类和父类不存在同名成员变量
成员变量访问遵循“就近原则”,自己有的话优先访问自己的,如果没有则向父类中找。
例如:

class Base{int a;int b;
}
public class Derived extends Base{int c;public void method(){a = 10;//自己没a,所以访问从父类中继承下来的ab = 20;//同上c = 30;//自己有c,所以访问子类自己的c}
}

二、子类和父类成员存在同名成员变量

class Base{int a;char b;
}
public class Derived extends Base{int a;// 与父类中成员a同名,且类型相同char b = 10; // 与父类中成员b同名,但类型不同int c;void method(){a = 100;//按照”就近原则“,所以访问子类自己的b = 200;//按照”就近原则“,所以访问子类自己的c = 300;}
}

总结:

  1. 如果访问的成员变量子类中有,优先访问自己的成员变量。
  2. 如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
  3. 如果访问的成员变量与父类中成员变量同名,则优先访问自己的
  4. 成员变量访问遵循就近原则,自己有优先访问自己的,如果没有则向父类中找。

2、子类中访问父类的成员方法

一、成员方法名字不同(与上面的规则相同)

class Base{public void methodFu(){System.out.println("调用父类的成员方法");}
}
public class Derived extends Base{public void methodzi(){System.out.println("调用子类的成员方法");}public void method(){methodFu();//访问父类继承的methodFu()methodzi();//访问子类自己的methodzi()//methodwu();编译失败,在整个继承体系中没有发现方法methodwu()}
}

二、成员方法名字相同(规则略有不同)

class Base{public void methodA(){System.out.println("调用父类的成员方法A");}public void methodB(){System.out.println("调用父类的成员方法B");}
}
public class Derived extends Base{public void methodA(){System.out.println("调用子类的成员方法A");}public void methodB(){System.out.println("调用子类的成员方法B");}public void methodC(){methodA();//直接访问,则永远访问到的都是子类中的方法,父类的无法访问到。methodB();}public static void main(String[] args) {Derived derived = new Derived();derived.methodC();}}

运行结果:
在这里插入图片描述
不同之处:
在这里插入图片描述
总结:

  1. 通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到则访问,否则编译报错。
  2. 通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用方法适传递的参数选择合适的方法访问,如果没有则报错。

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

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

相关文章

vue2.0+使用md-edit编辑器

前言:小刘开发过程中,如果是博客项目一般是会用到富文本。众多富文本中,小刘选择了markdown,并记录分享了下来。 # 使用 npm npm i kangc/v-md-editor -Smain.js基本配置import VueMarkdownEditor from kangc/v-md-editor; import…

Oracle systemstate、gdb、dbx介绍

当数据库出现严重的性能问题或者hang了的时候, 可能最常用的办法就是重启数据库,简单有效解决问题;但是重启后如何追踪问题的根本原因成了难题,很多信息随着重启也消失不见了,让追查问题变的十分棘手,这时就…

配置Jenkins自动构建打包项目

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 需求说明 1、给A项目配置jenkins每2小时无条件自动构建一次,无论是否有代码提交。 2、给B项目配置jenkins每15分钟检…

向量投影的计算

如何理解施密特(Schmidt)正交化 - 知乎 向量投影中需要注意的点: bcosa称为b向量在a向量上的投影;但是要算cosa,不算也是可以的: 假设b向量在a向量的投影为ka,那么 (b-ka)a0,因为他们正交,展开得 bakaa…

分享springboot框架的一个开源的本地开发部署教程(若依开源项目开发部署过程分享持续更新二开宝藏项目MySQL数据库版)

1首先介绍下若依项目: 若依是一个基于Spring Boot和Spring Cloud技术栈开发的多租户权限管理系统。该开源项目提供了一套完整的权限管理解决方案,包括用户管理、角色管理、菜单管理、部门管理、岗位管理等功能。 若依项目采用前后端分离的架构&#xf…

mysql开启慢查询日志,记录执行慢的sql语句

执行语句,查询是否开启了慢查询 show variables like slow_query%; ON 则表示已经开启了 打开配置文件,在你安装的mysql目录下面 MySQL\MySQL Server 8.0 表示是否开启慢查询 1表示开启 slow-query-log1 存放慢查询的日志的目录 slow_query_log_file"DES…

【C语言不能不会的操作】调试-万字详解【windows操作系统下】(会写bug还会调试解决bug的程序员简直帅呆了,赶紧点赞收藏)

目录 1. 什么是bug? 2. 调试是什么?有多重要? 2.1调试是什么 2.2 调试的基本步骤 2.3 Debug和Release的介绍 3. Windows环境调试介绍 3.1 调试环境的准备 3.2 学会快捷键 ​编辑 3.3更多的快捷键 3.4 调试的时候查看程序当前信息…

SQL,HQL刷题,尚硅谷

目录 相关表数据: 题目及思路解析: 汇总分析 1、查询编号为“02”的课程的总成绩 2、查询参加考试的学生个数 分组 1、查询各科成绩最高和最低的分,以如下的形式显示:课程号,最高分,最低分 2、查询每门课程…

opensuse安装百度Linux输入法

前言 Linux下有输入法,拼音,百度的都有,但是用起来总感觉不如在windows下与安卓中顺手。 目前搜狗与百度都出了Linux的输入法,但是没有针对OpenSUSE的,只有ubuntu/deepin/UOS的安装包。 本文主要讲的如何把百度Linux输…

React 实现表单组件

表单是html的基础元素,接下来我会用React实现一个表单组件。支持包括输入状态管理,表单验证,错误信息展示,表单提交,动态表单元素等功能。 数据状态 表单元素的输入状态管理,可以基于react state 实现。 …

synchronized内部工作原理

作者简介: zoro-1,目前大二,正在学习Java,数据结构,javaee等 作者主页: zoro-1的主页 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 synchronized内部工作原理 syn…

低代码,流行的软件开发方式

低代码风头正紧,也是最近一段时间跟云原生一起被热捧,不管你是做后端开发、还是前端设计、销售、售前,如果你没接触过低代码你都不好意思说自己在软件领域工作,这篇文章以我的角度聊聊低代码是什么、以什么样的方式进行开发、及低…