Java基础语法
1.标识符
标识符应该以字符字母(az,AZ)、美元符号($)、下划线(_)开头。
后面的字符可以是字符字母(az,AZ)、美元符号($)、下划线(_)、数字的任意组合
String name;
String Name;
String _name;
String $name;
String 1Name; //错误的格式
注意事项:
- 标识符区分大小写;
- 不能用Java中的关键字作为标识符;
2.数据类型
整体分为两大类型,基础类型和引用类型
基础类型包括:byte、short、int、long、char、float、double、boolean
引用类型包括:类、接口、数组
图示如下:
需要注意的点:
- 整数默认类型为int,浮点数默认类型为double;
- long类型的变量初始化时必须在数值后面加上大写L或者小写l表示这是一个long类型数据,但最好使用大写字母表示;
- float类型的变量初始化时必须在数值后面加上大写F或者小写f表示这是一个float类型数据,但最好使用大写字母表示;
- double类型的变量初始化时可以在数值后面加上大写D或者小写d表示这是一个double类型数据,但最好使用大写字母表示;
3.二进制、八进制、十六进制表示
进制 | 数值之前的前缀 | 每一位的数值范围 | 示例 |
---|---|---|---|
二进制 | 0B/0b | 0或者1 | 0b1011(对应十进制的11) |
八进制 | 0 | 0~7 | 074(对应十进制的60) |
十六进制 | 0X/0x | 0~15,大于9用a~f或者A~F表示 | 0xff(对应十进制的255) |
4.浮点数的舍入误差问题(初步了解)
浮点数存在四舍五入的情况,所以存在舍入误差问题,具体见下面的例子:
float price = 35023509275092750f;
float price2 = price + 1;
System.out.println(price == price2); //true
输出结果为真,但是两个变量的数值应该不相同,这是因为浮点数进行了四舍五入,导致数值相同
5.类型转换
Java中的类型转换有两种,隐式类型转换和显式类型转换
隐式类型转换由编译器自动转换,适用于将低精度数据转换为高精度数据,如int转换为float等;
而显式类型转换需要手动转换,在需要转换的数据前加一个括号,括号内指定要转换的类型,适用于将高精度数据转换为低精度数据,如double转换为int;
数据精度从低到高为:
byte < short < int < long < float < double
示例如下:
int num = 12;
double num2 = num; //12.0:隐式类型转换
int num3 = (int)num2; //12:显式类型转换
需要注意的点
- 类型转换可能会出现精度丢失,比如将float型数据转换为int型数据,就会丢失小数点后面的数值;
- 不同类型之间的转换可能会存在数据溢出的问题,比如将128赋值给byte型数据,byte只有一个字节大小,表示的范围是-128~127,所以会溢出,最终的转换结果为-128;
- char类型本身也是一种数值类型,尽管表现为字符形式,但是char类型可以隐式转换为int、long、float、double;
6.变量和常量
a.变量
a-1.定义变量
类型名 变量名 = 初始值;
int num = 1024;
a-2.变量的类型
变量分为三种:局部变量、实例变量(成员变量)、类变量(静态变量)
局部变量存在于块内,出了块这个作用域就会被栈回收,生命周期随作用域;
实例变量是类中的成员变量,当类实例化一个对象时,实例变量被创建,当类对象销毁时,实例变量也被回收,生命周期随实例化的类对象;
类变量是用static关键字修饰的类成员变量,被这个类实例化后的多个对象共享,随着类的加载而创建,随着类的消失而消失。
a-3.变量的命名规范
驼峰原则:每个单词的首字母大写
- 类成员变量和局部变量:首字母小写和驼峰原则
如:String stuNo; - 常量:大写字母和下划线
如:final int MAX_VALUE = 1024; - 类名:首字母大写和驼峰原则
如:public class StudentClass{} - 方法名:首字母小写和驼峰原则
如:public void doTask(){}
b.常量
在定义变量时用final关键字修饰就会变为常量,常量的值不能修改
示例:
final int num = 1024;
num = 500; //error
7.运算符
运算符类型 | 常见的运算符 |
---|---|
算术运算符 | +、 -、 *、 / 、%、 ++(自增) 、--(自减) |
赋值运算符 | = |
关系运算符 | > 、 < 、 ==、 !=、>=、<= |
逻辑运算符 | &&(与)、||(或)、!(非) |
位运算符 | &(按位与)、|(按位或)、^(异或)、~(取反)、<<(左移)、>>(右移) |
条件运算符 | ?:(三目运算符) |
扩展赋值运算符 | +=、 -=、 *=、 /= 、%= |
7.1.前置++和后置++的区别
前置++是将++放在了变量的前面,是一种先加1后赋值的操作;
后置++是将++放在了变量的后面,是一种先赋值后+1的操作。
两种运算最后产生的结构都是让变量的值+1。
同理前置–和后置–也是如此;
7.2.三目运算符
条件X ?a : b;
条件X为true执行a,为false执行b
8.String和基本类型之间的转换
8.1 基本类型转String
基本数据类型+"" 就可以将基本类型转为String
double num = 10;
String str = num + "";
8.2 String类型转基本类型
使用基本类型对应的包装类进行转换,但是字符串的格式不正确会抛出异常
示例:
String str = "65";
int num = Integer.parseInt(str);
double num2 = Double.parseDouble(str);
float num3 = Float.parseFloat(str);
//String str2 = "hello";
//error
//int num4 = Integer.parseInt(str2);
9.接收控制台输入和输出
9.1 输入
Scanner类是一个专门用来进行输入的类,类似于C++中的cin
a.使用之前需要先定义一个Scanner对象,具体语句如下:
//实例化对象
Scanner scanner = new Scanner(System.in);
b.定义好对象之后使用对象的next或者nextLine方法接收数据并将其赋值给变量,示例如下:
//获取输入并存储到input中
String input = scanner.next();
c.使用结束之后关闭流对象
scanner.close();
常见的Scanner成员函数
函数名 | 函数功能 |
---|---|
next | 获取字符串输入,遇见回车和空格结束 |
hasNext | 判断是否存在下一个字符串输入,存在返回true,否则返回false |
nextLine | 获取字符串输入,遇见回车结束 |
hasNextLine | 判断是否存在下一个字符串输入 |
nextInt | 获取int型数据输入,遇见回车和空格结束 |
hasNextInt | 判断是否存在下一个int型数据输入 |
nextFloat | 获取float型数据输入,遇见回车和空格结束 |
hasNextFloat | 判断是否存在下一个float型数据输入 |
nextDouble | 获取double型数据输入,遇见回车和空格结束 |
hasNextDouble | 判断是否存在下一个double型数据输入 |
9.2 输出
System.out.print(数据):打印但不会换行;
System.out.println(数据):打印并且会换行;
System.out.prinf(数据格式,数据参数):打印但不会换行;
示例:
//按照%d格式输出
System.out.printf("%d", 123);
//按照%s格式输出
System.out.printf("%s", "hello");
//输出并换行
System.out.println("this is a book");
//输出且不换行
System.out.print("that is a ");
System.out.print("pencil box");