JAVA学习笔记(一)

1.Java跨平台的原理:
1)编译之后会生成与平台无关的字节码文件
2)得依赖不同平台的虚拟机(JVM)
JVM是不跨平台的
编译工具:javac
启动JVM工具:Java
JRE(Java Runtime Environment):Java运行环境,如果要运行Java程序,就需要JRE的支持,JRE里边包含JVM
JDK(Java Development Kit):Java开发工具,包含开发Java的所有工具,如javac和java等,JDK里包含JRE
Java虚拟机(Java Virtual Machine),简称JVM,它是运行所有Java程序的虚拟计算机,好比是街机游戏的模拟器。
JVM是Java语言的运行环境,也是Java最具吸引力的特性之一。JVM用于读取并处理编译过的与平台无关的字节码(class)文件,从而实现Java的可移植性。但是值得注意的是Java虚拟机是不跨平台的,也就是说在Win下得安装Win版本的JVM,在Linux下得安装Linux版本的JVM
JVM是Java程序的解释和执行器
2.Java安装后各个文件夹的含义
【JAVA学习笔记(一)】(1)bin:存放了Java的操作工具,比如编译工具javac,启动JVM的java等
(2)db:存放了Java测试的数据库derby,企业不用
(3)include:存储C++头文件
(4)jre:Java的运行环境,里面有JVM
(5)lib:Java运行和依赖的核心库
(6)src.zip:Java的源代码
3.安装jre运行java程序
(1)jre-8u121-macosx-x64.dmg(下载安装,在系统偏好设置的面板上)
(2)创建一个空文本,命名为.java文件(比如123.java 文件中有一个名为Hello的类,.java是后缀名或者拓展名)
(3)在终端找到文件路径执行javac 123.java,对文件进行编译,编译成功后此时路径下会生成一个Hello.class的字节码文件
(4)启动JVM,并加载Hello.class这份字节码,并解释执行(执行命令 java Hello),注意不要带后缀.class,就会执行字节码文件中的代码
(5)每次修改代码都需要进行编译

代码解释 // Java程序的开始,表示定义一个公共的类,类的名字是Hello,编译后会生成一个和该名字一样的class文件 public class Hello { // 主方法,Java程序的入口,执行Java命令后,程序自动执行主方法代码 public static void main(String[] args) { // 功能执行代码,表示打印一个文本信息“Hello World”,最后要以分号结束,表示语句结束 System.out.println("Hello World"); } }

4.Java编译和运行机制
源文件(.java) ->编译-> 字节码文件(.class)->输出-> Hello World
Java语言编译型语言
5.CLASSPATH(一般不用配这个环境变量)一般默认在当前目录下
环境变量:指在操作系统中用来指定操作系统运行环境的一些参数
JAVA_HOME: 指JDK的安装根目录,如D:\OpenSource\jdk1.8.0
PATH: 指Java开发工具的位置,如D:\OpenSource\jdk1.8.0\bin
CLASSPATH: 指JVM在运行时去哪一个目录路径加载字节码文件
如果在当前路径下希望把字节码文件统一到一个文件夹中,可以新建一个文件夹命名为classes 编译的时候使用命令javac -d classes 123.java 就可以将123.java的编译文件放在classes的文件夹下,解释字节码文件的命令此时换成java -classpath classes Hello就可以得到程序执行的结果
6.Java基本语法
1)Java语言严格区分大小写,好比main和Main是完全两个不同的概念。
2)一个Java源文件里可以定义多个Java类,但其中最多只有一个类被定义成public类。若源文件中包含public类,源文件必须和该public类同名
3)一个源文件中包含N个Java类时,成功编译后会生成N份字节码文件,即每个类都会生成一份单独的class文件,且字节码文件名和其对应的类名相同
4)若一个类必须运行,则必须拥有main方法,因为main方法是程序的入口
编程建议:
一个Java源文件只定义一个类,不同的类使用不同的源文件定义;
将每个源文件中单独定义的类定义成public的;
保持Java源文件的主文件名与源文件中的类名一致;
7.标识符
在写代码的时候为了增强代码的阅读性会自定义很多名字,比如类名,方法名,变量名等.这些自定义的名称,成为标识符
标识符命名规则:
(1)由字母、数字、下划线、$组成,但不能以数字开头(注:此处的字母可以是中文、日文等,类名首字母大写)
(2)大小写敏感
(3)不能使用Java的关键字和保留字
(4)不用Java API里的类名作为自己的类名
8.变量分类-作用域-使用规则:
变量的分类:
随着变量定义在类中的位置的不同,故把变量分为两类:
(1)成员变量:直接定义在类里的变量,又称为全局变量或字段.
(2)局部变量:变量除了成员变量以外,其他就是局部变量.根据定义位置不同有3种表现形式:方法形参,方法内变量,代码块变量
变量的作用域:
根据变量的存在范围,只有在这个范围内,程序代码才能访问它.当一个变量被定义时,他的作用域就被确定了
作用域是定义开始到定义所在的花括号结束;
变量的使用规则:
(1)变量必须先声明,并且初始化后才能使用;
(2)声明变量必须有数据类型
(3)同一作用域内变量名不能重复定义
先声明赋值后使用,并且可重复使用
//变量分类-作用域-使用规则 public class VarDemo2{ //成员变量,字段(不叫属性) static int age=17; public static void main(String[] args){ /* 变量的分类: 变量依据定义的位置的不同,分为两大类: 1.成员变量/字段(Field):直接定义在类的{}中的变量(在方法外) --报错:无法从静态上下文中引用非静态变量2.局部变量(定义在方法中的变量) 变量除了成员变量,就是局部变量.3.变量的作用域:可以起作用的领域. 1.成员变量:在所定义的类中起作用 2.局部变量:从定义的那个地方开始,到紧跟着结束的"}"之间 */int age=18; // 局部变量 System.out.println(age); /*输出18,当成员变量和局部变量同名时,编译不会出错,得到的结果采取就近原则*/ } }

9.表达式(expression):是由数字、运算符、数字分组符号(括号)、变量、常量等以能求得结果的有意义排列的组合。
用运算符号连接的变量/常量可称为表达式.那么也就是说表达式是由常量、变量、运算符、括号组成能求得之的有意义结果的语句。
如:
a+b
3.14+a
(x+y)*z+100
表达式中操作数进行运算得到的最终结果就是表达式的结果
表达式的运算顺序(大多和数学一样,参照后面的运算符操作优先级);
a + 110 -->表达式
操作数 运算符 操作数
10.在JAVA中数据类型整体上分为两大类:
1):基本数据类型/原生数据类型:共8个 1>:数值型 1/:整数类型: byte short int long; (不同正数类型在内存中占用空间大小是不一样的,整数常量默认是int类型) 2/:小数类型:float double; 2>:字符型:char (字符:字母/符号) 3>:布尔型:boolean,表示对错:ture false; 2):引用数据类型/对象数据类型: 类 / 接口 / 数组

11.小数的默认常量为double类型,若要声明小数常量卫float类型,就在后面加F或f
float表示单精度
double表示双精度
但是两者均不能表示精确的小数,那么在精度要求很高的系统如银行系统中,就需要使用BigDecimal类型,它表示任意精度的数据
Java的浮点类型常量有两种表现形式:
(1)十进制形式:例如:3.14,168.0,.618
(2)科学计数法形式:例如:3.14e2,3.14E2,1000E-2
科学计数法表达式返回的结果是Double类型的
默认情况下,一个浮点类型的字面量默认是double类型,若要声明一个常量为float类型,则需要在常量后加上f或者F,double常量后面的D或者d可省略。注意:Java只有浮点型的变量才可以接受科学计算数的结果
12.字符类型:字符、字母和符号
char类型:表示16位的无符号整数或者Unicode字符,Java对字符占用两个字节,可以表示一个汉字
什么是编码?
计算机只能表示0和1两个数,于是规定使用一个数字去表示一个特定的字符,比如a使用97表示 char前256个字符和ASICC(美国信息交互标准编码)码中的字符重复
13.基本数据类型的转换
在8大基本数据类型(byte-1字节,short-2字节,int-4字节,long-8字节,double,float,char-2字节,boolean),boolean不属于数值类型,不参与转换
字节数 byte < short(=char) < int < long < float < double (一般的byte short char不参与转换 char虽然也是2字节但是不包含负数跟short比起来数量少,因此short和char不能相互转换)
转换规则其实就是各自数据类型的空间大小,把不同的数据类型看成是不同容量的容器
自动类型转换,也称为“隐式类型转换”(从小到大)
强制类型转换(从大到小 显式类型转换):当把大范围类型的数值赋给另一个小范围变量时,此时系统不能自动完成转换,需要加上强制转换符,但这样的操作可能造成数据精度的降低或溢出,所以使用时要格外注意
byte b2 = 125; 把一个int类型常量赋值给byte类型变量,编译时,发现125在byte的范围之内,底层就会转换成byte类型的但是如果设置成byte b2 = 128; 则就会报错了
14.表达式类型的自动提升
当一个算数表达式中包含多个基本数据类型(boolean除外)的值时,整个算数表达式的数据类型将在数据运算时出现类型自动提升,其规则是:所有的byte,short,char类型自动提升到int类型 整个表达式的最终结果类型提升到表达式中类型最高的类型
String和任意数据使用,连接起来就是String(字符串)
double d2 = 123 + 1.1F + 99L + 3.14; System.out.println(d2); // 输出226.2400061035156System.out.println('A' + 1); // 输出66byte b4 = 25; // b4 = b4 + 3; // 表达式运算后已经提升到int类型了,在赋值给byte类型,编译会报错 // 为了避免这种情况 将会用到赋值运算符 b4 += 3; // 这里就体现出了+=赋值运算符的好处了 System.out.println(b4); // 28b4 += 3 等价于 b4 = (byte)(b4 + 3) 查看第16点笔记

15.算术运算符
取模(求余数):模数的符号忽略不计,结果的正负取决于被模数
注意:无穷大和NaN都属于double浮点类型,但是所有的正无穷大都是相等的,所有的负无穷大也是相等的,NaN永远不相等,也不等于自己
public class ArithmeticOperatorsDemo { public static void main(String[] args) { // 操作数字 System.out.println(10 + 2); // 12 System.out.println(10 - 2); // 8 System.out.println(10 * 2); // 20 System.out.println(10 / 2); // 5 System.out.println("----------------------"); // 操作字符 System.out.println('A' + 'B'); // 131 // 操作字符串 System.out.println("AAA" + "BBB"); // AAABBB System.out.println("----------------------"); System.out.println(10 / 3); // 3 System.out.println(9876 / 1000 * 1000); // 9000 System.out.println("----------------------"); // System.out.println(100 / 0); // 报错by zero System.out.println(100.0 / 0); // Infinity正无穷大 double d1 = 100.0 / 0; double d2 = 200.0 / 0; System.out.println("所有的正无穷大都相等吗?"); System.out.println(d1 == d2); // true double d3 = -100.0 / 0; double d4 = -200.0 / 0; System.out.println("所有的负无穷大都相等吗?"); System.out.println(d3 == d4); // true System.out.println("正无穷大和负无穷大相等吗?"); System.out.println(d1 == d3); // falseSystem.out.println(100 / 0.0); // Infinity正无穷大 System.out.println(-100 / 0.0); // -Infinity负无穷大 System.out.println(0.0 / 0.0); // NaN Not a Number 自己都不等于自己 double d5 = 0.0 / 0.0; System.out.println(d5 == d5); // false // 取模(求余数):模数的符号忽略不计,结果的正负取决于被模数 System.out.println(10 % 3); // 1// 自增 ++ /* * ++前置情况 *++a *表示a变量自身先加1,再运算 * ++后置情况 *a++ *表示a变量自身先加1,把递增1之前的原始值拿去做运算 * */ // --道理一样 System.out.println("---------------"); int a1 = 5; int b1 = ++a1; System.out.println("a1 = " + a1 + " b1 = " + b1); // a1 = 6 b1 = 6 System.out.println("---------------"); int a2 = 5; int b2 = a2++; System.out.println("a2 = " + a2 + " b2 = " + b2); // a2 = 6 b2 = 5 } }

16.赋值运算符
public class AssigningOperatorsDemo { public static void main(String[] args) { short a = 10; //a = a + 5; // 编译报错 a += 5; // a += 5 等价于a = (short)(a + 5); System.out.println(a); // 15 } }

17.比较运算符
==, !=, >, <, >=, <=, instanceof(检查是否是类的对象) "Hello" istanceof String true
比较运算符用于比较两个常量或者变量之间的关系,比较运算的结果都是boolean类型
18.三元运算符
三元运算符表示有三个元素参与的表达式,又称为三目运算符,其语义表示为if-else。
语法格式为:X ? Y : Z 其中X为boolean类型表达式,先计算X的值,若X计算结果为true,则整个三目运算表达式的结果是Y,否则就是Z。三目运算符结果的类型是由Y和Z决定的
19.逻辑运算符
运算符 运算 范例 结果
& AND(位与) false & true false
OR(或) false 丨 true true
^ XOR(异或) false ^ true true
! NOT(非) !true false
&& AND(短路) false && true false
丨丨 OR(短路) false 丨丨 true true
语法格式为:boolean result = 表达式A 逻辑运算符 表达式B
&:表示并且,当操作数A和B都为true结果才为true,否则结果result是false
&&:和&结果相同,具有短路效果,如果左边操作数A是false,result一定是false,且不运行B的运算
|:表示或者,当操作数A和B都为false结果才为false,只要有A或者B为true,结果result是true
||:和|结果相同,具有短路效果,如果左边操作数A是true,result一定是true,且不运行B的运算
^:判断A和B是否相同,不同则为true,相同则为false
!:取反,!true结果是false,!false结果是true
20.位运算符
运算符 描述
& 按位与
按位或
^ 异或(相同为0,不同为1)
~ 取反
<< 左移位
>> 右移位
>>> 无符号右移位
&:参与运算的两个数,若相应位数的值都为1,则该位结果值是1,否则是0.
|:参与运算的两个数相应位中只要有一个1,结果就是1.
^:参与运算的两个数相应位相同则结果为0,否则为1.
~:表示把两个二进制位的“1”换成“0”,把“0”换成1.
<<:将操作数的二进制码整体左移指定位数,左移之后的空位用“0”来补充.
:将操作数的二进制码整体右移指定位数,右移之后的空位用“符号位”来补充:
若是正数用“0”来补充
若是负数用“1”来补充(操作负数:取反,求补)
:将操作数的二进制码整体右移指定位数,右移之后的空位用“0”来补充:
二进制数a 二进制数b 与(&) 或(丨) 异或(^)
0 0 0 0 0
1 0 0 1 1
0 1 0 1 1
1 1 1 1 0
boolean的true和false,在底层使用一位的1和0表示
public class BitOperatorsDemo { public static void main(String[] args) { System.out.println(3 & 5); System.out.println(3 | 5); System.out.println(3 ^ 5); System.out.println(~3); System.out.println(2 << 3); System.out.println(16 >> 3); System.out.println(-16 >> 3); // 交换两个数 int a = 10; int b = 20; System.out.println("a = " + a + " b = " + b); a = a ^ b; b = a ^ b; a = a ^ b; System.out.println("a = " + a + " b = " + b); } }

    推荐阅读