Java入门阶段
JDK&JRE&JVM
JDK:
Java Develoment kit Java开发工具包
JRE:
Java Runtime Environment Java运行时环境
JVM:
Java Virtual machine Java虚拟机 通过虚拟机实现跨平台特性
第一个程序
public class Welcome{
public static void main(String[] args){//args arguments参数的缩写
System.out.println("Hello World!");
}
}
控制台调用输出:
javac:将.java文件编译成.class字节码文件
执行.class文件 java 文件名(不用加文件后缀)
变量和数据类型(8种)
标识符Identifier
- 规则:标识符不能包含除了字母、数字、下划线、$符号开头之外的任意字符
Java内部采用了Unicode字符集,universal通用字符集
- ISO8859-1
- 西欧字符集
- BIG5
- 台湾的大五码,表示繁体汉字
- GB2312
- 大陆使用最早、最广的简体中文字符集
- GBK
- GB2312的扩展,可以表示繁体中文
- GB18030
- 最新GBK的扩展,中国所有非手持/嵌入式计算机系统的强制实施标准,可以表示汉子、维吾尔文、藏文等中华民族字符。
- Unicode
- 国际通用字符集
Java是一种强类型语言,每个变量都必须声明其类型。
数据类型
- 基本数据类型
- 数值型
- 整数类型:byte、short、int、long
- 浮点类型:float、double
- 字符型:char
- 布尔型:boolean
- 数值型
- 引用数据类型
- 类:class
- 接口:interface
- 数组
public class TestDataType{
public static void mian(String[] args){
int a = 10;//声明整数
System.out.println(a);//输出
Integer.toBinaryString();//将十进制转换成二进制
Integer.toOctalString();//将十进制转换成八进制
Integer.toHexString();//将十进制转换成十六进制
/*BigInteger类 大整数*/
/*自动类型转换:如果数据的大小没有超过当前数据代表的范围,可以自动转型*/
}
}
类型 | 占用存储空间 | 表示范围 | 默认值 |
---|---|---|---|
byte | 1字节 | -128~127 | 0 |
short | 2字节 | -32768~32767 | 0 |
int(Integer) | 4字节 | -231~231-1 | 0 |
long | 8字节 | -263~263-1 | 0L |
float | 4字节 | e^32科学计数法 | 0.0f |
double | 8字节 | 10^308 | 0.0d |
char | 2字节 | 0~65535 | |
boolean | false |
public class TestFloatType{
public static void main(String[] args){
double d = 3.14;//浮点数常量默认是double类型
float f = 6.20f;//转换为float类型 加f或F
double d2 = 314e-2;//科学技术法 3.14 314×10^-2次方
/*
浮点数:
默认是double
浮点数存在舍入误差,很多书字不能精确表示。如果需要进行不产生舍入误差的精确数字 计算,需要使用BigDecimal类 大小数类。
最好避免比较中使用浮点数。
*/
float f = 0.1f;
double d = 1.0/10;
System.out.println(f==d);//false 浮点数在内存中表示会有误差
}
}
字符型
public class TestCharType{
public static void main(String[] args){
char c1 = 'a';//char类型使用unicode字符集 表示0~65535个字符
char c2 = '\"';//转译字符\ 引号 反斜杠
char c3 = '\t';//制表符 \n换行符
char c4 = 'a';
int i = c4 + 2;//每个字符对应ASCII a对应的是97
char c5 = (char)i;//将99强转为字符类型 对应字符为 c 强制类型转换
/*循环打印a~z*/
for(int i =0; i < 26; i++){
char temp = (char)(c4+i);
System.out.println(temp);//循环打印
}
String str = "abslfja";//定义字符串
}
}
boolean类型(一位,不是一字节)
通常用来做逻辑判断
public class TestBooleanType{
public static void main(String[] args){
boolean b= true;//默认false
if(b){
System.out.println("sf");
}
}
}
类型转换
容量小的数据类型可以自动转换为容量大的数据类型。
public class TestCast {
public static void main(String[] args){
/*转型*/
byte b = 123;//自动转型为byte
byte b2 = (byte)300;//不能完成自动转型 需要进行强制类型转换 会丢失精度
char c2 = 'a';
int i = c2;//可以直接转换为int类型
long do1 = 1233333;
float f = do1;//可以直接转换为float类型 可能会丢失精度
int i2 = 100;
char c3 = (char)i2;//不能完成自动类型转换 需要强制类型转换
/*
超出表示范围 会转化成为一个完全无意义的值
*/
/*运算时类型提升为题*/
int a = 3;
long b = 4;
/*做所有二元运算符,都会有类型提升问题 例:int型+long型 结果会自动转换为long类型*/
int c = (int)(a + b);//丢失精度 blong类型需要强制类型转换
int money = 100000000;//10亿
int years = 20;
int total = (long)money*years;//需要进行对money强制类型转换,否则数值会溢出
/*一个人70年心跳多少次*/
long times = 70L*60*24*365*70;//需要将首位添加L将其自动转换为long类型,提升类型
}
}
JDK1.7特性
- 二进制整数
- 下划线分隔符
public class TestBinaryNum{
public static void main(String[] args){
int a = 013;//八进制 0x十六进制 0b代表二进制
int b = 0b0000_1111_0101;//分隔符二进制
}
}
变量(variable)
- Java是一种强类型语言,每个变量都必须声明其类型。
- Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。
- 变量在使用前必须对其进行声明,只有在变量声明以后,才能为其分配相应长度的存储单元,声明格式为:
- type varName
- 注意事项:
- 每个变量都有类型,类型可以是基本类型,也可以是引用类型。
- 变量名必须是合法标识符。
public static void main(String[] args){
int n;
n = 5;
int x, y, z;
}
局部变量(Local Variable)和实例变量
- **局部变量:**方法或语句块内部定义的变量
- 在使用前必须先声明和初始化(赋初值)
- 实例变量·(成员变量、属性):
- 方法外部、类的内部定义的变量
- 如果不自行初始化,他会自动初始化成该类型的默认初始值(数值型变量初始化成0或0.0,字符型变量的初始化值是16位的0,布尔型默认是false)\u0000
常量(Final)
只能被初始化一次
final int C = 10;//常量要使用大写
final int MAX_SPEED = 120;//两个单词之间用下划线分开
命名规范
- 所有变量、方法、类名:见名之意
- 变量、方法名:
- 首字母小写和驼峰命名法
- run(),runRun(),age ageNew monthSalary
- 常量:
- 大写字母和下划线:MAX_VALUE
- 类名:
- 首字母大写和驼峰命名法:Man,GoodMan
运算符
- Java语言支持如下运算符:
- 算术运算符:+,-,*,/,%,++,–
- 赋值运算符:=
- 关系运算符:>,<,>=,<=,==,!=, instanceof
- 逻辑运算符:&&,||,!
- 位运算符:&,|,^,~,>>,<<,>>>(了解!!!)
- 条件运算符:? , :
- 扩展赋值运算符运算符:+=,-=,*=,/=
算术运算符
- 二元运算符类型提升:
- 整数运算:
- 如果两个操作数有一个为Long,则结果也为Long
- 没有Long时,结果为int,即使操作数全为short,byte,结果也是int
- 浮点运算:
- 如果两个操作数有一个为double,则结果为double
- 只有两个操作数都是folat,则结果才为float
- 整数运算:
- 一元运算符(++,–)
public static void main(String[] args){
double d = 10.2%3;//小数也可以进行取余运算
a++;//执行完后 先自增,后赋值
++b;//先自增再赋值
}
位运算符
- ~ --取反
- & --按位与
- | --按位或
- ^ --按位异或
- << : 左移运算符
- >>:右移运算符
- 笔试可能会考:
- 右移一位相当于除2取商
- 左移一位相当于乘2
public static void main(String[] args){
int b = 3<<1;//左移一位 相当于乘2 3✖2
int a = 3<<2;//左移两位 相当与乘2乘2 3✖2✖2
int c = 4>>2;//右移两位 相当与除2除2 4➗2➗2
}
字符串连接符
- “+”运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接。
三目运算符
- 三目运算符,语法格式:
- x?y:z
- 其中x为boolean类型表达式,先计算x的值,若为true,则整个三目运算的结果为表达式y的值,否则整个运算结果为表达式z的值。
- 经常用来代替简单的if-else判断
控制语句
public static void main(String[] args){
double d = Math.random();//随机数 返回随机小数
int e = (int)d*5;//0~4的小数
int r = 1 + (int)d*6;//1-6的整数
Math.random()*6+1;//1-6的整数
}
swirch多值选择结构
switch语句会根据表达式的值从相匹配的执行,一直执行到break标签处开始ak语句处或者是switch语句的末尾。与任一case值不匹配,则进入default语句(如果有的话)
使用Scanner获取键盘输入
public static void main(String[] args){
//获取键盘输入
Scanner sc = new Scanner(System.in);
String name = sc.netxLine();
int age = sc.netxInt();
}
while循环结构
//先判断 后执行
while (布尔表达式) {
循环体;
}
- 在循环开始时,会计算一次“布尔表达式”的值,若条件为真,执行循环体,而对于后来每一次额外的循环,都会在开始前重新计算一次。
- 语句中应有循环趋向于结束的语句,否则会出现无限循环–“死循环”
//先执行 后判断
do{
循环体
}while(布尔表达式);
for循环
for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构。
public static void main(String[] args){
int sum = 0;
for(int i = 1; i <=100; i++){
sum += i;
}
System.out.println(sum);
/*
1.执行初始化语句:i=1
2.判断i<=100
3.执行循环体
4.步进迭代:i++
5.回到第二步继续判断
*/
for(int i = 1, j = i+10;i<5;i++,j=i*2){
System.out.println(i+j);
}
/*无限循环 死循环*/
for(;;){}
while(true){}
}
方法
方法就是一段用来完成特定功能的代码片段,类似于其它语言的函数。
方法声明格式:
[修饰符1 修饰符2 ...] 返回值类型 方法名(形式参数列表){
java语句:----
}
方法的调用方式:
对象名.方法名(实参列表)
方法的详细说明
- 形式参数:在方法声明时用于接收外界传入的数据。
- 实参:调用方法时实际传给方法的数据。
- 返回值:方法在执行完毕后返回给调用它的环境的数据。
- 返回值类型:事先约定的返回值的数据类型,如无返回值,必须显示指定为void
注意事项:
- 实参的数目、数据类型和次序必须和所调用的方法声明的形式参数列表匹配。
- return 语句终止方法的运行并指定要返回的数据,
- Java中进行方法调用中传递参数时,遵循值传递的原则(传递的都是数据的副本)。
- 基本类型传递的是该数据值得copy值。
- 引用类型传递是该对象引用的copy值,但指向的时同一个对象。
方法的重载(overload)
重载的方法,实际是完全不同的方法,只是名称相同而已。
构成方法重载的条件:
- 不同的含义:形参类型,形参个数,形参顺序不同
- 只有返回值不同不构成方法的重载。
- 只有形参的名称不同,不构成方法的重载。
递归结构
递归基本思想就是“自己调自己”
public static void main(String[] args){
}
static int count = 0;
static void a(){
count++;
if(count<10)
a();
else
return;
}
阶乘
/*阶乘 n*(n-1)*/
@Test
public void test2() {
System.out.println(TestFB.jiecheng(3));
}
public static long jiecheng(int n) {
if (n<=1) {
return 1;
}else {
return n*jiecheng(n-1);
}
}
递归的缺陷
简单的程序是递归的优点之一。但是递归调用会占用大量的系统堆栈,内存耗用多,在递归调用层次比较躲时速度要比循环慢的多,所以在使用递归时要慎重。
注意事项:
任何能用递归解决的问题能使用迭代解决,当递归方法可以更加自然地反映问题,并且易于理解和调试,并且不强调效率问题时,可以采用递归。
在要求高性能的情况下尽量避免使用递归,递归调用既花费时间又耗费内存。
/*循环语句完成阶乘运算*/
public static long jiecheng2(int n) {
long sum = 1;
for (int i = 1; i <= n; i++) {
sum = i*sum;
}
return sum;
}