【韩顺平 零基础30天学会Java】面向对象编程(中级)

news2024/11/23 14:12:49

面向对象编程(基础)部分的习题还没看呢,先mark住!!!
在这里插入图片描述
IDE(集成开发环境)- IDEA
IDE(集成开发环境)- Eclipse
idea设置字体和颜色主题:菜单 file --> setting
字符编码设置:file --> setting --> File Encodings
在idea 当我们run一个文件时,会先编译成.class 再运行
在这里插入图片描述
IDEA常用快捷键(可以自己配置)

  1. 删除当前行 默认是Ctrl+Y Ctrl+d
  2. 复制当前行
  3. 补全代码
  4. 添加注释和取消注释
  5. 导入改行所需要的类 先配置auto import,然后使用alt+enter即可
  6. 快速格式化代码 ctrl+alt+L
  7. 快速运行程序
  8. 生成构造器等 alt+insert(提高开发效率)
  9. 查看一个类的层级关系Ctrl+H【学习继承后,非常有用】
  10. 将光标放在一个方法上,输入Ctrl+B,可以选择定位到哪个类的方法【学继承后,非常有用】
  11. 自动的分配变量名,通过在后面.var
  12. 还有很多其它的快捷键…

模板/自定 义模板
file --> settings --> editor --> live templates -->查看有哪些模板快捷键/可以自己添加模板
模板可以高效的完成开发,提高速度。


包的三大作用

  1. 区分相同的类
  2. 当类很多时,可以很好的管理类
  3. 控制访问范围

包基本用法:package com.hspedu;
说明 1 package关键字,表示打包。2.com.hspedu;表示包名
包的本质就是创建不同的文件夹/目录来保存类文件

包的命名
命名规则:只能包含数字、字母、下划线、小圆点., 但不能用数字开头,不能是关键字或保留字
命名规范:一般是小写字母+小圆点 com.公司名.项目名.业务模块名
在这里插入图片描述

import java.util.Scannner //表示只会引入java.util包下的Scanner
import java.util.* //表示将java.util包下的所有类都引入(导入)
//建议:使用哪个类,就导入哪个类即可,不建议使用*导入

注意事项和使用细节
1.package的作用是声明当前类所在的包,需要放在类的最上面,一个类中最多只有一个package
2.import指令位置放在package的下面,在类定义前面,可以有多句且没有顺序要求。

访问修饰符
在这里插入图片描述
在这里插入图片描述
面向对象的三大特征:封装、继承和多态
封装就是把抽象出的数据(属性)和对数据的操作(方法)封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(方法),才能对数据进行操作。
封装的好处:1.隐藏实现细节 2.可以对数据进行验证,保证安全合理

封装的实现步骤
在这里插入图片描述
get set方法,可以通过快捷键生成
如果要使用快捷键alt+r,需要先配置主类。 第一次,是用鼠标点击形式运行程序,后面就可以用。

将构造器与setxxx结合:可以将set方法写在构造器中,这样仍然可以验证。

继承
继承可以解决代码复用,让我们的编程更加靠近人类思维。当多个类存在相同的属性(变量)和方法时,可依然我们从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends来声明继承父类即可。
继承的示意图:
在这里插入图片描述
继承的基本语法 class 子类 extends 父类{}
1.子类就会自动拥有父类定义的属性和方法
2.父类又叫超类,基类
3.子类又叫派生类

继承给编程带来的便利:1.代码的复用性提高了 2.代码的扩展性和维护性提高了
继承的深入讨论/细节问题

  1. 子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问,但是私有属性和方法不能在子类直接访问,要通过父类提供的公共的方法去访问。
  2. 子类必须调用父类的构造器,完成父类的初始化(super()默认调用父类的无参构造器)
  3. 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则编译不会通过。
  4. 如果希望指定去调用父类的某个构造器,则显式地调用一下: super(参数列表)例如super(“king”,20);
  5. super在使用时,需要放在构造器的第一行
  6. super()和this()都只能放在构造器的第一行,因此这两个方法不能共存在一个构造器
  7. java所有类都是Object类的子类,Object是所有类的基类。Ctrl+H可以看到类的继承关系
  8. 父类构造器的调用不限于直接父类!将一直往上追溯直到Object类(顶级父类)
  9. 子类最多只能继承一个父类(指直接继承),即java中是单继承机制
    10.不能滥用继承,子类和父类之间必须满足is-a的逻辑关系

继承的本质
查找属性的值时,要按照查找关系来返回信息
首先看子类是否有该属性,如果子类有这个属性,并且可以访问,则返回信息;如果子类没有这个属性,就看父类有没有这个属性(如果父类有该属性,并且可以访问,就返回信息),如果父类没有就按照上面的规则,继续找上级父类,直到Object…
【如果父类中的属性为private,父类的父类为public,查看属性值得时候会在访问到父类时报错,不会继续从上级父类中寻找】
在这里插入图片描述
子类默认会调用父类的无参构造器

super关键字
super代表父类的引用,用于父类的属性、方法和构造器
1.访问父类的属性,但不能访问父类的private属性 super.属性名;
2.访问父类的方法,但不能访问父类的private方法 super.方法名(参数列表)
3.访问父类的构造器 super(参数列表);只能放在构造器的第一句,只能出现一句!

super给变成带来的便利/细节
1.调用父类的构造器的好处 分工明确,父类属性由父类初始化,子类的属性由子类初始化
2.当子类中有和父类的成员(属性和方法)重名时,为了访问父类的成员,必须通过super。如果没有重名,使用super,this,直接访问是一样的效果。

在这里插入图片描述
3.super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用super去访问爷爷类的成员;如果多个基类(上级类)中都有同名的成员,使用super访问遵循就近原则。A->B->C,当然也要遵循访问权限的相关规则。
在这里插入图片描述
方法重写/覆盖
方法覆盖(重写)就是子类有一个方法,和父类的某个方法的名称、返回类型、参数一样,那么我们就说子类的这个方法覆盖了父类的那个方法。

方法重写也叫方法覆盖,需要满足以下条件:
1.子类的方法的形参列表,方法名称,要和父类方法的形参列表,方法名称完全一样。
2.子类方法的返回类型和父类方法返回类型一样,或者父类返回类型的子类。比如说父类返回类型是object,子类方法返回类型是String
3.子类方法不能缩小父类方法的访问权限

在这里插入图片描述
多态
问题:代码的复用性不高,不利于代码维护。
解决方案:引出我们要讲解的多态。
多态基本介绍:方法或对象具有多种形态,是面向对象的第三大特征,多态是建立在封装和继承的基础之上的。

多态的具体体现
1.方法的多态 重写和重载就体现多态
方法重载体现多态 传入不同的参数,调用不同的sum方法,就体现多态。
方法重写体现多态
2.对象的多态(核心,困难,重点)
(重要的几句话,背下来)
(1)一个对象的编译类型和运行类型可以不一致
在这里插入图片描述

(2)编译类型在定义对象时,就确定了,不能改变
(3)运行类型是可以变化的
(4)编译类型看定义时 = 号的左边,运行类型看 = 号的右边

多态案例【解决主人喂食问题】

多态注意事项和细节讨论
多态的前提是:两个对象(类)存在继承关系
多态的向上转型👇
1)本质:父类的引用指向了子类的对象
2)语法:父类类型 引用名 = new 子类类型();
3)特点:编译类型看左边,运行类型看右边。
可以调用父类中的所有成员(需遵循访问权限)
不能调用子类中的特有成员(在编译阶段,能调用哪些成员,是由编译类型来决定的)
最后运行效果看子类(运行类型)的具体实现!(即在调用方法时,按照从子类(运行类型)开始查找方法,然后调用,规则和前面讲的方法调用规则一致。
例如Animal animal = new Cat();

多态的向下转型
1)语法:子类类型 引用名 = (子类类型)父类引用;
2)只能强制父类的引用,不能强制父类的对象
3)要求父类的引用必须指向的是当前目标类型的对象 (之前是猫就可以转成猫,之前是狗不能转成猫)
4)当向下转型后,可以调用子类类型中所有的成员
例如Cat cat = (Cat) animal;

多态注意事项和细节讨论
属性没有重写之说!,属性的值要看编译类型!
instanceOf比较操作符,用于判断对象的运行类型是否为XX类型或XX类型的子类型

Boolean不能转成int
b==s,两个对象比较,判断的是地址

java的动态绑定机制(非常非常重要)

  1. 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
  2. 当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用

多态的应用
1)多态数组
数组的定义类型为父类类型,里面保存的实际元素为子类类型

Person[] person = new Person[5];
person[0] = new Person("jack",20);
person[1] = new Student("mary",18,100);
person.......
//person[i]的编译类型是Person,运行类型是根据实际情况由JVM来判断
//for循环可以调用对象下的方法

如果调用子类特有的方法,比如Teacher有一个teach,Student有一个say如何调用???
在这里插入图片描述
2)多态参数
方法定义的形参类型为父类类型,实参类型允许为子类类型
应用实例1:前面的主人喂动物
应用实例2:
在这里插入图片描述
Object类
类Object是类层次结构的根类。每个类都使用Object作为超类。所有对象(包括数组)都实现这个类的方法。
在这里插入图片描述
equals方法
==和equals的对比
==是一个比较运算符
1.==:既可以判断基本类型,又可以判断引用类型
2.==:如果判断基本类型,判断的是值是否相等。
3.==:如果判断引用类型,判断的是地址是否相等,及判断是不是同一个对象
4.equals:是Object类中的方法,只能判断引用类型,如何看jdk源码(把光标放在equals方法,直接输入ctrl+b/右键goto),如果使用不了自己配置!
5.equals默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等,比如Integer,String
在这里插入图片描述
如何重写equals方法
在这里插入图片描述
hashCode方法
返回该对象的哈希码值,支持此方法是为了提高哈希表的性能,实际上,由Object类定义的hashCode方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是java编程语言不需要这种实现技巧)
1.提高具有哈希结构的容器的效率
2.两个引用,如果指向的是同一个对象,则哈希值肯定是一样的!
3.两个引用,如果指向的是不同对象,则哈希值是不一样的
4.哈希值主要根据地址号来的!不能完全地将哈希值等价于地址
5.obj.hashCode()
6.后面在集合中hashCode如果需要的话,也会重写,在讲解集合时,会说如何重写hashCode()

toString方法
基本介绍
默认返回:全类名(包名+类名)+@+哈希值的十六进制
子类往往重写toString方法,用于返回对象的属性信息
重写toString方法【使用快捷键alt+insert -> toString,重写后,一般是把对象的属性值输出,当然程序员也可以自己定制】,打印对象或拼接对象时,都会自动调用该对象的toString形式
当直接输出一个对象时,toString方法会被默认的调用,比如System.out.println(monster);就会默认调用monster.toString()

finalize方法
finalize()当垃圾回收器确认不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
1.当对象被回收时,系统自动调用该对象的finalize方法。子类可以重写该方法,做一些释放资源的操作。

比如说当car对象是一个垃圾,垃圾回收器就会回收(销毁)对象,在销毁对象前,会调用该对象的finalize方法,程序员就可以在finalize中,写自己的业务逻辑代码(比如释放资源;数据库连接,或者打开文件…),如果程序员不重写finalize,那么就会调用Object类的finalize,即默认处理,如果程序员重写了finalize,就可以实现自己的逻辑)

2.什么时候被回收:当某个对象没有任何引用时,则jvm就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,销毁该对象前,会先调用finalize方法。
不是立即回收哦~

3.垃圾回收机制的调用,是由系统来决定,也可以通过System.gc()主动触发垃圾回收机制。

实际开发中,几乎不会运用finalize,所以更多就是为了应付面试。

断点调试(debug)
在断点调试过程中,是运行状态,是以对象的运行类型来执行的。
1.断点调试是指在程序的某一行设置一个断点,调试时,程序运行到这一行就会停住,然后你可以一步一步往下调试,调试过程中可以看各个变量当前的值,出错的话,调试到出错的代码行即显示错误,停下,进而分析找到这个bug
2.断点调试是程序员必须掌握的技能
3.断点调试也能帮助我们查看java底层源代码的执行过程,提高程序员的java水平
在这里插入图片描述
断开可以在debug过程中,动态的下断点

项目:零钱通
化繁为简的编程思想
建议一段代码完成一个小功能,尽量不要混在一起
找出不正确的条件,然后给出提示,直接break

面向过程 修改成面向对象,编写类(略)

练习题还没看啊啊啊啊啊啊

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

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

相关文章

linux相关指令

一、ls 指令 语法:ls [选项] [目录或文件] 功能:对于目录,该命令列出目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。 常用选项: -a 列出目录下的所有文件,包括以 . 开头的隐含文件。 -d…

【单调栈】下一个更大元素 III

文章目录 Tag题目来源题目解读解题思路方法一:下一个排列 写在最后 Tag 【单调栈】【数组】【字符串】 题目来源 556. 下一个更大元素 III 题目解读 找出大于整数的最小整数,这个最小整数必须由原来整数中出现的数字组成。 解题思路 方法一&#xff…

冲刺第十五届蓝桥杯P0003倍数问题

文章目录 原题连接解析代码 原题连接 倍数问题 解析 需要找出三个数字,三个数字之和是k的倍数,并且这个数字需要最大,很容易想到的就是将数组进行倒叙排序,然后三层for循环解决问题,但是这样会导致**时间复杂度很高…

Appium问题及解决:打开Appium可视化界面,点击搜索按钮,提示inspectormoved

打开Appium可视化界面,点击搜索按钮,提示inspectorMoved,那么如何解决这个问题呢? 搜索了之后发现,由于高版本Appium(从1.22.0开始)的服务和元素查看器分离,所以还需要下载Appium In…

深入了解“注意力”和“变形金刚”-第2部分

一、说明 在上一个故事中,我已经解释了什么是注意力机制,以及与转换器相关的一些重要关键字和块,例如自我注意、查询、键和值以及多头注意力。 在这一部分中,我将解释这些注意力块如何帮助创建转换器网络,并详细

sed 命令

sed是Stream Editor(字符流编辑器)的缩写,简称流编辑器。 sed 命令是一个面向行处理的工具,它以“行”为处理单位,针对每一行进行处理,处理后的结果会输出到标准输出stdout。sed 命令是很懂礼貌的一个命令&…

CentOS 7 使用Docker

参考资料 Docker命令大全 黑马程序员docker实操教程 (黑马讲的真的不错 容器与虚拟机 安装 yum install -y docker Docker服务命令 启动服务 systemctl start docker停止服务 systemctl stop docker重启服务 systemctl restart docker查看docker服务状态 syste…

拨2个号时报错All TAP-Windows adapters on this system are currently in use.

管理员运行addtap.bat 可以看到,有两个TAP-Windows Adapter V9适配器了

拼多多API接口的使用方针如下:

了解拼多多API接口 拼多多API接口是拼多多网提供的一种应用程序接口,允许开发者通过程序访问拼多多网站的数据和功能。通过拼多多API接口,开发者可以开发各种应用程序,如店铺管理工具、数据分析工具、购物比价工具等。在本章中,我…

管易云与网易互客对接集成发货单查询2.0连通编辑订单(管易包裹物流=>互客销售订单物流(修改)V1)

管易云与网易互客对接集成发货单查询2.0连通编辑订单(管易包裹物流>互客销售订单物流(修改)V1) 来源系统:管易云 管易云是金蝶旗下专注提供电商企业管理软件服务的子品牌,先后开发了C-ERP、EC-OMS、EC-WMS、E店管家、BBC、B2B、B2C商城网站…

在PyCharm中添加anaconda环境

本文略过创建anaconda环境的部分~ 下文默认anaconda环境已经创建好 1. 点击新建项目 2. 1)修改项目名称 2)选择 “Previously configured interpreter” 曾经配置的解释器 3)选择“Add Interpreter” 添加新的解释器 3. 选择 “A…

外包干了2个月,技术退步明显....

先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年…

javaee之Elasticsearch相关知识

简单说一下Elasticsearch相关知识 其余的参考官网文档 我们还可以用下面的方式来查 看一下原始索引库的模板 下面看一下数据库映射关系 下面就是更改了id1的所有数据 下面是我索引库中的内容 说一下查询之后,一些属性的含义 上面案例是这样理解的 match查询类型会对…

【微信小程序】初始微信小程序

🖥️🖥️🖥️ 博主主页: 👉🏻 👉🏻 👉🏻 糖 -O- 🚩🚩🚩微信小程序专栏:微信小程序 &…

设计模式再探——模板方法模式

目录 一、背景介绍二、思路&方案三、过程1.模板方法模式简介2.模板方法模式的类图3.模板方法模式代码4.模板方法模式中的父类为抽象类,为什么不是接口?5.模板方法模式中方法级别的单一职责 四、总结五、升华 一、背景介绍 最近公司在做颗粒业务的时…

关于Chrome浏览器打开某网页报 连接已重置 的解决方法

问题描述: Chrome浏览器(117版本)昨天打开内网站点正常,今天打开时报连接已重置,网页打不开。其他浏览器打开正常。 解决方案1:刷新DNS --- 失败 1、 打开命令行窗口 2、…

超简单的视频截取方法,迅速提取所需片段!

“视频可以截取吗?用相机拍摄了一段视频,但是中途相机发生了故障,录进去了很多不需要的片段,现在想截取一部分视频出来,但是不知道方法,想问问广大的网友,知不知道视频截取的方法。” 无论是工…

葡萄酒按名称分类保护的重要事件有哪些?

葡萄酒可以根据各种方法来进行分类,可以是原产地或称谓,可以是酿造方法和风格,可以是甜味和年份,也可以是使用的葡萄品种。来自云仓酒庄品牌雷盛红酒分享不同原籍国和地区对葡萄酒的分类做法各不相同,许多做法会随着时…

Linux 安装

本章节我们将为大家介绍 Linux 的安装,安装步骤比较繁琐,现在其实云服务器挺普遍的,价格也便宜,如果自己不想搭建,也可以直接买一台学习用用. 本章节以 centos6.4 为例。 centos 下载地址: 可以去官网下载…

python3.0 安装后再 cmd下弹win10应用商店的问题

1、问题描述 安装了最新的python安装包后,再cmd上输入:python --version 无效, 然后输入 python 后弹出商店。 2、问题解决 看了很多解决办法都是编辑用户环境变量,将这个python的环境变量放在windowsApps上面,尝试了…