在配置完 Java 开发环境,并下载 Java 开发⼯具(Eclipse、 IDEA 等)后,就可以写 Java 代码了,因为本篇⽂章是从头梳理 Java 体系,所以有必要从基础的概念开始谈起。
Java语言严格区分大小写,⼤⼩写敏感: Java 是对⼤⼩写敏感的语⾔,例如 Hello 与 hello 是不同的,这其实就是 Java 的字符串表示⽅式
一个java源文件(.java)里可以定义多个 Java 类,但其中最多只能有一个类可以被定义为public类;若源文件中包含public类定义,则该源文件的文件名必须与该public类的类名一致
一个源文件包含N个Java类时,成功编译后会生成N份字节码文件(.class),即每个类都会生成一份单独的class文件,且字节码文件名和其对应的类名相同
若一个类必须运行,则需要有mian方法或j使用JUnit 测试类,mian方法是程序的入口
标识符: 标识符就是给常量、变量、类、方法起名字 注意: 标识符由字母、数字、下划线"_"、美元符号"$"组成 标识符不能以数字开头 标识符严格区分大小写 标识符不能是关键字
例如 :
●对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间。
在 Java 中,数据类型只有 四类⼋种1.byte,short,int,long 2. byte 也就是字节, 1 byte = 8 bits, byte 的默认值是 0 3. short 占⽤两个字节,也就是 16 位, 1 short = 16 bits,它的默认值也是 0 4. int 占⽤四个字节,也就是 32 位, 1 int = 32 bits,默认值是 0 5. long 占⽤⼋个字节,也就是 64 位, 1 long = 64 bits,默认值是 0L 6. 所以整数型的占⽤字节⼤⼩空间为 long > int > short > byte
int i = 11;//整数常量默认是int 类型 long l = 11L; //long 类型常量需在整数后添加l 或L 后缀 long l = 110; //可以把一个比较小的整数值(int类型的表数范围内)直接赋给一个long 类型的变量(自动类型转换)1MB= 1024KB 1KB= 1024B B= byte ? bit? bit:计算机中的最小存储单位。byte:计算机中 基本存储单元。
浮点型有两种数据类型: float 和 double
float 是单精度浮点型,占⽤ 4 位, 1 float = 32 bits,默认值是 0.0fdouble 是双精度浮点型,占⽤ 8 位, 1 double = 64 bits,默认值是 0.0d; double pi = 3.14; // 浮点数常量默认是 double 类型 float pi = 3.14F; // float 类型常量需在浮点数后添加 f 或 F 后缀 float pi = 3.14; // 错误: 不兼容的类型: 从 double 转换到 float 可能会有损失 3.14 == 3.14F; // false 3.14 == 3.14D; // true float a = 1.0f - 0.9f; float b = 0.9f - 0.8f; a == b; // false注意:浮点数采用“尾数+阶码”的编码方式,所以 float, double 都不能表示精确的浮点数,需用 BigDecimal 类型
字符型就是 char, char 类型是⼀个单⼀的 16 位 Unicode 字符,最⼩值是 \u0000 (也就是 0 ) , 最⼤值是 \uffff (即为 65535) , char 数据类型可以存储任何字符,例如 char a = ‘A’。
char 16 位 Unicode 字符集,编码方式为 UTF-16BEUTF-16 使用 2 或者 4 字节表示一个字符,在 65536 以内的占两个字节,而基本上所有汉字的 Unicode 编码在 19968 到 40869 之间,所以一个 char 类型可以存储一个汉字使用’‘引号括起来 49’1’; 65 ‘A’; 97 ‘a’ // 表示形式 char c1 = 'A'; // 使用单个字符 char c2 = 65; // 使用十进制的整数(Unicode 值),[0, 65535] char c3 = '\u0061'; // 使用十六进制的整数,格式'\uXXXX',('\u0000'~'\u00FF')布尔型指的就是 boolean, boolean 只有两种值, true 或者是 false,只表示 1 位,默认值是 false。
boolean isMan = true;boolean不属于数值类型.不参与转换
如果直接将一个较小的整数常量(在 byte 或 short 类型的表数范围内)赋给一个 byte 或 short 变量,系统会自动把这个整型常量当成 byte 或 short 类型来处理
语法格式: (targetType)value
byte b2 = 65; // 系统会自动把 65 当成 byte 类型处理 int a = 12; byte b = (byte) a;// 强制类型转换 float a = (float) 5.6; // 强制类型转换 int i = (int) -12.32; // 强制类型转换(小数部分被截掉),i = -12 (char) 65; // 表示 'A' 字符运算符: 对常量或变量进行操作的符号 表达式:用运算符把常量或变量连接起来符合Java语法的式子被称为表达式 表达式不是完整的语句!
说明:
加号 1.1 加号在操作数值、字符、字符串时,其结果是不同的 1.2 当两个字符相加得到的是 ASCII 码表值 1.3 作为字符串连接运算符
除号 2.1 如果除法运算符的两个操作数都是整数类型,则计算结果也是整数(截断小数部分取整),此时除数不能是 0,否则将引发除以零异常 ArithmeticException: / by zero 2.2 如果除法运算符的两个操作数有 1 个是浮点数,或者 2 个都是浮点数,则计算结果也是浮点数,此时允许除数是 0,或者 0.0,得到结果是正无穷大或负无穷大
算数运算 3.1 算数运算符需要注意的就是 优先级问题 ,当⼀个表达式中存在多个操作符时,操作符的优先级顺序就决定了 计算顺序,最简单的规则就是先乘除后加减, () 的优先级最⾼,没必要记住所有的优先级顺 序,不确定的直接⽤ () 就可以了。
取模(取余) 4.1 被模数 % 模数 4.2模数的符号忽略不计,结果的正负取决于被模数 4.3 如果求余运算的两个操作数都是整数类型,则求余运算的第二个运算数不能是 0,否则将引发除以零异常
'A' + 'B' // 131 "A" + "B" // AB 10 / 3 // 3 System.out.println(10 / 0) // ArithmeticException: / by zero System.out.println(10.0 / 0) // 输出正无穷大:Infinity System.out.println(-10.0 / 0) // 输出负无穷大:-Infinity System.out.println(0 / 0.0) // 输出非数(Not a Number):NaN /* 注意: 无穷大和 NaN 都属于 double 浮点类型 但是所有正无穷大数值都是相等的,所有负无穷大数值也是相等的 NaN 不与任何数值相等,也不等于自己 */+= 隐式的将加操作的结果类型强制转换为持有结果的类型
byte a = 127; byte b = 127; b = a + b; // error : cannot convert from int to byte b += a; // ok short s = 5; s += 5; // s = (short)(s + 5)⽐较运算符⽤于程序中的变量之间,变量和⾃变量之间以及其他类型的信息之间的⽐较。 ⽐较运算符的运算结果是 boolean 型。当运算符对应的关系成⽴时,运算的结果为 true,否则为false。⽐较运算符共有 6 个,通常作为判断的依据⽤于条件语句中。
符号作用举例说明==判断是否相等x==z判断x和z的值是否相等,成立为true,不成立为false!=判断是否不等x!=z判断x和z的值是否不相等,成立为true,不成立为false>大于x>z判断x的值是否大于z的值,成立为true,不成立为false>=大于等于x>=z判断x的值是否大于等于z的值,成立为true,不成立为false<小于x<z判断x的值是否小于z的值,成立为true,不成立为false<=小于等于x<=z判断x的值是否小于于等于z的值,成立为true,不成立为falsei 比较运算符的结果是 boolean 类型使用 == 判断两个两个变量是否相等 基本类型变量:只要两个变量的值相等( 不一定要求数据类型严格相同),就返回 true 引用类型变量:只有两个变量指向同一个对象时,返回 true(不可用于比较类型上没有继承关系的两个对象,否则编译报错)97 == 'a'; // true 5.0 == 5; // true "hello" == new Animal(); // 编译报错逻辑运算符主要有三种,与、或、⾮
符号作用说明&逻辑与与,都为 true,结果才为 true,否则结果是 false|逻辑或或,都为 false,结果才为 false,只要有一个是 true,结果就是 true!逻辑非取反,!true 结果是 false,!fasle 结果是 true^逻辑异或异或,判断两个操作数是否不同,不同则为 true,相同则为 false&&短路与短路与,如果左边的操作数是 false,结果一定为 false,且不再计算右边的操作数||短路或短路或,如果左边的操作数是 true,结果一定为 true,且不再计算右边的操作数 “& " 和”&&" 的异同 1.1 “&” 和"&&":左边为真,右边都运行 1.2 左边为假 "&"运行 "&&"不运行下⾯是逻辑运算符对应的 true/false 符号表
用于操作两个 boolean 类型的变量或常量,结果也是 boolean 类型
三元运算符是类似 if…else… 这种的操作符,语法为: 条件表达式?表达式 1:表达式 2。问号 前⾯的位置是判断的条件,判断结果为布尔型,为 true 时调⽤表达式 1,为 false 时调⽤表达式 2。
格式:boolean 表达式 ? 表达式 1 : 表达式 2
// 判断奇数偶数 String ret = number % 2 == 0 ? "偶数" : "奇数";定义:在Java语言中事先被定义赋予特性含义的小写单词
修饰符的适用范围
访问权限修饰符 定义:用于控制一个类的成员是否可以在其他类中访问,不能修饰局部变量 private(当前类访问权限): 在同一类内可见,只能被所属类方法 无(包访问权限):不使用任何修饰符时,在同一包内可见 protected(子类访问权限) : 对同一包内的任何其他类和不同包中的子类可见,不能修饰接口中的成员变量和成员方法(注意:在不同包中的子类只能通过该子类访问父类中protected成员,通过其他子类或父类都无法访问) public(公共访问权限):对所有类可见
非访问修饰符 static : 用于创建类方法和类变量,类方法不能访问的实例变量 final : 用于修饰符,方法和变量,final修饰的类不能被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,不可修改 abstract : 用来创建抽象类,抽象方法 synchronized : 修饰的方法,代码块中在同一时间只能被一个线程访问,不能修饰构造器,成员变量等 volatile : 修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值;并且,当成员变量发生变化时,强迫线程将变化值回写到共享内存(保证了线程操作时变量的可见性.即一个线程修改了某个变量的值.这个新值对其他线程来说是立即可见的) (只保证内存可见性,无法保证操作的原子性) transient : 序列化的对象包含被transient 修饰变量时,JVM 跳过该特定的变量 native : 修饰的方法通常采用C/C++ 语言实现
volatile 的实现原理
如果对声明了volatile 变量进行写操作 .JVM 就会对处理器发送一条lLock前缀的指令,将这个变量所在的缓存行的数据写回到内存,这个回写内存的操作会引起在其他CPU里缓存了该内存地址的数据无效
缓存一致行协议(如Intel 的MESI协议): 每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置为无效状态,当处理器要对这个数据进行修改操作时,会强制重新从系统内存里把数据读取到处理器缓存里
final 修饰符
final修饰的类:
final修饰的方法:
final修饰的变量
直接量的类型
1.int类型的直接量二进制(以0B或0b开头),八进制(以0开头),十进制和十六进制(以0x或0X开头) 如123,012(对应的十进制的10),0x12 (对应十进制的18) 4. long类型的直接量: 在整数数值后添加l 或L ,如3L,0x12L 5. float类型的直接量: 在一个浮点数后添加f或F ,如5.34f,3.14E5F 6. double类型的直接量: 标准小数形式或科学计数法形式的浮点数,如: 5.34,3.14E5 7. boolean类型的直接量: 只有true 和false 8. char类型的直接量:单引号括起来的字符,转义字符和Unicode值表示的字符 如: ‘a’,’\n’和’u0061’ 9. String类型的直接量: 用双引号括起来的字符序列 10. null类型的直接量: 只有一个值,即null,可以赋给任何引用类型的变量,用于表示这个引用类型变量中保持的地址为空,即还未指向任何有效对象
定义格式:
1.//数据类型 变量名 = 初始化值; (声明,赋值) 2. int num =123;使用注意:
变量的分类按声明的位置的不同 ●在方法体外,类体内声明的变量称为成员变量。 ●在方法体内部声明的变量称为局部变量。
同一作用域内同一变量不可重复声明变量必须初始化后才能使用(即必须有值才能使用),否则编译报错变量的值可在同一类型不断变化变量命名符合标识符规范,使用驼峰命名法,首字母小写就近原则变量的分类及作用域
不同数据类型的成员变量的初始值
成员变量/全局变量/字段 : 直接定义在类中, 方法外的变量
局部变量
1.方法的形参,方法中的变量,代码块中的变量 2.没有初始值,必须显示初始化后才能使用 3.定义局部变量后,系统并未分配内存空间,直到这个程序为变量赋值时 ,系统才会字所在方法中的栈内存中为局部变量分配内存,并将初始化(基本数据类型的值或者对象的引用),保存在该内存中 4.从定义的位置 开始到所在结束的花括号
二进制整数
●用于说明解释程序的文字就是注释。 ●提高了代码的阅读性;调试程序的重要方法。 ●Java中的注释类型:
单行注释 使用 //注释内容 多行注释 使用 /*注释内容*/ 文档注释 使用 /**注释内容*/: ➢格式: /** * @author 指定java序的作者 *@version指定源文件的版本 */ ●注释内容可以被JDK提供的工具javadoc所解析,生成一套以 网页文件形式体现的该程序的说明文档。●注释是一个程序员必须要具有的良好编程习惯。 ●将自己的思想通过注释先整理出来,再用代码去体现
●注: ➢对于单行和多行注释,被注释的文字,不会被JVM( java虚拟机)解释执行。 ➢多行注释里面不允许有多行注释嵌套。