Java基础
环境
下载Java开发工具:
安装jdk(java程序开发工具包):
jdk (Java开发工具包)包含jre(Java运行环境)和jvm(java虚拟机)
环境变量设置:
属性-->环境变量-->系统环境变量-->添加-->JAVA-HOME+根目录(方便系统中jdk版本控制)-->在path 中添加-->%JAVA_HOME%\bin(系统中可执行文件路径)-->确定
环境检查:
win+r -->java-->java -version -->javac
java文件的运行:
Java文件通过javac指令-->class文件(字节码文件),通过java指令-->JVM加载这个 类,执行main方法-->系统指令,让系统运行。
cd+文件名:跳转到此文件 cd..+文件名:跳转到上一级
Java跨平台性:
一次编译,到处运行(将Java文件编译为.class文件,就可以在不同平台运行)
问:为什么?怎样实现的?
答:我们在不同系统上安装了不同的JVM(JRE),不同的JVM将.class文件解析为不同系统的指令从而与系统进行交互
基本类型
注释:
// 单行注释
/* */ 多行注释
/** +回车 文档注释 用于说明类和方法
程序的主方法 所有java程序的入口:
按:Ctrl+shift+o 可导入包
next方法不会解析掉回车符 回车符还在内存中;解决方法:1、不用它 2、吃掉它
输入输出:
输入:
Scanner scan=new Scanner(System.in); 用完必须关掉Scanner
输出:
System.out.println(“”);
变量与常量:
变量:
在程序中用来记录数据的量(名字),在程序运行阶段可以发生变化(可以重新赋值)的量
格式一(直接定义):数据类型 变量名 = 数据;
格式二(间接定义):数据类型 变量名;
变量名 = 数据;
常量:
用final修饰,在程序运行时不会发生变化的量
Java基本语法:
标识符(名字)命名规范:
(1)、标识符只能包含数字、字母、下划线_、$、(首字母不能是数字,不能是关键字,可以包含关键字,写中文不报错但是不允许)
(2)、Java大小写敏感,这就意味着标识符 Hello 与 hello 是不同的。
(3)、类名:首字母大写,如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 :MyFirstJavaClass。
(4)、方法名:以小写字母开头。如果含有若干单词,则后面的每个单词首字母大写。
(5)、变量名:首字母大写,为方便读取可使用驼峰命名法(首字母大写,其余小写)如:MyClass maxNum。
(6)、常量所有字母大写,使用_分隔每一个单词。
(7)、包名全部小写,每个包尽量使用一个单词。
(8)、所有标识符尽量做到见名知意,单词过长可使用首字母,但不能损害见名知意。
(9)、源文件名:源文件名需与类名相同。
Java修饰符:
用来修饰类中方法和属性;
主要有两类修饰符:
1、访问控制修饰符 :
default, public , protected, private
2、非访问控制修饰符 :
final, abstract, static, synchronized
Java关键字:
注意:
Java 的 null 不是关键字,它是一个字面常量,不允许作为标识符使用。
源文件命名规则:
1、一个源文件中只能有一个 public 类
2、一个源文件可以有多个非 public 类
3、源文件的名称应该和 public 类的类名保持一致。例如:源文件中 public 类的类名是 Employee,那么源文件应该命名为Employee.java。
4、如果一个类定义在某个包中,那么 package 语句应该在源文件的首行。
5、如果源文件包含 import 语句,那么应该放在 package 语句和类定义之间。如果没有 package 语句,那么 import 语句应该在源文件中最前面。
6、import 语句和 package 语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。
Java中的基本数据类型转换:
Java是一种强数据类型语言(数据类型之间的界限非常明确),在基本数据类型中,取值大的类型可以存取、记录、赋值范围小的数据类型,反之,数据范围小的数据类型不能存储数据范围大的类型。
强制类型转换 (尽量不使 用) 大转小:
在基本数据类型转换中,表示范围大的数据类型被强制转换为表示范围小的数据类型,把有效位二进制从右到左一刀切(只保留有 效二进制)
隐式转换(不需要在代码中体现)小转大:
当多个数据类型参与运算时,小的数据类型会自动提升为大的数据类型。
例如:
short范围大于byte范围,就可以将byte的变量赋值给short,在这个过程中已经将byte类型转换为short类型(这就是隐式转换)
基本数据类型:
整数类型:
byte short int long 默认为int 默认值为0 整数类型可以直接赋值范围内的整数
* byte =1字节 -2^7---2^7-1 -128--127
* short =2字节 -2^15--2^15-1
* int =4字节 -2^31--2^31-1
* long =8字节 -2^63--2^63-1
* 使用不同的数据类型记录不同的数据范围 节省内存空间
浮点型(小数):
默认类型double 默认值:0.0 不能用于精确表示一个数值,(因为其存储数据的方式),不能用于表示金额、汇率、价格等和金钱有关的内容 推荐使用BigDecimal
(符号位+指数位+尾数位)
float 4字节 单精度浮点型 默认0.0f
float比int范围大
double 8字节 双精度浮点型 默认0.0
double比long范围大
布尔(boolean)类型 :
True/false 默认值为false 不能和任何类型转换
大小:
1个字节(数组中)/4个字节(单独使用)
字符型(char):
用来表示一个字符 char类型表示范围:0-->65535
Java使用unicode编码,使用2个字节表示一个字符
c='\u0000';//char类型的默认值
c='\uFFFF';//最大值65535ASCII打印字符:
ASCII打印字符:
‘a’ -> 97
‘A’ –> 65
‘0’ -> 48
转义符:
进制:
二进制: 由0和1组成,逢2进1
八进制: 由0~7组成,逢8进1
十进制: 由0~9组成,逢10进1
十六进制: 由0 ~ 9和a ~ f(不分大小写)组成
运算符:
算数运算:
加 + 、减 - 、 乘 * 、除 / 、求余 % c=a%b;正负由a(主体决定)
后缀自增自减法(a++,a--): 先进行表达式运算,再进行自增或者自减运算
前缀自增自减法(++a,--a): 先进行自增或者自减运算,再进行表达式运算。
赋值运算: = 、+= 、-= 、*= 、/= 、%=
比较运算符:
结果是布尔类型true/false > 、< 、>= 、 <= 、 == 、 !=
逻辑运算符:
&&与 只有两个条件同时满足时表达式结果才为true,只要一个不满足就为false。
||或 只有A和B的结果都为false,表达式的结果才为false,只要有一个为true,结果就为true。
!非 反转结果,原来为true,现在为false。
位运算:二进制运算是最快的运算方式 例如: 8/2最快的方式 :8>>1
按位运算:& 、 | 、 ^ 、 ~
A&B 将A和B转换成二进制,右侧对其,上下比较,两个都为1,结果才为1
移位运算:
<<:左移 左边最高位丢弃,右边补齐0
左移运算符“<<” - 使指定值的所有位都左移规定的次数。
左移m<<n 代表把数字m在无溢出的前提下乘以2的n次方。
例如,5<<3 就是5乘以2的3次方,结果是40。
>>:右移 最高位是0,左边补齐0;最高为是1,左边补齐1
右移运算符“>>” - 使指定值的所有位都右移规定的次数。
右移m>>n 代表把数字m除以2的n次方,原来是正数的还是正数,负数还 是负数。
位运算注意点:
如果是单数,也就是二进制末位为1,则结果是将m除以2 的n次方的整数商。
16>>3 就是16除以2的3次方,结果是2。
15>>3 就是14(15-1)除以2的3次方,结果是1。
>>>:无符号右移 无论最高位是0还是1,左边补齐0
无符号右移运算符“>>>” 同右移,但是结果全变正数。
问:双箭头和三箭头的区别?
答:双箭头补符号位 三箭头补零
问:&& 与 &有什么区别 ?
&&是逻辑与运算,a&&b就是当且仅当两个操作数均为 true时,其结果才为 true;只要有一个为零,a&&b就为零
&是按位与运算符,a&b是把a和b都转换成二进制数然后再进行与的运算;
&&和&都可以进行true运算和false运算(逻辑运算),&&有短路现象,&没有短路现象
补充--->运算符的优先级:
三元运算:
流程控制
·逻辑判断:
- 尽量避免重复的条件判断
- 就算只有一行代码也要写大括号
- Switch case :匹配一个变量的值 如果某个值被匹配到就从这一行开始运行,直到代码结束或者运行到break
- default所有case项都不匹配才触发,可以没有default,代码顺序可以乱但 执行顺序不变
问:Switch case可以匹配什么样的值?
答:byte、short、int、char、String(字符串)、枚举
long、布尔、float、double不可以
循环判断:
1、for 循环:
for(声明计数器; 继续循环的条件; 计数器的递增){
循环代码块
}
2、while(){}:
3、do{}while():
可以得到明确循环次数用for循环 , 不明确循环次数用while循环
终止循环:
break 跳出循环
continue 终止本次循环立即执行下一次循环
死循环与无限循环:
死循环:
没有明确结束条件的循环
如:while(true){} //死循环后的代码是无效代码,不可能运行到的代码
for(;;){} //死循环
无限循环:
无限循环不是死循环,因为代码中有明确结束条件,虽然永远达不到,但代码解析后不会报错。
怎样跳出多重循环:
数组
数组的声明:
数组的使用:
数组常见异常:
使用数组的限制:
数组只能存放声明数据类型的值(对象)
数组声明(定义)后,数组的长度是不可以改变的
arry.length 是属性
打印出数组中每个元素:
方法:
具有特定功能的一段独立的代码块
方法的定义:
修饰符 返回值类型 方法名(数据类型 变量名,数据类型 变量名…..){
执行语句;(该方法要实现的功能)
return 返回值;
}
方法的作用:
提高代码复用性
提高代码维护性
方法的两个明确:
1、明确参数列表
2、明确返回值类型
方法的调用:
单独调用:方法名(参数);
如果方法的返回值类型为void时,只能使用单独调用
如果方法体有具体的返回值时使用输出调用或复制调用
输出调用:
System.out.println(方法名(参数));
赋值调用:
数据类型 变量名 = 方法(参数);
方法的重载(Overload)?:
定义:
在同一个类中,出现两个名字相同,参数列表不同(参数类型不同,数据类型不同,对应顺序位置不同)的两个方法
常见方法的返回值类型:
Byte 、short、int、long、float、double、boolean、char、
String、int[](数组)、void(无返回值)
方法使用的注意点:
1、方法与方法是平级关系,不能嵌套定义
2、方法的返回值类型与返回值要匹配
3、方法没有具体返回值,返回值类型就为void
4、void没有特殊含义,只能写在返回值类型的位置上,代表该方法没有返回值
5、当方法的返回值类型为void时,return关键字可以省略不写
方法中return关键字的作用:
1、可以返回具体数据,哪里调用返哪里
2、作为方法的结束标记,执行return这个方法就结束了,return后面的方法不会执行。
方法中void关键字的作用:
用于声明此方法不需要返回值 可以写return但是不能跟值
构造方法:
作用:
用来创建对象,并且同时给对象的属性赋值。
构造方法名必须和类名一样 构造方法不能定义返回值类型
构造方法的调用:
特点:
构造方法的名称与类名相同。
构造方法没有返回值类型(即使是void也不需要写)。
构造方法可以重载,即在同一个类中可以有多个构造方法,但参数列表必须不同。
构造方法可以有访问修饰符,如public、private、protected等,默认为default(不加任何修饰符)。
如果一个类没有显式地定义构造方法,编译器会自动为该类提供一个默认的无参构造方法。如果需要其他类型的构造方法,需要显式地定义。
例如:
Set方法和get方法:
set()是给属性赋值的,get()是取得属性值的
被设置和存取的属性一般是私有
主要是起到封装的作用,不允许直接对属性操作
set()和get()不一定同时存在,看程序需求
实参与形参:
可变参数:
可变参数,必须写在参数列表最后一个
可变参数,传入的数量可变,类型不变
可变参数的使用:
修饰符 返回值类型 方法名(数据类型... 量名){ }
可变参数的限制:
一个方法只能有一个可变参数