计算机基础
JAVA引入
1.JAVA语言平台版本
- J2SE标准版
- J2ME小型版
- J2EE企业版
2.JAVA语言特点
- 简单易学
- 面向对象
- 支持多线程(内置多线程机制)
- 支持网络编程且方便
- 可靠,安全
- 编译与解释并存
- 跨平台(跨操作系统)
3.JVM+JRE+JDK
- JVM
1.运行字节码的虚拟机
2.针对不同的系统有不同实现,目的是使用相同字节码在不同平台得到相同结果
3.只需要满足JVM规范可自定义JVM(HotSpot VM是JVM的实现)
- JRE
1.Java运行环境,运行已编译的程序,不可创建新程序
2.JRE=JVM+JAVA程序所需的核心类库
- JDK
1.Java Development Kit
2.功能齐全的Java SDK
3.JDK=JRE+大量开发工具包
4.提供给JAVA开发员使用,创建和编译程序
4.字节码
- JVM可理解的代码,后缀为class的文件
- 字节码只面向JVM,不面向特定的处理机,即在一定程度上解决解释型语言效率低的问题,又保留解释型语言可移植的特点
- 由于字节码不面向特定虚拟机,所以无需重新编译可在不同OS计算机上运行
5.解释型语言+编译型语言
- 解释型
1.通过解释器逐行的解释源代码为机器码后执行
2.执行速度慢,开发效率高
- 编译型
1.通过编译器一次性将源代码翻译成机器码
2.执行效率高,开发效率低
- JAVA解释与编译并存
通过编译器生成字节码
通过解释器解释执行字节码
6.Java与C++
- 二者都面向对象
- C++支持运算符重写
- C++支持多继承
- C++支持直接手动访问内存
- Java支持自动内存管理垃圾回收机制
第一个程序—HelloWorld
1.基本框架
class HelloWorld{
public static void main(String [] args){
System.out.println("Hello World");
}
}
2.详解
- Java程序的最基本单位是类,所以我们要定义一个类
格式:class 类名
- 在类中写内容的时候,用大括号括起来 {}
- Java程序要想执行,必须有main方法
public static void main(String[] args)
- 要指向那些东西,也用大括号括起来
- 要做什么?仅做一个简单的输出
System.out.println("HelloWorld");
注意:""里面的内容是可以改动的
3.程序解析
- 编写java源程序(.java)
- 编译:javac 源文件名.java
- 运行:java 源文件名
4.常见问题
- ①扩展名隐藏
解决办法:
此电脑-工具-文件夹选项-查看-去除隐藏文件名的勾
- ②要求文件名与类名一致
- ③java语言严格区分大小写
- ④标点符号必须全是英文状态
- ⑤括号配对问题:成对
环境变量的配置
1.Path
- 作用
保证javac命令可以在任意目录下运行
原来外部指令javac只能在JDK安装目录bin下运行
- 配置方案
找到环境变量的位置——在系统变量中——新建
变量名:JAVA_HOME
变量值:D:\develop\Java\jdk1.7.0_60
找到环境变量的位置——在系统变量中——修改
变量名:Path
变量值:%JAVA_HOME%\bin;
%XXX%:引用
注意;与原来的内容隔开
2.classpath
- 作用
保证class文件可以在任意目录下运行
原来只能使用绝对路径下运行class文件
- 配置方式
找到环境变量的位置——在系统变量中——新建
变量名:classpath
变量值:E:\java程序
Java基础语法
1.关键字
- 概述:被JAVA语言赋予特定含义的单词
- 特点:字母全部小写
- 注意:goto和const是保留字
高级记事本对关键字有不同颜色的标记
2.标识符
- 概述:起名字时使用的字符序列
- 组成规则:英文大小写字母,数字字符,$,_
注意
1.不以数字开头
2.不能是java关键字
new是一个关键字,关键字都是小写
true,false,null不是关键字,只是字面量,但也不能成为标识符
3.严格区分大小写
- 常见命名规则——见名知意
1.包:就是其文件夹,用于将类型区分开来
com.公司.包
2.类或接口:
一个单词:单词首字母大写 One
多个单词:每个单词首字母大写 OneTwo
3.方法或变量
一个单词:小写 one
多个单词:第二个单词开始首字母大写 oneTwo
3.常量:都大写,不同单词用_隔开 ONE_TWO
3.注释
- 概述:解释说明程序的文字(养成习惯)
- 注释分类
1.单行注释:行最前加//
2.多行注释:/* */(不可嵌套使用)
3.文档注释:/** */(被javados工具解析生成一个2说明书,面向对象部分讲解)
- 程序中的注释(以HelloWorld为例)
1./*需求 分析 实现*/
2.//这是我的HelloWorld案例
- 作用
1.解释说明程序,提高程序的阅读性
2.帮助调试程序,报错时分部注释再编译运行
- 形成注释思想
先写注释,体现思路
再写代码,实现思路
- 编译器生成字节码前会将注释抹去,所以字节码中不含注释
4.常量与变量
- 常量
1>:字面值常量
- 字符串常量(用“”括起来的内容)
- 整数常量
四种表现形式:二,八,十,十六进制
- 小数常量
- 字符常量(用‘’括起来的内容)
- 布尔常量(true false)
- 空常量(null)
2>:自定义常量
定义:在一定范围内发生改变的量
定义格式:数据类型 变量名 = 初始值;
5.数据类型
- Java语言是强类型语言(对每一种数据都定义具体的数据类型)
- 每种类型定义了不同大小的内存空间,所占空间大小不随硬件变化而变化,注意不要超过数据范围
- 后缀
long型在值后加上L后缀
float型在值后加上F后缀
- 类型转换
默认转换:byte,short,char->int->long->float->double
byte,short,char参与运算时先转int
--->有小类型先转成大类型,再参与运算
boolean不参与转换
强制转换:目标类型 变量名 = (目标类型)被转换的数据
大->小
不要随意使用强制转换,隐含精度损失问题
-
思考题
-
常见ASCLL码表
'a':97
'A':65
'0':48
6.运算符——不过多讲解
- 算术运算符(+ - * / % ++ – + - )
整数相除只可以得到整数,只要将任意一个操作的数据变成浮点数,即分子或分母乘1.0即可得到小数
单目运算符
1.++在前先++再执行——++在后先执行再++
2.++、-- 的运算对象可以为char型变量、int型变量和float型变量
3.常量不可以使用 10++
+的含义
1.加法
2.正号
3.字符串拼接符
- 赋值运算符(= += -= *= /= %=)
- 比较运算符(== != > >= < <=)
1.比较的结果都是boolean类型
2.区分==和=,不能混写
3.字符串值的比较不能使用== 而要用equals()
==对象的比较不管数值相不相同,对象相同即可
String a1 = "a1";
String a2 = "a2";
a1==a2; ===ture
String a1 = new String("a1");
String a2 = new String("a2");
a1==a2 ===false
- 逻辑运算符
特点:一般用于连接Boolean类型的表达式或值
1.&(与)——全对即true
2.|(或)——一对即true
3.^(异或)——不同即true(男女),相同即false(男男,女女)
4.!(非)
!true=false,!false=true
1>!后面要接一个boolean类型的表达式
2>int类型不能取非,取非的结果必须是Boolean类型
偶数个不改变本身
5.&&(双与)
双与具有短路效果,左边是false,右边不执行
左右的表达式结果为boolean类型
6.||(双或)
双或具有短路效果,左边是true,右边不执行
左右的表达式结果为boolean类型
开发中常用&& || !
——优先级:! && ||
- 位运算符
直接对二进制的运算,参与运算的都是补码
1.&(与)——有0则0
2.|(或)——有1则1
3.^(异或)——相同则0,不同则1
特点:一个数据针对另一个数据位异或两次,该数不变
a^b^b=a a^b^a=b
4.~(取反)——0取1,1取0
5.<<(左移)——左边最高位丢弃,右边补齐0
快速计算结果:数据*2^移动次幂
1000<<2
100000
6.>>(右移)——最高位是0,则左边补0
最高位是1,则左边补1
快速计算结果:正数:数据/2^移动次幂
1000>>2
10
7.无符号右移(>>>)——无论最高位是0还是1,左边补齐0
- 三目运算符
比较表达式?表达式1:表达式2
计算表达式的值(Boolean类型的值)
若是true,表达式1就是结果
若是false,表达式2就是结果
比较表达式最好加上()
- 优先级(从高到低)
括号 ()、[]
正负号 +、-
自增,自减,非 ++、--、!
乘除,取余 *、/、%
加减 +、-
移位运算 <<、>>、>>>
大小关系 >、>=、<、<=
相等关系 ==、!=
按位与 &
按位异或 ^
按位或 |
逻辑与 &&
逻辑或 ||
条件运算 ?:
赋值运算 =、+=、-=、*=、/=、%=
位赋值运算 &=、|=、<<=、>>=、>>>=
7. 键盘录入的基本格式
- 1.导包
格式:import java.util.Scanner;
位置:在class上面
- 2.创建键盘录入对象
格式:Scanner sc = new Scanner(System.in);
通过对象获取数据
- 3.接收数据
整数:int x = sc.nextInt();
浮点型:double x = sc.nextDouble();
字符串:String s = sc.nextLine();
- 注意
1.输入语句中若先输入字符{串}型再进行整数的输入,整形输入完后末尾的空格保存到字符串类型中
2.解决该类问题的办法
方法一:先写字符串类型再写整数型
方法二:整数型输入语句下加上 sc.nextLine() 再进行字符串类型的输入
8.语句
- 顺序结构
程序中最简单最基本的流程控制
按代码的先后顺序,依次执行
- 选择结构
if语句
1.关系表达式的结果是Boolean类型
2.三目都可以用if改,但if不一定都可以改成三目
当if语句控制的操作是一个输出语句的时候,不可以使用三目,因为三目是一个运算符,运算符操作完后应该有一个结果,而不是一个输出
在做一个程序时一定要考虑正确数据,错误数据,边界数据
switch语句
面试题:switch语句的表达式可以是byte吗?可以是long吗?可以是String吗?
答:可以,不可以,JDK7以后可以
注意事项
1.switch(不能是浮点型)
2.case后面只能是常量,不能是变量,而且多个case后面的值不能出现相同的
3.default可以省略吗?
答:可以省略,但是不建议,因为它的作用是对不正确的情况给出提示
4.break可以省略吗?
答:可以省略,但是结果可能不是我们想要的
会出现一个现象:case穿透
5.default一定要在最后吗?
答:不是,可以在任意位置。但是建议在最后,不论default在case前还是后都先执行case
6.switch语句的结束条件?
遇到break就结束了
执行到末尾就结束了
**注意default不是结束标志
switch与if的使用场景
if
结果是boolean类型
对一个范围的判断
对几个常量的判断
switch
对几个常量的判断
- 循环结构
所有的循环语句中条件语句返回的都是Boolean类型
for循环:
*执行流程*
1.执行初始化语句
2.执行判断条件语句——true则继续执行,false则结束循环
3.执行循环体语句
4.执行控制条件语句
5.返回到第二步
*注意事项*
1.不论判断条件语句是简单还是复杂,结果都是boolean类型
2.循环条语句若只有一条,可以省略大括号,但不建议
3.有分号就没有左大括号,有左大括号就没有分号(不要随意的在for()后加;)
4.for(int x=1; ; ) 此时X只在次循环中作用
增强for循环(底层自己做一个判断,解决数组长度溢出问题)
for(元素数据类型 变量:数组名){}
注意
1.只能用于输出 不能输入,一次性将所有的元素都遍历完成
2. :后数组或集合不能为空null
二维数组的遍历
for(int[] aa:arr){
for(int a:aa){
System.out.print(a+"\t");
}
System.out.println("");
}
while循环
先执行()中的,不论结果有没有进入循环体()中的内容都被执行
for与while可以等价转换
for适合一个范围的判断
while适合循环次数不明确的数
do—while循环
先执行一次循环体
综上可知三种循环是可以统一的
与前两种循环的区别
1.do……while循环至少执行一次循环体
2.for,while先判断条件再决定是否执行循环体
注意
1.注意修改控制条件,否则容易出现死循环
while(true){……}
for(;;){……}
2.优先考虑for,再while,最后do……while
- 控制跳转语句
break 中断
1.用在循环和switch语句中,离开此场景无意义
2.作用
跳出单层循环
跳出多层循环,需要标签语句的配合
标签名:for(){break 标签名;}
continue 继续
1.用在循环中,离开此场景无意义
2.作用
跳出单层循环一次(但可以进行第二次循环)即结束此次循环,开始下一次循环
return 返回
1.用于结束方法
2.一旦遇到return,程序就不会再继续往后执行
- 输出语句
换行:System.out.println();
可以通过输出空语句实现换行System.out.println();
不换行: System.out.print();
输出语句中字符相加+表示数值(字符转换成表中对应数字)加法 字符+“=”中加号表示字符串拼接符
> char c = '\u0061';//a
> char d = '银';
> 输出语句中
> (c+d)//38231
> (c+""+d)//a银
> char a='2';
> char b='3';
> 输出语句中
> (a+b+"")//101
> (a+""+b)//23
> (""+a+b)//23
> (""+(a+b))//101
9.方法
- 方法就是完成特定功能的代码块
- 返回值是该代码块的执行结果
- 格式
- 注意事项
方法不调用不执行时无意义
方法与方法是平级关系,不可嵌套
方法定义时参数与参数用逗号隔开
方法调用时不用再传递数据类型
方法有返回值,一定要有return
- 方法重载
针对方法的功能相同,但参数列表不同(参数个数或参数类型不同)的情况,JAVA允许他们用一样的名字
特点
1.与返回类型无关,只看方法名和参数列表
2.在调用时,虚拟机通过参数列表的不同来区分同名方法
10.数组
- 概念
1.存储同一种数据类型多个元素的集合
2.数组既可以存储基本数据类型,也可以存储引用数据类型
- 数组操作的常见问题
1.数组索引越界异常:访问了不存在的索引
2.空指针异常:数字已不在指向堆内存,但却还在用数组名去访问元素
- 数组初始化
概述
1.Java中数组必须初始化后才可以使用
2.初始化就是为数组中的元素分配内存空间,并为每个数组元素赋值
初始化方式
1.动态初始化:初始化时只指定数组长度,由系统为数组分配初始值
2.静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度
3.两种初始化不可同时存在
- 一维数组
1.格式
数据类型 [] 数组名
int[] a;定义一个int类型的数组a变量(推荐)
数据类型 数组名 []
int a[];定义一个int类型的a数组变量
2.初始化
动态初始化
格式:数据类型[ ] 数组名 = new 数据类型 [数组长度]
静态初始化
格式:数据类型[ ] 数组名 = new 数据类型 []{元素1,元素2,...}
3.数组长度:数组名.length
- Java内存图解
- 一维数组内存图解
- 数组遍历
- 数组获取最值
- 数组逆序
- 数组赋值
1.直接赋值
int []arr = {1,2,3};
int []arr2 = arr;
即两个引用名指向同一个对象(地址值相同),当arr(arr1)数组中某个值改变时,arr1(arr)中**对应的值也改变**
2.创建一个同长的数组再循环赋值
当arr(arr1)数组中某个值改变时,arr1(arr)中**对应的值不改变**
3.使用Object中的clone()函数
int []arr1 = arr.clone()
当arr(arr1)数组中某个值改变时,arr1(arr)中**对应的值不改变**
4.使用System中的arraycopy(原数组,原数组起始位置,目标数组名,目标数组起始位置,复制元素个数) 函数
System.arraycopy(.......)
- 二维数组
1.二维数组就是元素为一维数组的数组
2.初始化
动态初始化
数据类型[][]变量名 = new 数据类型[m][n](推荐)
m:表示二维数组有多少一维数组 有几行
n:表示每一个一维数组有多少元素 有几列
数据类型[][]变量名 = new 数据类型[m][]
数据类型 变量名[][] = new 数据类型[m][n]
数据类型[]变量名[] = new 数据类型[m][n]
静态初始化
数据类型[][]变量名 = new 数据类型[][]{{元素1,...},{元素1,...},...}
简单化:数据类型[][]变量名 = {{元素1,...},{元素1,...},...}
3.长度
行长:数组名.length
列长:数组名[行下标].length
- Java内存图解
- 二维数组内存图解
- 数组遍历
11.随机数
import java.util.Randon;
Randon rd = new Random();
rd.nextInt()——返回的是int范围内的随机数
rd.next(100)——随机产生[0,100)间的随机数