java基础回炉重造第一天
JDK、JRE、JVM的区别
- JDK
java开发工具包 - JRE
java运行时环境 - JVM
java虚拟机
包含关系
JDK > JRE > JVM
虚拟机实现跨平台功能
HelloWord
- 代码编写,编写代码并保存在磁盘上,保存为:xxx.java
- 编译阶段(编译器创建 class 字节码文件),进入java文件所在目录,执行命令:javac xxx.java
- 执行阶段,进入java文件所在目录,执行命令:java xxx
HelloWord深化
- java对大小写敏感
- main方法是 java 应用程序的入口方法
- 在java中,用花括号划分程序的各个部分,任何方法的代码都必须以“{”开始,以“}”结束,由于编译器忽略空格,所以花括号风格不受限制。
- java一个语句可以跨多行,每个语句必须以分号结束,回车不是语句的结束标志
- 一个源文件可以有多个 class,一个源文件中至多只能有一个public的类声明,其他类的个数不限,如果源文件中包含一个public类,源文件名必须和它定义的public的类名相同,且以“java”为扩展名。
编程风格
- 注意缩进
- 成对编程
- 见名知意
注释
注释不能嵌套
// 单行注释
/*
多行
注释
*/
标识符unicode和GBK_各种字符串的关系
标识符
-
作用:
给变量、类和方法命名。 -
java标识符有如下命名规则:
- 标识符必须以字母、下划线、美元符号开头。
- 标识符其他部分可以是字母、下划线“_”、美元符“$”和数字的任意组合。
- Java标识符大小写敏感,且长度无限制。
- 不可以是Java的关键字。
-
注意:
Java 不采用通常语言使用的ASCII字符集,而是采用unicode这样的标准的国际字符集。
因此,这里的字母含义:英文、汉字等等。(不建议大家使用汉字来定义标识符!) -
不合法的标识符:
int 1a = 3 //不能用数字开头
int a# = 3 //不能傲包含#这样的特殊字符
int int = 3 //不能使用关键字
- Java关键字是Java语言保留供内部使用的,如 class 用于定义类。 关键字也可以用成为保留字,他们的意思是一样的。不用刻意去背。
八种基本数据类型
java是一种强类型语言,每个变量都必须声明其类型
-
数据类型
- 基本数据类型
- 数值类型
- 整数类型(byte(1字节),short(2字节),int(integer)(4字节),long(8字节))
- 浮点类型(float(4字节),double(8字节))
- 字符型(char)
- 布尔型(boolean)
- 数值类型
- 引用数据类型
- 类(class)
- 接口(interface)
- 数组
浮点数和浮点数的误差问题
- 基本数据类型
-
float 类型又被称作单精度类型,尾数可以精确到7位有效数字,在很多情况下,float类型的精度很难满足。
-
double 表示这种类型的数值精度是 float 类型的2倍,又被称作双精度,绝大部分应用程序都采用 double类型。
-
浮点数值默认为 double 类型。要将其变为 float 类型,需要在后面增加 F/f 。如:3.14F
-
最好避免比较中使用浮点数。
-
浮点数存在舍入误差,很多数字不能精确表示。如果需要进行不产生摄入误差的精确数字计算,需要使用 BigDecimal类。
char 字符串和 boolean
char
- 单引号用来表示字符常量。
- char 类型用来表示在 Unicode 编码表中的字符。
- char 是在 0~65535 范围,运行时直接当作整数来运行。
- 可以把 0~65535 之间的整数直接转型为char。
boolean 类型(一位,不是一个字节)
- boolean 类型有两个值,true 和 false
- boolean 类型用来判断逻辑条件,一半用于程序流程控制
自动和强制类型转换
自动类型转换
- 容量小的数据类型可以自动转换为容量大的数据类型
int i= 3;
double d = i;
float f = i;
double d2 = f;
- 特例
可以将整型常量直接赋值给 byte ,short,char,等类型变量,而不需要进行强制类型转换,只要不超出其表示数范围
Short b = 12; //合法
short b = 1234567; //不合法
强制类型转化
-
强制类型转换,又被称为造型,用于显示的转换一个值得类型。在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。
-
当将一种类型强制转换成另一种类型,而又超出了目标类型的表示范围,就会被截断成为一个完全不同的值。
表达式中的类型提升问题
int a =3;
long b =4;
int c = (int)(a + b); //做所有的二元运算符(+-*%),都会有类型提升的问题
基本类型转化时常见的错误和问题
- 操作比较大的数时,需要留意是否溢出,尤其时整数操作时
int money = 100000000; //10亿
int years = 20;
int total = money * years; //返回的是负数
long total1 = money * years; //返回的任然是负数,默认为 int,因此结果会转成 int 值,再转成 long。但是已经发生了数据丢失。
long total2 = (long)money * year; //先将一个因子变成 long ,整个表达式发生提升。全部用 long 来计算。
L 和 l 的问题:
- 不要命名名字为 l 的变量
- long 类型是用大写 L 不要用小写
JDK7新特性
二进制整数
下划线分隔符
变量
- Java是一种强类型语言,每个变量都必须声明其类型
- Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域
- 变量在使用前必须对其声明,只有在变量声明以后,才能为其分配相应长度的存储单元,声明格式为:
type varName = [=value] [{,varName[=value]}] ;
-
注意事项:
- 每个变量都有类型,类型可以是基本类型,也可以是引用类型。
- 变量名必须是合法的标识符
-
变量声明举例:
double salary ; boolean done;
long eatthPopulation ; int age ;
- 可以在一行中声明多个变量:
int i , j ;
不提倡这种风格,注意声明每一个变量可以提升程序的可读性。
- 可以将变量的声明和初始化放在同一行中,例如:
int age = 18; float e = 2.718281828f ;
实例变量(成员变量)
- 方法外部、类的内部定义的变量
如果不自行初始化,他会自动初始化成该类型的默认初始值(数值型变量初始化成 0 或 0.0,字符型变量的初始化值是16位的0,布尔型默认是false)
局部变量:方法或语句块内部定义的变量
- 在使用前必须先声明和初始化(赋初始值)。
public class Test2 {
int t; //实例变量,成员变量,属性
public static void main(String[] args) {
//局部变量
int a;
a = 5;
int x, y, z;
}}
Final 常量
- 只能被初始化一次
- 常量大写
命名规范
- 所有变量、方法、类名:见名知意
- 变量、方法名:
- 首字母小写和驼峰原则
- 常量:
- 大写字母和下划线
- 类名:
- 首字母大写和驼峰原则
基本运算符
Java语言支持如下运算符:
名称 | 表达方式 |
---|---|
算术运算符 | +,-,*,/,%,++,-- |
赋值运算符 | = |
关系运算符 | >,<,>=,<=,==,!= instanceof |
逻辑运算符 | &&,||,! |
位运算符 | &,|,^,~,>>,<<,>>(只做了解!!!) |
条件运算符 | ? : |
扩展赋值运算符 | +=,-=,*=,/= |
算术运算符
-
二元运算符类型提升:
整数运算:
* 如果两个操作数有一个为 Long ,则结果也为 long
* 没有 long 时,结果为int, 即使操作数全为 shot,byte,结果也为 int -
浮点运算:
- 如果两个操作数有一个为double,则结果为 double。
- 只有两个操作数都是float,则结果才为 float。
-
一元运算符(++,--)
int a = 3;
int b =a++; //执行完后,b=3。先给b赋值,再自增
int c =++a; //执行完后,c=5。先自增,再给b赋值
布尔逻辑表达符
- 逻辑与:&&
- 逻辑或:||
- 逻辑非:!
- 逻辑与和逻辑或采用**短路的方式。**从左到右计算,如果确定值则不会再计算下去。
位运算符
- ~ --取反
- & --按位与
- | --按位或
- ^ --按位异或
- << :左移运算符
- >>:右移运算符
- 右移一位相当于除2取商
- 左移一位相当于乘2
三目条件运算符
x ? y : z
- 其中 x 为 boolean 类型,先计算 x 的值,若为 true ,则整个三木运算符的结果为表法式 y 的值,否则真个运算结果为表达式 z 的值。
- 经常用来代替简单的 if-else判断!
扩展运算符
字符串相连,加号两边只要有一个为字符串,则整个结果为字符串
运算符优先级的问题
表达式里面优先使用小括号来组织!!!