计算机知识
CMD
环境变量
想要在任意目录下都可以打开指定的软件,就可以把软件的路径配置到环境变量中。
JDK
JDK安装目录中
javac 是JDK提供的一个工具,可以通过这个工具,把java文件编译成class文件
java 也是JDK提供的一个工具,作用就是用来运行代码的。运行当前路径下的class文件(不加后缀名)
JAVA基础语法
Java入门
如何理解编译?
Java不能直接运行代码,需要编译后运行。
编译成自解码文件(不是给人看的,给计算机看的)
常见小问题
java代码必须使用英文状态下的符号
直接在文件夹的路径中输入 cmd 可以直接用cmd打开当前路径
JRE和JDK
JDK(Java Development kit):Java开发工具包
- JVM:虚拟机,真正运行代码的地方
- 核心类库:Java事先定义好的东西
- 开发工具:javac 编译工具、java 运行工具、jdb 调试工具、jhat 内存分析工具
JRE(Java Runtime Environment):Java的运行环境
- JVM
- 核心类库
- 运行工具
Java基础概念
注释
单行注释 //
多行注释 /* */
单行注释和多行注释 一般都要避免嵌套
文档注释 /** */
java有自带的工具可以根据文档注释自动的生成说明文档
关键字
关键字:被java赋予了特定涵义的英文字母
【特点】全部小写,有特殊颜色标记
class
用于(创建/定义)一个类。类是Java最基本的组成单元。后面跟随 类名。
字面量
告诉程序员数据在程序中的书写格式
字面量类型
字面量类型 | 说明 | 举例 |
整数类型 | 不带小数点的数字 | 666,-88 |
小数类型 | 带小数点的数字 | 13.14,-25.22 |
字符串类型 | 用双引号括起来的内容 | "HelloWorld","黑马程序" |
字符类型 | 用单引号括起来,内容只能有一个 | 'A','0','我' |
布尔类型 | 布尔值,表示真假 | 只有两个值:true,false |
空类型 | 一个特殊的值,空值 | null |
- null是不能直接打印的,只能以字符串的格式打印出来
特殊类型的字面量
\t 制表符
不是单一的缩进、对齐、空格。→ 是在打印的时候,把前面的字符串的长度补齐到8,或者8的整数倍。最少补一格,最多补8格。
\r
\n
变量
【定义】在程序的执行过程中,其值又可能发生改变的量(数据)
当某个数据经常发生改变时,可以用变量存储。当数据变化时,只要修改变量里面记录的值。
变量的定义格式
数据类型 变量名 = 数据值;
变量名可以理解为 为空间(小箱子)起的名字,数据值 存在空间里面的数值
数据类型:为空间中存储的数据,加入类型限制
!!
- 变量只能存一个值,会覆盖
- 变量名不能重复(是指重复用数据类型来定义同名变量)
- 一条语句可以定义多个变量
- 变量在使用之前一定要进行赋值 (建议:在定义变量时直接赋值)
- 变量的作用域范围(后续讲解)
数据存储
计算机中的数据:文本(数字、字母、汉字)、图片、声音
在计算机中,任意数据都是以二进制的形式来存储的
不同进制的表现形式
- 二进制:由0和1组成,代码中以 0b 开头
- 十进制:由0~9组成,前面不加任何前缀
- 八进制:由0~7组成,代码中以 0 开头
- 十六进制:由0~9和a~f组成,代码中以 0x 开头
进制之间的转换
(1)其他进制转十进制
公式:系数 * 基数的权次幂 相加
系数 - 每一位上的数 基数 - 当前进制 权 - 从右往左,依次是0 1 2 3 4 5...
(2)十进制转其他进制
除基取余法:不断除以基数(几进制,基数就是几)得到余数,直到商为0,再将余数倒着拼起来
图片数据
黑白图、灰度图、彩色图
分辨率、像素、三原色
计算机中的三原色:红、绿、蓝(三基色:红、黄、蓝) RGB
取值范围:0~255 (255,255,255)
声音数据
对声音的波形图进行采样再存储
数据类型
基本数据类型
/ 引用数据类型(后续在数组和面向对象的课程中学习)
数据类型 | 关键字 | 取值范围 | 内存占用 |
整数 | byte | -128 ~ 127 | 1 |
short | -32768 ~ 32767 | 2 | |
int | -2147483648 ~ 2147483647(10位数) | 4 | |
long | -9223372036854775808~9223372036854775808(19位数) | 8 | |
浮点数 | float | -3.401298e-38 ~ 3.402823e+38 | 4 |
double | -4.9000000e-324 ~ 1.797693e+308 | 8 | |
字符 | char | 0-65535 | 2 |
布尔 | boolean | true,false | 1 |
int、double为对应类型的默认类型
如果要定义long类型的变量,在数据值后面需要加一个L作为后缀(大小写都可)
如果要定义float类型的变量,在数据值后面需要加一个F作为后缀
整数和小数取值范围大小关系:double > float > long > int > short > byte
标识符
【定义】自己给类,方法,变量等起的名字
命名规则
- 硬性要求
- 由数字、字母、下划线(_)和美元符($)组成
- 不能以数字开头
- 不能是关键字
- 区分大小写
- 软性建议
- 小驼峰命名法:方法、变量
标识符是一个单词的时候,全部小写 name
标识符由多个单词组成的时候,第一个单词首字母小写,其他单词首字母大写 firstName- 大驼峰命名法:类名
标识符是一个单词的时候,首字母大写 Student
标识符由多个单词组成的时候,第一个单词首字母大写 GoodStudent!! 见名知意
键盘录入
Java帮我们写好了一个类叫 Scanner,这个类就可以接收键盘输入的数字。
步骤一:导包 --- Scanner这个类在哪
import java.util.Scanner;
// 导包的动作必须出现在类定义的上边
步骤二:创建对象 --- 表示要开始用Scanner这个类了
Scanner sc = new Scanner(System.in);
// 上面这个格式里,只有sc是变量名,可以变。其他的都不允许变
步骤三:接收数据 --- 真正要开始干活了
int i = sc.nextInt();
// 只有i是变量名,可以变,其他的都不允许变。
IDEA
程序的输出结果 会在下方的 控制台 展示
项目结构介绍
project(项目)》module(模块)》package(包)》class(类)
IDEA中类相关操作
新建类
要在想要新建类的包上右击,否则会建到其它地方去
删除类
直接右击删除
修改类名
一起更改文件名和类名。
快捷键: shift + F6
IDEA中模块相关操作
新建模块
File -> Project Structure
删除模块、修改模块、导入模块(后续讲)
IDEA中项目相关操作
关闭项目
File -> Close Project
新建项目
打开项目、修改项目(后续讲)
新建包
com.itheima.demo1 是一个多级包
右击 openin -> explorer 可以打开本地文件夹的位置
编写代码中的技巧
快速生成main方法: psvm + 回车
输出语句: sout + 回车
运算符
学习【算术运算符、自增自减运算符、赋值运算符、关系运算符、逻辑运算符、三元运算符】六种运算符 以及 运算符优先级
算术运算符
运算符:对字面量或变量进行操作的符号
表达式:用运算符把字面量或者变量连接起来,符合java语法的式子就可以称为表达式。(不同运算符连接的表达式体现的是不同类型的表达式)
【加、减、乘、除、取模】% 取模就是取余数
!在代码中,如果有小数参与计算,结果有可能不精确。具体原因,后续讲解,涉及小数在计算机中的存储模式。
/ 结果:
- 整数参与计算,结果只能得到整数
- 小数参与计算,结果有可能是不精确的。如果需要精确计算,需要用到后面的知识
% 结果:
- 可以用 取模 来判断,A是否可以被B整除
- 可以判断A是否为偶数
- 以后,应用于 地主发牌
“+” 操作的三种情况
- 数字相加
数字进行运算时,数据类型不一样是不能运算的,需要转成一样的类型,才能运算。
隐式转换和强制转换
隐式转换:取值范围小的数值 变为 取值范围大的数值
强制转换:取值范围大的数值 变为 取值范围小的数值
隐式转换
byte < short < int < long < float < double
!!
- 取值范围小的,和取值范围大的进行运算,小的会先提升为大的,再进行运算
- byte short char 三种类型的数据在运算的时候,都会直接先提升为 int,然后再进行运算
强制转换
格式: 目标数据类型 变量名 = (目标数据类型)被强转的数据;
数据较大时,强转时数值可能会发生错误!
------------------------------------------------------
- 字符串相加
当“+”操作中出现字符串时,这个“+”是字符串连接符,而不是算术运算符了。会将前后的数据进行拼接,并产生一个新的字符串。
"123" + 123 -> "123123"
连续进行“+”操作时,从左到右逐个执行。
1 + 99 + "年" -> "100年"
变量拼接的是变量值。
------------------------------------------------------
- 字符相加
当 字符 + 字符 、 字符 + 数字 时,会把字符通过ASCII码表查询到对应的数字再进行计算。
'a' + 1 = 98 => 'a' = 97
自增自减
++:变量的值加 1
- -:变量的值减 1
!++ 和 -- 既可以放在变量的前面,也可以放在变量的后面。不管放前还是放后,单独写一行,运行的结果是一样的。
!! 参与计算时,稍有不同: a++ 先用后加 ; ++a 先加后用
赋值运算符
【=、+=、-=、*=、/=、%=】运算后赋值
!扩展的赋值运算符底层都隐藏了一个强制类型转换
short s = 1;
s += 1; => s =(short) (s + 1);
关系运算符(比较运算符)
【==、!=、>、>=、<、<=】成立为true,不成立为false
!关系运算符的结果都是Boolean类型的,要么是true,要么是false。
逻辑运算符
什么是逻辑运算符?
在数学中,我们可以表示为5 < x < 15。Java中,需要先拆解,再进行合并表达。
拆解为:x > 5 和 x < 15 , 合并后: x > 5 & x < 15
符号 | 作用 | 说明 |
& | 逻辑与(且) | 并且,两边都为真,结果才是真 |
| | 逻辑或 | 或者,两边都为假,结果才是假 |
^ | 逻辑异或 | 相同为 false,不同为 true |
! | 逻辑非 | 取反 |
短路逻辑运算符
【&& 短路与 、 || 短路或】结果和普通逻辑运算符一致,但是有短路效果(左边表达式已经能判断出最终结果了,右边的表达式就不判断了)
三元运算符
作用:可以进行判断,根据判断的结果得到不同的内容
格式:关系表达式?表达式1:表达式2
关系表达式结果为真就执行 表达式1,结果为假就执行 表达式2
三元表达式的最终一定要使用(赋值给变量)
运算符的优先级
()优先于所有运算符
原码、反码、补码
原码:十进制数据的二进制表现形式,最左边是符号位,0为正,1为负
反码:正数的补码反码是其本身,负数的反码是符号位保持不变,其余位取反
补码:正数的补码是其本身,负数的补码是在其反码的基础上+1
1000 0000:-128 既没有原码,也没有反码,只有补码的形式
计算机中的计算和存储都是以补码的形式存在的
一个字节的取值范围:-128 ~ +127 就是这个原因
利用原码进行计算,正数没有问题。但在负数计算时会出错,因为与正确的运算方向相反。反码就是为了解决原码不能计算负数的问题才出现的。负数运算时如果跨0,跟实际结果会有1的偏差,因此出现了补码。
原码也有逻辑与&、逻辑或|
<< 左移:向左移动,低位补0
判断和循环
流程控制语句
顺序结构
Java程序默认的执行流程,按照代码的先后顺序,从上往下依次执行
分支结构
if
- 大括号的开头可以另起一行书写,但建议卸载 if 那一行的末尾
- 在语句体中,如果只有一句代码,大括号可以省略不写。建议,还是不要省略..
- 如果对一个布尔类型的变量进行判断,不要用==号,直接把变量写在小括号中
if(关系表达式1){语句体1;
}else if(关系表达式2){语句体2;
}...
else{语句体n+1;
}
switch
switch(){case 值1:语句体1;break;case 值2:语句体2;break;...case 值3:语句体n+1;break;
}
- 表达式中取值为byte、short、int、char可以是枚举,JDK7以后可以是string
- case:后面跟的是要和表达式进行比较的值。只能是字面量,不能是变量。值不允许重复
- break:表示中断,用来结束switch语句
- default:表示所有情况都不匹配,就执行该处内容
default的位置和省略
default可以省略,语法不会有问题,但不建议省略。
default不一定写在最下面,可以写在任意位置,按习惯写在最下面。
case穿透
不写break就会导致case穿透,没有break会执行下一个case中的语句体。
switch新特性
JDK12之后,可以有不写break的写法。具体有需要再了解
switch和if第三种格式各自的使用场景
if的第三种格式多用于对范围的判断,switch把有限个数据一一列举,任选其一
巧妙利用case穿透,可以在switch语句中省略相同代码
-- 也可以这么写
case 1,2,3,4,5:
循环结构
什么是循环?
- 重复的做某件事情
- 具有明确的开始和停止标志
for循环
for(初始化语句;条件判断语句;条件控制语句){循环体语句
}
拓展:
- 求和的变量不能定义在循环里面,因为变量只在所属的大括号中有效
- 如果我们把变量定义在循环里面,那么当前变量只能在本次循环中有效。当本次循环结束后,变量就会从内存中消失。第二次循环开始的时候,又会重新定义一个新的变量。
- 下次累加求和的变量,应该把变量定义在循环的外面
快捷键:100.fori -> for(int i=0;i<100;i++){ }
while
初始化语句;
while(条件判断语句){循环体语句;条件控制语句;
}
for 和 while 对比
- for循环中,控制循环的变量,因为归属for循环的语法结构中;在for循环结束后,就不能再被访问到了
- while循环中,控制循环的变量,对于while循环来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用
- 知道循环次数或范围时,多用for循环;只知道循环的结束条件,多用while循环
do ... while
初始化语句;
do{循环体语句;条件控制语句;
}while(条件判断语句);
数组
数组的概述和静态初始化
数组指的是一种容器,可以用来存储同种数据类型的多个值。
数组容器在存储数据的时候,需要结合隐式转换。
数组的定义:
数据类型 [ ] 数组名 && 数据类型 数组名 [ ]
静态初始化
初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程
格式:
数据类型 [] 数组名 = new 数据类型[]{元素1,元素2,元素3...}
【简写格式:数据类型 [ ] 数组名 = {元素1,元素2,元素3...}】
数组的地址值和元素访问
地址值
直接println数组,是打印出地址值
[D@776ec8df :其中 [ 表示当前是一个数组;D表示当前数组里面的元素都是double;@是一个间隔符号;776ec8df:才是数组真正的地址值(十六进制)。平时习惯把整体称作地址值
元素访问
利用索引可以读取数组中具体某一位上的数据
当访问了数组中不存在的索引,就会引发索引越界异常
数组遍历
遍历:将数组中的所有内容取出来,取出来之后可以(打印,求和,判断...)是取出数据的过程!
arr.length 可用于打印数组中的所有数据
Tips:一个循环只做一个事情!
数组动态初始化
动态初始化:初始化时只指定数组长度,由系统为数组分配初始值
数据类型 [] 数组名 = new 数据类型[数组长度]
数组默认初始化值的规律:整数类型 - 0 ;小数类型 - 0.0 ;字符类型 - ‘/u0000’(展示形式就是空格);布尔类型 - false ;引用数据类型 - null
动态初始化和静态初始化的区别:动态初始化手动指定数组长度,由系统给出默认初始化值。静态初始化手动指定数组元素,系统会根据元素个数,计算出数组的长度。
数组内存图
Java内存分配(JVM)
- 栈 方法运行时使用的内存,比如main方法运行,进入方法栈中执行
程序的主入口(main方法)开始执行时会进栈,代码执行完毕后会出栈
- 堆 存储对象或数组,new来创建的,都存储在堆内存
new出来的东西会在这块内存中开辟空间并产生地址
- 方法区 存储可以运行的class文件,字节码文件加载时进入的内存
- 本地方法栈 JVM在使用操作系统功能的时候使用,与开发没什么关系
- 寄存器 给CPU使用,与开发没什么关系
如果new了多次,那么在堆里面有多个小空间,每个小空间中都有各自的数据。
两个数组指向同一个空间的内存图
其中一个数组对小空间中的值发生了改变,那么其他数组再次访问的时候都是修改后的结果了。
数组练习
1、求最值
注:将最值初始值设置为数组中的值!!为省略重复比较的过程,可以将循环条件改为从1开始。
2、求和并统计个数
随机数:bound:10 -- 0 ~ 9 ;随机数的范围一定是从0开始的,到这个数-1。包头不包尾
// 1.导包 -- Random这个类在哪
import java.util.Random// 2.创建对象 --表示要开始用Random这个类了
Random r = new Random(); -- r是变量名// 3.生成随机数
int number = r.nextInt(随机数范围); -- number是变量名
3、交换数据
!println 打印会换行 ;print 打印不换行
核心思想:借助一个中间变量来交换数据
4、打乱数据
获取随即索引:
Random r = new Random();
int randomIndex = r.nextInt(arr.length); --利用数组的长度
方法
什么是方法
方法(method)是程序中最小的执行单元。
提高代码的复用性、可维护性
方法的格式
把一些代码打包到一起,用到的时候就调用。这个把代码打包在一起,该过程称为方法定义。
方法定义后并不是直接运行的,需要手动调用才能执行,该过程称为方法调用。
最简单的方法定义&调用方式
- 定义
public static void 方法名(){方法体(就是打包起来的代码);
}
- 调用
方法名();
带参数的方法定义&调用方式
1.方法要干什么?
2.干这件事需要什么才能完成?
形参
全称形式参数,是指方法定义中的参数
实参
全称实际参数,是指方法调用中的参数
带返回值的方法定义&调用方式
方法的返回值就是方法运行的最终结果。
public static 返回值类型 方法名(){方法体;return 返回值;
}
- 调用
- 直接调用:方法名(实参);
- 赋值调用:数据类型 变量名 = 方法名()实参;
- 输出调用:println
如果方法执行到return,那么整个方法全部结束;break是结束循环或结束switch
方法的重载
在同一个类中,方法名相同,参数不同(个数不同、类型不同、顺序不同)的方法。与返回值无关。
Java虚拟机会通过参数的不同来区分同名的方法。
顺序不同可以构成重载,但是不建议~
好处:定义方法时不用想多个名字,调用方法时也不用那么麻烦。
方法的内存
1)方法调用的基本内存原理
2)方法传递基本数据类型的内存原理
基本数据类型
- 整数类型
- 浮点数类型
- 布尔类型
- 字符类型
引用数据类型
- 除了左边的所有数据类型
基本数据类型变量中存储的是真是的数据,数据值是存储在自己的空间中的;
赋值给其他变量,也是赋的真实的值。
传递基本数据类型时,传递的是真实的数据,形参的改变,不影响实际参数的值。
3)方法传递引用数据类型的内存原理
引用存储类型变量中存储的是地址值;数据值是存储在其他空间中的(堆),自己空间中存储的是地址值;
赋值给其他变量,也是赋的地址值。
斯坦福大学练习题
CTRL + P 查看形参顺序
CTRL + alt + M 自动抽取方法
题目没看完~
-------------------------------------------
面向对象
面向对象介绍
面向对象重点学习
- 如何获取已有对象并使用
- 如何自己设计对象并使用 → 面向对象语法
类和对象
对象可以理解为一个个能帮助我们解决问题的东西,这些东西需要按照设计图造出来。
类(设计图):是对象共同特征的描述;
对象:是真实存在的具体东西。
-- Java中,必须先设计类,才能获得对象。--
如何定义类
public class 类名{1. 成员变量(代表属性,一般为名词)2. 成员方法(代表行为,一般是动词)3. 构造器(后面学习)4. 代码块(后面学习)5. 内部类(后面学习)
}
如何得到类的对象
类名 对象名 = new 类名();
如何使用对象
- 访问属性:对象名.成员变量
- 访问行为:对象名.方法名(...)
【IDEA中,右击类 → split and move right 可以左右窗口方便查看】
定义类的补充注意事项
- 用来描述一类事物的类,专业叫做:JavaBean类。在JavaBean类中,是不写main方法的。
- 以前编写含有main方法的类,叫做测试类。我们可以在测试类中创建JavaBean类的对象并进行赋值调用。
- 类名 -- 首字母建议大写,需要见名知意,驼峰模式
- 一个java文件中可以定义多个class类,且只能一个类是public修饰的,而且public修饰的类名必须成为代码文件名。实际开发中建议一个文件定义一个class类
- 成员变量的完整定义格式是:修饰符 数据类型 变量名称 = 初始化值;一般无需指定初始化值,存在默认值。
封装
面向对象的三大特征:封装、继承、多态
封装告诉我们,如何正确设计对象的属性和方法
原则:对象代表什么,就得封装对应的数据,并提高数据对应的行为
封装的好处
- 让编程变得简单,有事找对象调方法就行
- 降低学习成本,可以少学少记,有需要时去找方法就行
private关键字
是一个权限修饰符,可以修饰成员(成员变量和成员方法),被 private 修饰的成员只能在本类中才能访问
针对 private 修饰的成员变量,如果需要被其他类使用,提供相应的操作:提供“setxxx(参数)”方法,用于给成员变量赋值,方法用public修饰;提供“getxxx()”方法,用于获取成员变量的值,方法用public修饰
this关键字
成员定义在方法中,就是局部变量;定义在方法外,就是成员变量
就近原则:当局部变量和成员变量一致时,没有任何前缀的使用变量,按照就近原则
this.变量 直接使用成员变量
构造方法
构造方法也叫做构造器、构造函数。
作用:在创建对象的时候给成员变量进行初始化的
构造方法的格式
public class Student{修饰符 类名(参数){方法体;}
}
特点
- 方法名与类名相同,大小写也要一致
- 没有返回值类型,连void都没有
- 没有具体的返回值(不能由return带回结果数据)
空参构造方法在构造对象时成员变量都是默认初始化值,带参构造方法可以在方法中给所有成员变量赋值。
创建对象时由虚拟机调用构造方法,不能手动调用
每创建一次对象,就会调用一次构造方法。
如果自己没有写任何的构造方法,那么虚拟机会加一个空参构造方法(创建对象时调用),需要更改成员变量的值时可使用构造方法来赋值。空参构造在不知道属性值时很实用
构造方法注意事项
- 构造方法的定义:如果没有定义构造方法,系统将给出一个默认的无参数构造方法;如果定义了构造方法,系统将不再提供默认的构造方法
- 构造方法的重载:带参构造方法,和无参构造方法,两者方法名相同,但是参数不同,这叫构造方法的重载
- 推荐的使用方式:无论是否使用,都手动书写无参构造方法和带全部参数的构造方法
TIPS:说构造方法是用来创建对象的。这句话其实不太对。构造方法是创建对象时,给成员变量进行初始化的!!只是创建对象中的一步
标准的JavaBean类
①类名需要见名知意
②成员变量使用private修饰
③提供至少两个构造方法
- 无参构造方法
- 带全部参数的构造方法
④成员方法
- 提供每一个成员变量对应的 setXxx()/getXxx()
- 如果还有其他行为,也需要写上
快捷键:alt + fn + insert
构造方法 【Constructor】 -> 【select none】空参
-> 【全选 + ok】带全参
【Getter and Setter】 -> 【全选 + ok】为每个成员变量生成方法
(插件PTG 可实现1秒生成标准JavaBean,需连接外网)
对象内存图
一个对象的内存
Student s = new Student();
创建一个对象,内存中会做的事:
1.加载class文件
2.声明局部变量
3.在堆内存中开辟一个空间
4.默认初始化
5.显示初始化
6.构造方法初始化(4.5.6.是对3.中的变量进行赋值)
7.将堆内存中的地址值赋值给左边的局部变量
多个对象的内存
新new一个对象,就在堆内存中新开辟一块空间,对应新的地址值。不过不需额外加载一次class字节码文件
两个引用指向同一个对象
Student stu2 = stu1;表示stu2也指向stu1指向的001(两个对象指向同一个地址,此时其中一个对象改变空间中的值,其他对象访问的就是改变后的值)
stu1 = null;表示将null赋值给了stu1的地址,意味着图中的红线断开
基本数据类型和引用数据类型的区别
基本数据类型的数据值是存储在自己的空间中的。
特点:赋值给其他变量,也是赋的真实的值
引用数据类型:数据值是存储在其他空间中,自己空间中存储的是地址值。
特点:赋值给其他变量,赋的地址值
this的内存原理
this的本质:所在方法调用者的地址值
成员变量和局部变量
面向对象综合案例
souf::System.out.printf 两部分参数:
第一部分参数:要输出的内容%s(占位)
第二部分参数:填充的数据
ctrl + P : 展示方法所对应的参数