目录
p155-170 周三 (2024.3.27,我去,也是周三诶)数组
p184-189 本章作业 周五(在过了不知几周的周二完成到这里。虽然晚了,但还是再看着,做着,那话不多说,我们继续赶路嘞
1。方法重载:Java允许在同一个类中,多个同名方法的存在,但要求形参列表不一致。
233-235可变参数 variable Parameter
1.可变参数使用:一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。
2.字符串 查看在字符串数组中,是否有该字符串 有,返回索引值 无,返回-1
5.提供圆的周长和面积的方法:类中的第一个public是构造参数,目的是初始化r,并赋值给对象的属性
6.创建cale计算类,定义2个变量表示两个操作数,定义4个方法实现求和,差,乘,商(要求除数为0的话,要提示)并创建两个对象,分别测试
9.定义music类,属性:音乐名字name,音乐时长times,并有播放play功能和返回本身属性信息的功能方法getInfo
11.在测试方法中,调用method方法,调用语句为system.out.println(method(method(10.0,20.0),100));试写出method方法的定义形式
12.创建一个employee类,属性有:名字,性别,年龄,职位,薪水。提供三个构造方法,可以初始化
263-271 idea 272-277包 278-279 访问修饰符
1.封装介绍 就是把抽象的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(方法)才能对数据进行操作。
第一章:内容介绍
-
三个阶段及相应目标
-
课程由内容加题目构成
-
开发场景 应用领域
p7:
第二章:历史
程序:计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合(文件)
p8:
sun 1995年发布 gosling是java的发明者 目前常用的java版本是8、11
java SE标准版 java EE:企业版 java ME:小型版(在android出来后,就没多少人使用了)
p9:java特点
-
java面向对象
-
java的语言是健壮的 :强类型制机 异常处理 垃圾回收
-
跨平台:一个已经编译好的class文件可在多个平台运行,不需要重新编译
-
java语言是解释型语言,编译后的class文件还需要一个解释器来解释 编译性语言:c/c++
p10: Sublime安装
p11:jvm:解释器,不安装class文件跑不起来
jvm:虚拟计算机包含在jdk中。不同版本有不同jvm,所以找不同的jdk 屏蔽底层运行逻辑
jdk:Java开发工具包=jre+开发工具
jre:Java运行环境=jvm+Java核心类库
p13:安装idk
p14:配置环境变量
在目录下可直接输入cmd,就直接进入到该目录下
p17java快速入门
-
需求:
-
开发步骤:
-
运行原理
p18
-
.java文件:源文件,通过javac命令编译 得到java。class文件
-
.class:字节码文件 通过java命令运行 jvm可识别 通过java.exe运行文件:本质是class装载在jvm
p19java开发细节
-
java严格区分大小写
-
一个源文件只能包括一个public类
-
源文件的名称只能按该类命名
-
每一个类编译后都对应一个class文件
p20快速学习知识点或技术
-
需求:工作需要
-
是否能用传统技术解决,是否能完美解决
-
引出我们要学习的新技术和知识点
-
学习新结束或知识点的基本语句和基本语法
-
快速入门(基本程序,crud)
-
开始研究技术的注意事项,使用细节,规范,如何优化
-
p21转义字符
-
\t:制表位,对齐功能
p22初学Java常犯错误
-
原文件名写错 或不在当前目录
-
主类名和文件名不一致
-
缺少分号;或是中文分号 引号也是 非法字符
-
1还是l
-
0还是o
-
英文单词拼写错误
-
业务错误,环境错误
-
少一个大括号
p23注释comment
注解说明解释程序 提高程序的可读性
单行注释 多行注释 文档注释
p24如何使用注释呢
单行://
多行:/* */
注释李的东西不会被执行 多行注释里不允许有多行嵌套注释
p25文档注释
可以被jdk提供的工具javadoc所解析 生成一套以网页文件形式体现的该程序的说明文档 一般写在类
Javadoc -d d:\java\code\temp -author -version(你所注释的全部doc标签 还可以有see,since等) Comment.java(所在程序)
p26 Java代码规范
-
类,方法的注释,要用javadoc的方式来写,就是文档注释
-
非javadoc的注释,往往是写给代码的维护者和读者写的,如何看,修改
-
选中要移动的代码 按tab键整体右移 shift+tab整体左移
-
文件保存格式最好使用UTF-8
-
行宽不要(最好)超过80个字符
-
次行风格:换一行在输出{} 行尾风格(eee{ 另起一行}
ctrl+p居然可以直接按文件名查找
p27dos命令
dos的基本原理:接受,解析,执行来自控制台的命令
md创建文件夹 rd:删除文件夹
p28相对路径 绝对路径
相对路径:从当前目录开始定位形成的一个路径
绝对路径:从顶级目录d开始定位形成的路径
需求:从a|test100访问b\test200下的hello.text
相对路径为:..\..\b\test200\hello.txt (返回到同一级即可?)
绝对路径: d:\b\test200\hello.txt
p29,30,31dos命令
-
dir:查看当前目录有什么 看其他目录(绝对路径)
-
cd: 切换到其他盘 cd /D c:
-
切换到当前盘的其他目录下 cd 角绝对路径 相对路径也可 cd \直接到根目录
-
查看指定目录下的所有目录
-
清屏:cls
-
退出:exit
-
copy:拷贝文件
-
echo输入内容到文件 echo hello > he.txt :创建并输入内容到文件
-
move:剪切文件
-
del:删除
p31,32:本章作业
-
java的编写步骤
-
java的7个编写规范
p33内容回顾
第三章
p34-39变量原理
-
变量介绍:变量是程序的基本组成单位 变量名指向内存中一个存储空间 变量是门牌号
-
变量使用的步骤:声明变量 赋值 使用
-
变量的快速入门:变量使用要先声明 同一个作用域内不能有两个相同变量名的变量,也就是说一个a不能定义两次 同一类型的数据可变化
-
变量=变量名 + 值 + 数据类型
-
+号的使用:左右两边都为数时,则作加法运算 每一次只看等号两边的两个数 若一方为字符串时,为拼接 从左往右运算
-
数据类型:每一种数据都会定义明确的数据类型
-
基本数据类型:
-
数值型:整数类型:byte1,short2,int4,long8 浮点数类型:float4,double8
-
字符型:char2
-
布尔型:Boolean1:存放true,flase
-
引用数据类型:class(类),接口interface,数组[]
-
-
数据转换
p40-41整形
-
使用:
-
细节:各类型有固定的的字节 体现可移植性
-
byte = 8bit
-
int n = 1L;错误,加L是long型,这样转换可能会有损失
-
通常用int 大数时用long型
p42-44浮点数
-
使用:浮点数表示小数 单精度float4字节 浮点数=符号位+指数位+尾数位
-
固定范围和字段长度
-
声明为float num1 = 1.1F;后要加f/F,否则默认为double float
-
浮点数有两种表现形式:十进制(必须有小数点) 科学计数法:5.12e2=5.12*10的2次方
-
double的精度比float强
-
使用陷阱:当我们对运算结果是小数的进行相等判断时要小心 8.1/3是一个近似值 非2.7 应该以两个数的差值的绝对值在某个精度范围内判断
p45java文档的使用:
-
API:应用程序编程接口
-
12+3+4+6=25*20=400 java项目 数据结构与算法 题目LeetCode 计算机网络(40h) 操作系统 () 计算机组成原理() 题目
过程还有实习 投一下呗 have a try
3、jdk-包-接口,异常,类-字段,构造器,成员方法
按照包去找这个类在去找这个方法 直接检索
p46-48字符类型char
字符类型表示单个字符,两个字节,可存放汉字
字符细节
-
字符常量用单引号括起来 双引号括起来是字符串
-
char c2 = 97;输出的是97对应的字母
-
存储过程:a->码值97->二进制
-
ascll码一个字节表示一个字符,一共128个字符,没用完
p49常用编码
Unicode:纳入世界上所有的符号 缺点是字母和汉字都是两个字节
utf-8是其发展 变长字节存储
p50布尔类型
取值为true或false 1个字节 适用于逻辑运算
p51-53自动类型转换
自动类型转换:精度小的类型转换为精度大的 可以跨 只要满足精度跨度即可
线路为:char->int->long->flaot-double-
byte->short->int-long-float-double
细节
-
有多种数据类型进行运算时,统一转化到容量最大的数据类型,也就是double类型
-
大不可以转为小的
-
byte,short与char之间不转化
-
byte b1 = 2001;错误,byte1字节,超过范围
-
byte,short,char计算时,直接转为int,不管是混合运算,还是单独类型的运算,都会变为int,所以结果不能在赋值给byte
-
Boolean不参与类型的自动转化
-
表达式结果自动提升为操作数中类型最大的
p54-55强制类型转换
自动类型转化的逆过程,将容量大的数据类型转换为容量小的 后果:精度损失 数据溢出
细节:
-
数据由大到小
-
强制类型仅仅针对最近的操作数,可用小括号提升优先级
-
char可以保存int的常量值,变量值需要转化
-
byte ,short在运算时当做int看
p56题目
short s =78;
s = s -9; 错误,s-9的结果为int型
p57-58String和基本类
-
基本数据类型转String:加双引号即可
-
基本数据类型对应的包装类的相应方法,得到基本数据类型 ?什么意思,是char转为String
-
s5.charAt(0)得到字符串的第一个字符
p59-61本章题目及总结
-
制表位\t的使用
2.一串文字时,用string 类型
3.性别用char
4.成绩有小数,用double类型
总结
-
变量是使用注意事项:不同变量的的空间不同
-
先申明后使用
-
+号的使用
-
java数据类型需要背诵
-
java类的组织形式:包-》类、异常
第四章 :
p62-67算术运算符
运算符:特殊符号,表述数据的运算,赋值和比较等
算术运算符:对数值类型的数据进行运算
-
先运算后取值 ++a
-
+字符串的相加
算术运算符的使用:
-
arithmetic:算术符 opeator
-
java中取模的本质是a%b=a-a/b*b
-
++a :先自增再赋值 a++独立语句时一样
-
表达式使用时不一样:i++先赋值后自增
-
temp使用于i = ++i;中
-
数学公式在java中若为两个整数运算,则结果会被计算机保存为整数,若有小数,会被直接舍去
p68-69关系运算符
==:相等于 != 不等于
关系运算符的结果是true或false
比较运算符:==
p70-74逻辑运算符:
1)短路与&& 短路或|| 取反!
2)逻辑与& 逻辑或| 伙计异或:^ ab不同时,结果为真
无论是逻辑还是短路,或,与结果一致
1。短路与 逻辑与 区别为:短路与第一个若为false,则第二个不需要判断,结果直接为false 而逻辑与则需要判断完,因此效率较低,所以常用为短路与。
短路,逻辑与:若一个为真,一个为假,则结果不输出
2。短路或逻辑或
两个都为false,才为false
短路或:第一个若为true,则第二个不需要判断,结果直接为true 而逻辑或则需要判断完,因此效率较低,所以常用为短路或。
3.异或
两个不一样才为真
练习题:
看清楚是等号还是赋值 ++Z=49 先加赋值再比较,所以条件满足时,z应等于49
p75-76赋值运算符 =
复合运算符:+=:a=a+=b 其他类似
assign:分配
赋值运算符的顺序:从右向左
左边只能是变量,右边可以是变量,表达式,常量值
复合运算会进项强制类型转换
b++:b=(byte)(b+1);b为byte时,b+= 2相当于:b=(byte)(b+2)
p77-79三元运算符
条件表达式?表达式1:表达式2
如果条件表达式为true,运算后的结果为表达式1,反之为表达式2 记忆口诀:一灯大师:一真大师
注意是b--还是--b
两个表达式只有一个会执行,且赋值给result
三元运算符可以转成 if-else语句
p80运算符优先级
久用自会熟悉
只有单目运算和复合赋值运算才是从右向左
p81-83标识符
凡是自己可以取名的地方都可以成为标识符
标识符命名规则:
-
26个大小写英文字母 数字 _和$(数字不能开头)
-
不能使用关键字和保留字:已被使用的,有特殊含义的
-
但可以包含关键字和保留字:abclass goto:保留字
-
java中严格区别大小写。长度无限制
-
标识符不能包含空格 :int a b:错误
命名规范:
-
包名由多单词组成时,所有字母都小写:com.hsp.crm
-
类名和接口:多单词组成时,所有单词的首字母都大写:GoodNessAssign
-
常量名所有字母都大写,多个单词组成时,每个字母间用_连接 尽量用英文,少用拼音
p84:关键字和保留字
会变色,不用背
关键字:被Java赋予了特殊含义,用作专门用途的字符:private public 不能作为标识符
保留字;现有的Java版本未使用,但后来的版本可能会将其用作关键字
p85键盘输入
扫描器(对象):Scanner 导入该类所在的包 然后创建该类对象 最后调用里面的功能
p86-96四种进制
二进制:0,1 以0b或0B开头
十进制:0-9
八进制:0-7 以数字0开头
十六进制:0-9和A-F 以0x或0X表示,满16进1 此处的AF不区分大小写
进制的转换:
其他进制转十进制:
-
二进制转十进制:从右往左:依次乘以2的次方(从0开始)并相加
-
八进制转十进制:从右往左:依次乘以8的次方(从0开始)并相加
-
十六进制转十进制:从右往左:依次乘以16的次方(从0开始)并相加
十进制转其他进制:因为一个字节有八位,所以在前方补上0直到有八位
-
转二进制:该数不断除以2,直到为0,将每一步得到的余数倒过来就是对应的二进制数
-
转八进制:该数不断除以8,直到为0,将每一步得到的余数倒过来就是对应的八进制数
-
转十六进制:该数不断除以16,直到为0,将每一步得到的余数倒过来就是对应的十六进制数
二进制转其他进制
-
转八进制:从低位开始,每三位一组,转为对应的八进制 如101是5
-
转十六进制:从低位开始,每四位一组,转为对应的十六进制
八进制,十六进制转为二进制
-
八进制:每一位数转为对应的三位数的二进制数
-
十六进制:每一位数转为对应的四位数的二进制数
p97-100位运算
位运算:>> 2:向右位移2位
按位取反:~2=?
2&3=?2按位与3
2|3:2按位或3
2^3:按位异或
原码,反码,补码:
二进制最高位时符号位:0为正,1表示负数
正数的原码,反码,补码都一样 三码合一
负数的反码:等于符号位不变,其他位取反 补码:反码+1
0的反码,补码都是0
Java没有无符号数
计算机在运算的时候,都是以补码进行运算的
看结果时,要看原码
位运算符:
&:按位与:两位全为1,结果才为1
|:按位或:两位都为0,结果才为0
^:按位异或:两个不一样时,结果才为1
~:按位取反:0变1,1变0
运算后的补码是正数,那么补码就是原码
若为负数,则补码-1等于反码,在符号位不变的前提下,按位取反得原码
算术右移:>> :低位溢出,符号位不变,并用符号位补溢出的高位 15>>2=3(两边都是整数,所以结果也是整数)
算数左移:<<:符号位不变,低位补0
无符号位右移:>>>:低位溢出,高位补0
p101-102:本章作业和总结
当a%b,a为小数时,公式为:a-(int)a/b*b 例如-10.5%3
-10.5-(10)/3*3=-10.5-(-9)=-1.5
有小数参与的运算,计算机运算得到的结果是人运算的结果的近似值
要把字符转为int:Integer.parselnt("18");
3d:表名是double类型
内容总结:
第五章:控制机构
枝干:顺序 分支 循环 break continue return
p103顺序控制
定义:从上到下逐行执行,,中间没有任何判断和跳转
注意事项:
-
采用合法的前向引用
p104-105单分支 if-else
分支:让程序有选择地执行
单分支:基本语法
if(条件表达式){执行代码块;(可以有多个语句)}
如果条件表达式为true时,执行{}中的代码如果执行代码块只有一句,可以省略{}
单分支流程图:
p106-108双分支
条件表达式成立,执行代码块1,否则执行代码块2
流程图:
例题:额外应用了新知识Scanner(System.in) 厉害!
p109-111多分支
流程图:
多分支可以没有else,如果所有的条件表达式都不成立,则一个执行入口都没有,如果有else,所有的条件表达式都不成立,则默认执行else代码块
p112-113嵌套分支
为方便可读性,嵌套不超过三层
字符的本质是一个整数,所以可以直接与另一个字符进行比较
p114-120 switch
常量值:固定值 case可翻译为当 break代表结束Switch
java中表达式必有一个返回值 当表达式的值等于常量1时,就执行语块1 如果一个都没有匹配上,执行default(不用break,自动退出Switch)
流程图:
穿透
注意事项:
表达式数据类型,与case后的常量类型一致,或可以 自动转换
Switch表达式中的返回值必须是:byte,short,int,char,enum,String(double不行)
case中的值必须是常量,不能是变量 :可以是‘a',不能是a.
default可选,可有可没有
break语句用于在执行一个语块后,跳出Switch语句,如没有,则穿透Switch语句
输出都一样时,可以这样穿透:
Switch和if的区别:
如果判断的具体数值不多,符合byte,char,int,String,enum,short用Switch
如果判断是Boolean类型,区间判断,则用if更好
p121-125 for 循环控制
基本语法:
for(循环变量初始化;循环条件;循环变量迭代){
循环操作(可以多条语句)
}
执行流程:
for(int 1 = 1;i<=10; i++){
}
注意事项和细节
循环条件是返回一个布尔值的表达式 循环变量初始化(在循环结束后的其他地方也想使用这个变量时,就可以写在其他地方。因为写在for循环这个小括号里面,那么i变量就只能在这个for循环里使用)和变量迭代可以写其他地方,但两边的分号不能省略
for(;;){} 表示无限循环 Ctrl + c 可以退出
循环初始值可以有多条初始化语句,但要求类型一样,且中间用,号隔开 变量迭代也可以,同样用,号隔开
练习题:
不明白变量初始化多条为啥报错:
**化繁为简 先死后活(常量到变量)
p126-128while
while执行流程:
循环条件返回值是布尔类型 while是先判断再执行
还钱不,不还是吧,打
p129-132 dowhile
1.框架
循环变量初始化
do{
循环体(语句);
循坏变量迭代;
}while(循环条件);
先执行,在判断(先打一顿,在问你还不还钱)
2.do-while执行流程
先执行一次,不代表会多一次,while里面是几次,结果就是几次(前提是i的值在while所给的范围里面)不在,则只输出一次,即给定的i的原始值
注意事项:布尔值 先执行
p133-135多重循环
一般为外层循环和内层循环 避免可读性差 最多三层
嵌套循环其实就是把内层循环当成外层循环的循环体
是在判断后才++的
p136空心金字塔
换行符所在的位置决定了形状 在前 打新的行时需要换行 在后时,每打一个*换一行
因为i循环一次,j要循环几次,直到小于j的限定条件
真棒的图案 哈哈哈
这个是因为空格数应是总层数-层数,但未修改空格数条件中的总层数
菱形打印成功!
p137-142 break
返回随机数,最开始是【0-1),*100后,变为【0-100),+1后,变为【1-100】
break执行流程:
break:终止某语句块的执行
while循环体里,有个if(。。。 break) 可从break直接跳出while循环
注意事项:
可通过标签指明要终止的是那一层语句块
标签的基本使用:标签自行指定(满足命名规范) 尽量不使用,会降低可读性 若没写标签,则默认退出最近的循环体
不是执行label1,而是直接退出循环label1
equal:比较字符串的内容是否相等
p143-146 continue
if中有continue,如果条件满足,在没有注明跳到哪时,调出最近的{}(跳出方法),到达外一个{}即为label2
p146 return
在方法中,跳出所在方法。在main中,则结束程序
break直接调到最近循环?而不是{}
p147-154 作业+讲解
char的巧妙运用,我还以为要自己想办法进行acsii码的转换
很funny的错误答案:
第五章:程序控制结构
顺序 分支(单:if; 双:if-else 多:if else-if else ) 循环:while do-while for
嵌套分支
Switch:分支控制 如果数值不多,且为具体数值,可以Switch,如果是对区间的判断,则用if更好
for:化繁为简(锻炼:思想到代码的转变) 先死后活(先考虑固定的值)
while:循环变量的初始化 循环条件 循环体 循环变量迭代 退出循环
代码执行内存分析法
do-while: 循环变量初始化 循环体 循环变量初始化 while退出循环
多重循环控制(重难点)
循环不超过三层
跳转控制语句:break(跳出循环) continue(结束本次循环,继续下一次循环) return(跳出所在的方法)
第六章 数组 排序 多维数组
p155-170 周三 (2024.3.27,我去,也是周三诶)数组
array:数组
很神奇,我随手写的备注也能出现在提示符中
数组的使用:
-
动态初始化::先声明数组:数据类型 数组名【】 = new 数组类型【大小】例如:int a[] = new int[5]
-
创建数组: 数组名 = new 数组名【】;
-
静态初始化: 数据类型 数组民[] = {元素值,元素值。。。}知道数组有多少元素,具体值
数组的引用:
数组名【】下标 a[3]返回数组a的第4个元素
定义了数组,但未初始化,会有默认值,不同类型的数据的数组的默认值不同
数组属于以后用类型,数组型数据是对象
163
加油,4,1号,2集
-
值传递和引用传递的区别
值拷贝:
引用地址:赋的值是地址,而不是粘贴复制数字本身
jvm的内存至少分为三大块:栈 堆 方法区
前者是老韩的 后者是我的 注意是int[] arr = {}; 或者 new 【arr.length】 还有打印数组需要用循环
打印时,加上arr【 i] + "\t"可以在打印的东西之间增加一个空格
前者为找规律反转 后者为逆序赋值方式
细节,第二种没有达到输出arr1的东西,所以应该将arr1=ayy2,然后之前的arr1的数据空间就没有变量引用,会被当做垃圾销毁
注意是给地址还是给地址
168-179数组扩容,缩减
通过do while循环实现 while(true)退出循环
缩减
p171-173 排序
内部排序:加载到内存 插排
外部排序: 合并排序
冒泡排序:
-
定义、过程:第1轮次:比较1,2两个,大的放后面,再比较2,3两个,大的放后面,依次比较完
第2轮次重复上次的过程,把第二大的数放在倒数第二个位置 用指针指向被比较的两个数
一直轮次下去,直到按照从大到小的顺序排好
-
特点:5个元素,轮次为4,每次可以确定一个数的位置 每轮比较的次数也在减小
p174查找
二分查找:
index索引的使用,返回是否找到 注意中英文符号的不一样,尤其逗号
p175-183二维数组
二维数组:例如开发棋牌游戏,表示坐标
什么是二维数组:定义:一维数组的每一个元素都是一个一维数组
二维数组的使用:
-
动态初始化
因为在int3中没有给arr[i]的数组元素分配空间,所以需要new 所以不给数字,哪怕new了也不会给分配空间吗
2.静态初始化
杨辉三角: 分析需求,一步一步实现
使用细节和注意事项:
二维数组的声明有三种形式
二维数组的每个一维数组的元素个数可不相同(列数不等二维数组 )
p184-189 本章作业 周五(在过了不知几周的周二完成到这里。虽然晚了,但还是再看着,做着,那话不多说,我们继续赶路嘞
单引号是char,双引号是字符串string
2.Boolean类型的数组不给值。默认为false
-
1,3,5,7 看语句的顺序,不要想当然
-
冒泡排序:
189本章内容梳理 190专业和编程
我亦无他,唯手熟尔。
第七章(面向对象编程基础)
190-200类与对象
1.概述
因为现有技术无法完美解决需求,故引入类与对象
一个程序就是一个世界,有很多事物(对象【属性,行为】)
类:int(java提供) cat(自定义的数据类型) 100 猫对象(具体的一只猫)
2.快速入门
示例:
3.对象内存布局 (重要)
string是引用类型,会存放在常量池中,有地址和对应的数据
![image-20240417162156349](./images/image-20240417162156349.png
4.属性概念:
属性/成员变量/field(即成员变量是用来表示属性的)
属性可以是基本数据类型,也可以是引用类型(数组)
5.属性注意细节/事项
6.创建对像访问属性
先声明,在创建
Cat cat;//声明 cat = new Cat();//创建
Cat cat = new Cat();//直接创建
如何访问属性:对象名.属性名
7.对象分配机制
person p1 = new Person();
person p2 = p1;//把p1赋给p2.就不需要重新new Person.重新开辟一个空间
p1.age = 80 ;设置的是地址中的数据值
8.对象创建过程
栈:存放基本数据类型(局部变量)
堆:放对象(cat,数组)
方法区:常量池(常量:字符串,类加载信息
java创建对象流程:
9.对象机制练习
小明 .0.0 0.0
b = null ;不是把地址销毁,而是把线销毁
201-212方法
1.方法快速入门:
成员方法/行为:说话,跑步
示例:
结果:
2.方法调用机制
3.方法的妙用:
提高代码的复用性,将实现的细节封装起来,供用户调用。而不是直接一遍一遍的写重复性代码,而且修改也不方便。封装起来后,一句调用方法即可。修改也是直接修改对象里的方法体,很方便。
4.方法的定义
如果有返回值类型,那么必须有return语句,void则不需要
5.方法使用细节
1.
2.
image-20240418163212869
3.
6.方法练习题
7.方法传参机制 parameter(参数)
每一个方法,在调用时会生成一个新的栈,在这个新的栈中改变的a,b不会影响在main中的a,b值,因为这是两个独立的栈。
基本数据类型,传递的是值(值拷贝)形参的任何改变不会影响实参
引用类型,传递的是地址,形参的改变,实参也会跟着改变。方法和主方法中数组所指向的地址是一样的
p = NUll是把自己的线搞掉
方法里重新创建一个新对象,与main中的p所指的地址不同:
重新创建的这个p没用,是垃圾
213克隆对象
214-219递归
1.递归解决什么问题
递归:方法自己调用自己,传入不同的参数
解决问题:8皇后问题 汉诺塔问题 迷宫问题
2.递归执行机制1 recursion:递归
每调用一次方法,都会生成一个新的独立的栈 先输出顶格的栈,也就是最后生成的那个栈。栈执行了又返回。返回之后,之前的栈被销毁。每一个栈都会完整执行方法的所有代码。
3.递归执行机制2
else的作用:
4.递归执行机制3 factorial:阶乘
要的是最终结果。而不是每一步的结果,其实每一步的结果都返回到上一步调用的方法中了
5.递归执行机制4
6.递归斐波那契数
220猴子吃桃
搞清楚递归线路,怎么递归的
221-224老鼠出迷宫
1打印迷宫
2代码实现
3修改路径策略
4回溯现象
某一点上下左右都走不通,于是回到来时的点
map2回到上面。
不同的策略,路径不同,如何找出最短路径 穷举法 图-》求出最短路径(深度优先,广度优先)
225汉诺塔
226八皇后
等你思考哦(´▽`ʃ♡ƪ)
227-232重载
1。方法重载:Java允许在同一个类中,多个同名方法的存在,但要求形参列表不一致。
减少了起名和记名的麻烦。
2.重载快速入门
3.重载使用细节:
方法名必须相同。形参类型不同(个数不同 | 类型不同 |参数顺序( 参数名无要求))
仍是同一个方法,不构成重载
返回类型不构成方法重载的部分,所以下面两个方法仍然是一个方法
4.重载课堂练习1
5.重载课堂练习2
6.重载练习3
233-235可变参数 variable Parameter
1.可变参数使用:一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。
2.可变参数细节
3。可变参数练习
string类型,切记
236-238作用域:
1.作用域基本使用:
2.作用域使用细节1
3.作用域使用细节2
239-243构造器 Constructor
1.构造器基本介绍
构造器:构造方法
使用要点:修饰符可以默认,无返回值,方法名和类名一定要一样,参数列表和成员方法一样的规则,构造器的调用,由系统完成。
作用:完成对新对象的初始化
2.构造器快速入门:
3.构造器使用细节1:
4.构造器使用细节2:
无参构造器
成员方法和构造器在做用上和使用上有什么区别呢?
如:p1.person();不可以这样用构造器
5.构造器课堂练习:
为什么报错呢 构造器如何重载呢
报错是因为不同的一个构造器里的方法,是不同的方法要new
244对象构造细节
1。加载person类信息(只会加载一次)->在堆中分配空间(地址)-》完成对象初始化(默认初始化 -》显式初始化 -》构造器初始化)-》对象在堆中的地址返回给p(p是对象名,也可以理解为是对象的引用)
245-250 this关键字
1.引出this
2.this入门
3.this本质
this:隐藏属性,指向对象自己
java是在虚拟机上跑的,没法找到对象的实际地址。但是使用hashcode方法,可以看到该对象的hashcode码值,虚拟地址
4.this小结
哪个调用this,this就代表哪个对象
this的用处:构造函数中类的成员变量名和方法的参数名一样时 成员变量和局部变量一样的名称时 将方法引用传递给其他方法时
5.this使用细节
6.this课堂练习
p251-261 本章作业
1.编写类,找出double数组的最大值
2.字符串 查看在字符串数组中,是否有该字符串 有,返回索引值 无,返回-1
3.修改图书价格:注释为错误?代码
4.复制数组:
5.提供圆的周长和面积的方法:类中的第一个public是构造参数,目的是初始化r,并赋值给对象的属性
6.创建cale计算类,定义2个变量表示两个操作数,定义4个方法实现求和,差,乘,商(要求除数为0的话,要提示)并创建两个对象,分别测试
7.打印小狗信息,简单就不粘贴代码了
8.代码含义:
9.定义music类,属性:音乐名字name,音乐时长times,并有播放play功能和返回本身属性信息的功能方法getInfo
在实例方法中使用实例对象的属性,可以不用this指代,当方法的参数与实例对象名一样时,需要用this指代。在构造函数中给参数赋值时,也可以直接赋值(this.name = name)
10.代码分析:
j=i++;先赋值后++。所以打印出的j= 100.
居然可以这样输出对象的属性。d1.i
而且编译后运行的是java Test
11.在测试方法中,调用method方法,调用语句为system.out.println(method(method(10.0,20.0),100));试写出method方法的定义形式
12.创建一个employee类,属性有:名字,性别,年龄,职位,薪水。提供三个构造方法,可以初始化
重点是复用
第八章面向对象编程中级
263-271 idea 272-277包 278-279 访问修饰符
280-284封装 encapsulation
1.封装介绍 就是把抽象的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(方法)才能对数据进行操作。
类似:对电视机的操作就是典型封装
好处:
-
隐藏实现的细节:方法(连接数据库) -调用(传入参数)
-
可以对数据进行验证,保证安全合理
实现步骤
-
将属性进行私有化
-
提供一个公共的set方法,用于对属性判断并赋值
-
提供一个公告的get方法,用于获取属性的值
-
图片演示
2.快速入门
3.构造器与setxxx结合
这样,别人输入的参数会经过set方法的检验,而不是随意输入
setName(name)和this.name等价,都是谁调用就是谁的对象属性
4.课堂练习
去掉参数提示:editor-java-parameter hints(大概) 记得点应用
285-296继承
1.为什么需要继承extends
继承:提高代码复用性
2.继承原理图:
extends:继承
3.快速入门
graduate和pupil继承student后,代码少了很多,因为共有属性和方法,父类中都有
4.使用细节1
方法也是。公共的方法就是父类提供的方法
所以可以在父类提供一个公共方法,来获得私有属性
然后子类调用getN4方法就可以获得私有属性n4
私有方法:创建一个公共方法,在其中调用私有方法,就可以实现对私有方法的调用。也就是说我们用公共方法做了一个中转
5.使用细节2
super();//默认调用父类的无参构造器
因为父类的构造器是有参的,所以无参的构造器并不会被覆盖,但这里我们注释掉了。故在子类的引用中,需要用super注明使用的是哪个构造器。不写则默认调用无参构造器。要指定构造器的话,使用super时需要传入与构造i器相对应的参数
6.使用细节3
super在使用时,要放在第一行;因为this也要在构造器的第一行,所以两个方法不会在一个构造器内使用
所以这里的super其实可以用this替换吗?不可以,this会调用本类的其他构造器。而super指向的是父类的构造器
7.使用细节4
Java所有类都是object的子类 CTRL + H:可以看到类的继承关系
父类构造器的调用不限于直接父类,将一直网上追溯到object(顶级父类)。也就是说
在使用c的构造器时,会先调用object的构造器,其次a,后b。比如说小明是孙子,从哪来的,得回溯到祖父
8.使用细节5
子类之恩继承一个父类(直接继承),Java是单继承机制
那a如何继承b,c的类了:可以让b继承c,然后a去继承b
不能滥用基层,子类和父类必须满足is-a的逻辑关系
人不是音乐,猫是动物
9.继承本质详解
theory:理论
CTRL + alt + L:格式化代码,规范化代码
10.课堂练习1,2,3
2.
3.
在参数构造器内初始化私有属性,方面方法使用。而通过封装,一些私有的属性可以被公共的方法调用
对自己的属性以及从父类那继承的属性赋值:
调用打印方法:
有返回值的方法才能被其他类的方法引用:
将printInfo由无返回值改为有返回值后,可被引用
297-300super
1.基本语法:
2.使用细节1
方法没有重名的话,可以直接调用,super调用,this调用
直接调用过程:
如果有同名的话,要想调用父类的,得用super。如果用本类的,则直接调用和this调用都可
属性:先找本类,再找父类,和直接访问和this访问一样 所以如果有重名,想要调用父类的,则用super.n1;
3.使用细节2:
也需要遵守访问的相关规则,是否有访问权限
4.使用细节3
301-304方法重写override 也叫方法覆盖
1.方法重写介绍
重写:子类的某一个方法与父类的的名称,返回值类型,参数均一致,那么,这个方法就是对父类方法的重写
返回类型可以不完全一样,但名称与参数要完全一致
2.重写细节
形参列表,方法名称
访问权限:public 》protected 》默认 》private
意思就是,如果满足了重写的要求,那么子类的方法不能缩小父类的方法的访问权限,但是可以扩大
3.课堂练习1
重载和重写的区别:
4.课堂练习2
重写时,需用super指明调用的方法。不可在本方法内调用本方法?会导致无限调用,导致栈溢出,尽量避免直接调用自身
305-317多态
1.养宠物引出多态
居然都可以:
虽然修改了方法,可以直接传入name,但是为了代码内部逻辑的一致性和正确性,他还是期望通过已创建的Master对象实例(通过new出来的)来进行调用和操作
2.方法的多态
提高代码的复用性
多态:多种状态 具有多种形态,是面向对象的第三大特征,多态是建立在封装和继承基础之上的
示例:
3.对象的多态 (核心)
记住:
-
一个对象的编译类型和运行类型可以不一致
-
编译类型在定义对象时,就确定了,不能改变
-
运行类型时可以变化的
-
编译类型看定义时, = 号的左边,运行类型看=号的右边
-
示例
披着羊皮的狼:编译类型是羊皮(编译器看到的) 运行类型是狼(Java看到的)
4。多态快速入门
5.向上转型
父类的引用指向子类
6.向下转型:
所谓父类的引用就是多态中的向上转型吗
第3个点的意思就是:animal对象的编译类型是Animal,但是她的运行类型是cat,现在向下转型后,将animal强转为Cat后,就可以调用cat中的特有方法,这就是指向当前目标类型的对象。所以如果运行类型是cat,但是强转为Dog就不行。
ClassCastException:类异常
7.属性重写:
属性没有重写之说,属性的值看编译类型
instanceOf:比较操作符,用于判断对象的类型是否是某某类型或某某类型的子类型
看的是对象的运行类型,所以aa的两个输出都为true
BB是AA的子类
8.多态课堂练习1:
char<short<int<float<double
boolean<string<double
对 错 错:对 错
Integer?:包装类
9.多态课堂练习2
访问属性看编译类型 方法看运行
20 20 true 20 10
b.count:是访问属性 运行类型湄洲岛找父类去
10.动态绑定机制:非常非常重要
dynamic:动态 dinding:绑定
方法会动态绑定,看运行类型 属性不会动态绑定,按作用域来找 方法和属性都有继承机制在里面
11.多态的应用:
12多态参数
318-323equals
1.==运算符
2.两者的值相等
3.看是否指向同一个地址
2.查看jdk源码
equals:是object类中的方法,只能判断引用类型
光标置于方法 Ctrl + B跳转
3.equals重写方法
object的equals方法本是比较对象的地址,通过重写后,比较值
从源码中Integer也重写了object的equals方法,变成了判断两个值是否相等
4.equals课堂练习1
obj是sout中equals传入的person2
5.equals课堂练习2
equals方法是否重写,视具体情况而定
true true true true true
false:因为==可用于基本类型和引用类型,这里是引用类型,所以判断对象的地址是否相等
true:比较的是字符串,而字符串的equals方法已重写
false:比较的Person类,而这个类并没有重写,就默认object类中的equals方法,所以为false
true:判断字符串,已重写,为true
false:string没重写,所以不是同一个对象,为假
5.equals课堂练习3
t t t f t t
t:
t:字符的本质就是数字
t
f:都是new出来的,对象是否为同一个
所谓的对象都不是同一个类型,无法进行比较,编译报错
324hashcode
经验证,相同对象的hashcode一样:
#####
325 toString方法
326finalize
在实际开发中,不会运用finalize,所以更多的是为了应付面试
调用不会阻塞在这里 而是继续往下走
327-333断点调试 debug
1.断点调试案例介绍
断点调试的快捷键:
演示:须记住
2.断点调试应用案例1:
点击相应按钮 查看输出
3.断点调试应用案例2
查看数组越界情况
眼镜:表示数组 光标置于数组名 点加号 也可查看数组的情况
4.断点调试应用案例3
追源码 :将光标放在某个变量上,可以看到最新的数据
追入方法的源码
强制调进:alt + shift + F7
另一个方法:
追到方法的源码后,怎么退出呢:shift + F8
5..断点调试应用案例4
如何直接到下一个断点:技巧:断点可以在debug过程中,动态的下断点 既可以在自己的方法中下断点,也可以在系统中的方法中下断点
开发多线程常用 断点按照业务逻辑来执行 F9
6..断点调试应用案例5
使用断点调试的方法,追踪一下对象的创建过程
7..断点调试应用案例6
查看动态绑定机制
334-341 零钱通项目
1.零钱通介绍
需求分析:
编写SmallChangeSYs.java完成基本功能。先用过程编程,后改为OOP,以便更好地理解
2.零钱通菜单
化繁为简:功能一步一步实现
流程:
-
先完成菜单的显示
3.零钱通明细
入账 消费 对象 数组(不能动态增长) 字符串拼接
3.收益入账
收入了多少 时间 余额为多少
4.消费:
定义变量
实现:
5.退出确认:
6.零钱通金额校验:
思路:先写不合格的情况,不合格,直接退出,合格才往下执行。如果先写合格的情况的话,还要写关于不合格情况的else语句
入账:
消费:
7.零钱通OOP(之前是面向过程)现在是面向对象
左边功能类 右边调用类
实现类没有main方法
仅是属性的定义,以及各个方法的实现
在调用类中调用:
342-358本章作业
1.作业1
数组如何定义 基本数据类型一样 这个类的对象也一样
. 就是运用方法。所以仔细这是数组,有多个属性,我们看题目要比较的是什么属性,以及如何比较。
2.本章作业2
本类 同包 子类 不同包
public:y y y y
protected: y y y n
默认:y y n n
private :y n n n
3.作业3
4.本章作业4
super的重写错在哪呢。哦,因为super的方法是复用,而不是重写,复用的要求跟父类完全一致,如果要重写,则像上面图片这样。super复用像下面这样
super也可以,但是需要父类print是有返回值的,返回:高亮部分
然后在打印中调用super.(....)
5.作业5
注意审题, 是年工资,所以还要一个属性:mouth
mouth可以写在构造器中,在创建每一个对象时传入值,也可以在创建对象后通过setmouth方法传值
6.本章作业6:
super是看父类,不看子类,this是从本类开始,没有才找父类。
且super看完父类后,没有会去看父类的父类,也就是超类
7.作业7
Test Demo Rose Jack:对
john Rose john:修正:John Jack
匿名对象:new Demo().test().new左边无等号
属性是没有动态绑定机制的,所以应该输出John
在哪里声明就用哪里的,this.name是找本类的name属性
8.本章作业8
方法的重写:直接修改了传入的参数
9.本章作业9
10.本章作业10
11.本章作业11
向上转型:弗雷德引用指向子类对象
父类为编译类型,子类为运行类型
向下转型:
子类为编译类型,父类为运行类型
作用:为了使用特有的方法和属性?
12.本章作业12
13.本章作业13
方法的重写:printInfo 根据打印的格式来写
以及play的重写
多态数组:
排序方法:
根据数组的值调用方法:
14本章作业14
hahah 我是B类的有参构造 我是C类的有参构造 我是C类的无参构造
继承细节:子类调用构造器时,需要先完成父类的初始化,即调用父类的无参构造器,b调用参构造器,有个默认super,调用父类的无参构造器
也就是说调用子类的构造器,默认super,调用父类的无参构造器
但是当super()有参数时,就不执行无参构造器
15-16本章作业15,16
15:多态:方法或对象,有多种形态,是OOP的第三大特征,建立在封装和继承之上
具体体现:
方法多态:重载体现多态 重写体现多态
对象多态:对象的编译类型和运行类型可以不一致,编译类型在定义时,就确定,不能变化 对象的运行类型可以是变化的,可以通过getclass()来查看运行类型 编译类型看 = 号的左边 运行类型看 = 的右边
16:动态绑定机制
当调用对象的方法时,该方法会和对象的内存地址/运行类型绑定
当调用对象的属性时,没用动态绑定机制,哪里声明,那里使用
359本章内容总结:
第八章:面向对象编程
idea 包 常用命令 三大特征
多态 断点调试
零钱通项目
第九章
361-371 房屋出租系统
1.需求分析:
能够实现对房屋信息的添加,修改和删除(用数组实现),并能够打印房屋明细表
主菜单:
新增房源:
查找房源:
删除房源:
修改房屋信息:如果不需要修改某个信息,直接回车退出即可
房屋列表:
退出:
2.设计:程序框架图:分层模式 domain:范围,表类
domain:数据层
3.工具类
以往我们是先创建一个对象,通过对象来调用方法
4.house类
5.实现:显示主菜单和完成退出软件功能
化繁为简,一个一个实现
使用方法:
5.显示房屋列表的功能:
在HouseService类中创建HouseService方法,用于指定数组大小
在创建list,用于存放房屋信息
在HouseView中调用:
6.添加房屋信息的功能:
7.删除
8.退出
9.查找房屋信息的功能:
10.修改房屋信息:
372第一阶段
业精于勤,荒于嬉
拳不离手,曲不离口