标识符
1、在Java语言中,对各种变量,方法和类等要素命名时所使用的字符序列就是标识符。这些标识符有JDK定义好的,也有我们自己开发时候需要定义的。
2、Java中标识符由26个英文字符大小写,数字0-9,符号_ $。注意:数字不能开头。
3、Java中是严格区分大小写。
4、在实际写程序的过程中定义标识符遵守“见名之意”。
标识符代码规范:
-
类名和接口的规范:在上面的约束的命名规范的情况下,首字符要大写。如果由多个单词构成每个单词的首字符都大写。
XxxYyy 如:PersonService
-
变量名和方法名:在上面的约束的命名规范的情况下,我们遵守单词首字符不要大写,如果由多个单词构成,从第二个单词起首字符都大写。这叫驼峰模式。
xxxYyyZzz 如:personDao
-
包名:在上面的约束的命名规范的情况下,都小写。
xxx.yyy.zzz
-
常量:所有字符都大写,多个单词之间使用下划线来分隔。
XXX_YYY_ZZZ
关键字
JDK定义的标识符就是关键字,我们不可以使用。所以定义标识符的时候一定要避开关键字。
Java保留字:现有Java版本尚未使用,但以后版本可能会作为关键字使用。
byValue、cast、future、generic、inner、operator、outer、rest、var、goto、const
Java中的注释
注释就是给程序说明的作用,我们要养成写注释的良好习惯,增强代码的可读性。JVM运行时注释不会被解析。JVM会跳过注释。
-
单行注释语法:
//
,注释代码中的一行,建议大家放在要注释的代码的上面。 -
多行注释:
/* */
,通常用于方法内的多行或者类的多行注释。 -
文档注释:语法
/** */
,用于类的说明和方法的说明。
//注释内容
/*
注释内容
注释内容
*/
/**文档注释*/
/**
* @author java
* @version 1.0
**/
变量和常量
程序运行过程:
1、开辟内存空间(创建JVM)。
2、加载数据。
3、CPU提取数据运行当数据加载到内存中时,我们按着运行期数据的是否变化把数据分成常量和变量。
常量:数据不发生变化的量。
例如:
整数常量:24小时,一周7天,一年12月
小数:重力系数9.8, 圆周率,3.14
字符串常量:“旺财”, “小强”
字符常量:‘男’,‘a’
布尔常量:true,false
空常量:null
变量:程序运行期间可以发成变化的数据。
变量的定义需要进行定义变量名字,而且还要定义变量的存储空间,而且还可以定义存储的数据类型。变量中的数据能发生变化。
常量的定义需要进行定义常量名字,而且还要定义常量的存储空间,而且还可以定义存储的数据类型。常量中的数据不能发生变化。
数据类型
Java是强类型语言,在定义变量前需要声明数据类型。在Java中主要分为两种数据类型:基本数据类型和引用数据类型。
基本数据类型:根据不同的数据类型可以划分内存的存储的空间大小,不同的类型就是数据类型,一共8种基本数据类型。
八位二进制位组成一个字节,一个字节表示的范围:-128 到 127。
整数类型
数值类型中最常用的类型就是int,其次是long。
小数类型/浮点类型
布尔数据类型boolean,只有 true、false两个值。占用1字节。
引用数据类型
Java中的引用数据类型主要包含类、接口和数组等。
String类型是引用数据类型,它是Java提供的一个类。
字符类型(char)
字符数据类型char:2字节,采用Unicode码。如:‘a‘。
字符类型本质
-
字符型存储到计算机中,需要将字符对应的码值(整数)找出来,比如’a’
存储:‘a’ → 码值97 → 二进制(110 0001) → 存储。读取:二进制(110 0001) → 97 → ‘a’ → 显示。 -
字符和码值的对应关系是通过字符编码表决定的(是规定好的)
字符编码表
-
ASCII (ASCII编码表一个字节表示,一个128个字符,实际上一个字节可以表示256个字符,只用128个)
-
Unicode(Unicode编码表固定大小的编码使用两个字节来表示字符,字母和汉字统一都是占用两个字节,这样浪费空间)
-
utf-8(编码表,大小可变的编码字母使用1个字节,汉字使用3个字节)
-
gbk(可以表示汉字,而且范围广,字母使用1个字节,汉字2个字节)
-
gb2312(可以表示汉字,gb2312<gbk)
-
big5码(繁体中文,台湾,香港)
ASCII码
1、ASCII码:上个世纪60年代,美国制定了一套字符编码(使用一个字节),对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码
。
2、ASCII码一共规定了128个字符的编码,只占用了一个字节的后面7位,最前面的1位统一规定为0特别提示:一个字节可以表示256个字符,ASCII码只用了128个字符。
3、缺点:不能表示所有字符。
Unicode编码
1、Unicode的好处:一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,使用Unicode没有乱码的问题。
2、 Unicode的缺点:一个英文字母和一个汉字都占用2个字节,这对于存储空间来说是浪费。
3、2的16次方是65536,所以最多编码是65536个字符。
4、编码0-127的字符是与ASCII的编码一样,比如’a’在ASCII码是0x61,在unicode码是ox0061,都对应97。因此Unicode码兼容ASCII码。
UTF-8
1、UTF-8是在互联网上使用最广的一种 Unicode 的实现方式(改进)
2、UTF-8是一种变长的编码方式。它可以使用1-6个字节表示一个符号,根据不同的符号而变化字节长度。
3、使用大小可变的编码字母占1个字节,汉字占3个字节
变量定义
语法:数据类型 变量名 = 值;
我们对变量的操作:取值和存值。
变量的定义位置:定义在方法中或者语句块中。
int age = 5;
double height = 172.5;
变量的一定要赋初始值,否则使用该变量的时候会报错的。
变量名不能重复变量的作用范围:只在当前的大括号内有效(包括子括号),大括号外的所有程序不能使用该变量,所以这种变量也称为局部变量。
基本数据类型的默认值
这八种数据类型是有默认值的。这个默认值如果在变量中不能使用的,必须是在类的属性中使用,因为类的属性可以不赋初始化值。
基本数据类型的转换
自动类型转换
基本数据类型在计算的时候都会向数值范围大的方向转换。byte → short/char → int → long → float → double
1、所有的byte类型和short类型和char值运算的时候都会提供成int类型,int最大值为2147483647。
2、如果计算中一个操作数据类型是long,另一个数的空间小于等于long,那么结果就是long。
3、如果计算中一个操作数据类型是float,另一个数的空间小于等于float,那么结果就是float。
4、如果计算中一个操作数据类型是double,另一个数的空间小于等于double,那么结果就是double。
强制类型转换
当大容量类型的变量向小容量的类型去转换需要强制转换。语法:(目标类型)值。
byte b1 = 3,b2=4, b;
b = b1 + b2;//报错,因为byte类型计算完毕后会自动提升为int类型。
b= 4+3;//不会报错,因为int类型的常量相加只要没有达到byte的上限就可以。
//变量命名、自动类型转换
public static void main(String[] args) {
//定义一个字节类型
byte b = 1;
//基本数据类型在计算的时候, 数值常量默认是int
int b1 = b + 1;
short b2 = 12;
//byte, short , int, char, 四种类型只要是发生计算都会自动的把结果提升成int类型
int b3 = b + b2;
//定义一个char类型, 字符和int类型可以自动的转换
char c = 'a';
//int i2 = c;
int i1 = c + 1;
System.out.println(i1);
//如果两个int类型计算会不会自动的提升类型呢
int x = 2147483647;
int y = 12;
//int long float, double自身来计算的时候没有类型的提升,如果超出范围就会出现精度的损失
int z = x + y;
System.out.println(z);
//int long float, double 不同的类型来计算的时候没有类型的会向大的表数范围提升、
float f = 1.3f;
//int类型和float类型计算转换成float
float f1 = f + y;
//小数的常量的默认值是double
double d = f + 1.3;
// 12.5f表示float类型常量,小的表数范围的常量或者变量可以自动的向大的表数范围的类型转换
double d1 = 12.5f;
double d2 = y;
short s = 5;
//大的表数范围的值不能自动的赋值小的表数范围的变量
s = s + 5;
}
//强制转换
public static void main(String[] args){
int i = 999;
//数值类型的转换的前提是精度不会损失
byte b = (byte)i;
System.out.println(b);
//定义long类型
long l = 10000;
int j = (int)l;
System.out.println(j);
//小数类型的强转
float f = 199.5f;
//转换成int, 小数转换成整数,就是把小数去掉
short i1 = (short)f;
System.out.println(i1);
//double向float转换
double d = 10.4;
float f1 = (float)d;
System.out.println(f1);
//字符 的转换
char c = 'a';
int x = c;
System.out.println(x);
int y = 98;
char c1 = (char)y;
System.out.println(c1);
}
基本数据类型和String类型的转换
基本类型转String类型:将基本类型的值+""即可。
String类型转基本数据类型:通过基本类型的包装类调用parseXX()方法即可。
Integer.parseInt("123");
Double.parseDouble("123.1");
Float.parseFloat("123.45");
Short.parseShort("12");
Long.parseLong("12345");
Boolean.parseBoolean("true");
Byte.parseByte("12");
//字符串转换为字符char,把字符串的第一个字符得到:"123".charAt(0)
运算符
运算符就是告诉程序执行特定的运算操作的符号。Java中提供了6类运算符。分别是算术运算符、 赋值运算符、关系运算符、逻辑运算符、位运算符和条件运算符。
算数运算符
//四则运算:+,-,*,/;取余:%
//%的本质:a%b=a-a/b*b
//定义两个整数类型变量
int a = 10;
int b = 3;
//+,-,*,/ %
int c = a + b;
System.out.println("a + b = "+ c);
int d = a - b;
System.out.println("a - b = "+ d);
int e = a * b;
System.out.println("a * b = "+ e);
//int直接做除法是整除
int f = a / b;
System.out.println("a / b = "+ f);
float f1 = 10.0f;
//由于f1是float类型b是int类型, 在做计算的时候类型做了提升
float f2 = f1 / b;
System.out.println("f1 / b = "+ f2);
//取余数
int g = a % b;
System.out.println("a % b = "+g);
++、--
:给数值变量自身加1或减一
i++:先进行表达式运算,再加一。++i:先加一,再进行表达式运算
//i++ 先赋值在运算,例如 a=i++,先赋值a=i,后运算i=i+1
//++i 先运算在赋值,例如 a=++i,先运算i=i+1,后赋值a=i
int a = 1;
int b = 2;
// 1 * 3 + 1 * 3
int c = (a++) * (++b) + (--a)*(b++);
//运算的值 a++:1 ++b:3 --a:1 b++:3
//自己的值 a:2 b:3 a:1 b:4
System.out.println("a = "+a); //1
System.out.println("b = "+b); //4
System.out.println("c = "+c); //6
赋值运算符
=:将左边的数值赋给右边的变量。+=:int x = 2;x+=3;相当于x=x+3
关系运算符(比较运算符)
== 等于,!= 不等于,> 大于,>= 大于等于,< 小于,<= 小于等于
,逻辑运算符:&、|、!
应用场景:如果某个结果需要多个条件满足或者部分条件满足的判断时使用。
&: 用于连接多个表达式的判断,true&true=true,&两边的表达式都要参与计算。多个表达式在计算的时候&与(每一个表达式的计算结果都是true的情况下),整体结果是true。
|:用于连接多个表达式的判断,false|false=false, &两边的表达式都要参与计算,多个表达式在计算的时候|或(每一个表达式的计算结果只要有一个表达式是true的情况下),整体结果是true。
短路逻辑(效率高)
&&:用于连接多个表达式的判断, true&&true=true,如果第一个表达式能决定整个表达式的结果第二个表达式就不计算了。
||:用于连接多个表达式的判断, false||false=false,如果第一个表达式能决定整个表达式的结果第二个表达式就不计算了。
!:取反
条件运算符(又称三目运算符或三元运算符):是Java中唯一一个需要三个操作数的运算符。
语法格式:条件?表达式1:表达式2
首先进行条件的判断,如果结果为true,则返回表达式1的值,如果结果为false,返回表达式2的值。
int min;
min = 5<7?5:7;
System.out.println(min);//5
进制
进制介绍
对于整数,有四种表示方式:
1、二进制:0、1,满2进1。以0b或0B开头。如0b1010。
2、十进制:0-9,满10进1。如1010。
3、八进制:0-7,满8进1,以数字0开头表示。如01010。
4、十六进制:0-9及A(10)-F(15),满16进1,以0x或0X开头表示。此处的A-F不区分大小写。如0x10101。
进制转换
其它进制转换成十进制规则:从最低位(右边)开始,将每个位上的数提取出来,乘以n的(位数-1)次方,然后求和。
0b1011转换十进制的数:1*2^3+1*2+1=11
0234转换为十进制的数:2*8^2+3*8+4=156
十进制转换为其它进制规则:将该数不断除以n,直到商为0为止,然后将每步得到的余数倒过来,就是对应的其它进制。
34转成二进制:0b00100010
237转为16进制:237/6=14...13 0xED
二进制转换为八进制规则:从低位开始,将二进制数每三位一组,转成对应的八进制数即可。
0b11010101:11 010 101→0325
二进制转换为16进制规则:从低位开始,将二进制没四位一组,转成对应的16进制即可。
0b11010101 = 1101 0101→0xD5
八进制转换成二进制规则:将八进制数每一位转成对应的一个3位的二进制即可。
0237 = 0b 010 011 111
16进制转换成二进制规则:将16进制数的每一位,转成对应的4位的一个二进制数即可。
0x23B = 0b 0010 0011 1011
二进制在运算中的说明
现代的电子计算机技术全部采用的是二进制,因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制数来表示的。二进制(Binary)数用0和1两个数字及其组合来表示任何数。进位规则是“逢2进1”,数字1在不同的位上代表不同的值,按从右到左的次序,这个值以2倍递增。
原码、反码、补码
对于有符号的而言:
1、二进制的最高位是符号位:0表示正数,1表示负数
2、正数的原码、反码、补码都一样。
3、负数的反码=它的原码符号位不变,其它位取反。
4、负数的补码=它的反码+1,负数的反码=负数的补码-1
5、0的反码、补码都是0
6、Java没有无符号数,换言之,Java中的数都是有符号的
7、在计算机运算的时候,都是以补码的方式来运算的
8、当我们看运算结果的时候,要看它的原码
位运算符
在学习源码中,发现有大量使用位运算符,这样做的目的是为了节约内存开销和加快计算效率。
位:二进制位简称“位”,是二进制记数系统中表示小于2的整数的符号,一般用1或 0表示,是具有相等概率的两种状态中的一种。二进制位的位数可表示一个机器字的字长,一个二进制位包含的信息量称为一比特。
int类型占4个字节(byte);
一个字节=8bit(位);
一个int类型的数值占32bit(位)
int i = 123;
10进制123转为二进制后等于:1111011
完整补位后:00000000 00000000 00000000 01111011
二进制的最高位为符号位,1代表负数,0代表正数,其余位表示数的绝对值
-123的原码:10000000 00000000 00000000 01111011
反码:正数的反码和原码相同,负数的反码为原码除最高位外取反(0变1,1变0)。
补码:正数的反码和原码相同,负数的补码为原码除最高位外取反+1。
123的原码:00000000 00000000 00000000 01111011
123的反码:00000000 00000000 00000000 01111011
123的补码:00000000 00000000 00000000 01111011
-123的原码:10000000 00000000 00000000 01111011
-123的反码:11111111 11111111 11111111 10000100
-123的补码:11111111 11111111 11111111 10000101
负数的原码到反码是各位取反(这里说的取反就是0变1,1变0)符号位不变。 反码到补码直接+1;
已知补码求解码 最高位如果是1的话(负数),那么除了最高位之外的取反,然后加1得原码。
最高位如果是0的话,不变,正数的补码就是他的原码。
-
&:按位与。当两位同时为1时才返回1。
-
|:按位或。只要有一位为1即可返回1。
-
~:按位非。单目运算符,将操作数的每个位(包括符号位)全部取反。
-
^:按位异或。当两位相同时返回0,不同时返回1。
-
<<:左移运算符。
-
'>>'右移运算符。
-
'>>>'无符号右移运算符位操作对补码进行操作
它们的运算规则是:
-
按位与&:两位全为1,结果为1,否则为0
-
按位或|:两位有一个为1,结果为1,否则为0
-
按位异或^:两位一个为0,一个为1,结果为1,否则为0
-
按位取反~:0→1,1→0
-
算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位
-
算术左移<<:符号位不变,低位补0
-
逻辑右移(无符号右移)>>>:低位溢出,高位补0
public static void main(String[] args) {
//5的补码为:00000101
//6的补码为:00000110
//5&6 00000100
//5|6 00000111
//5^6 00000011
//~5 11111010(补码)--> 10000101+1-->10000110(原码)
System.out.println(5&6);//4
System.out.println(5|6);//7
System.out.println(5^6);//3
System.out.println(~5);//-6
//5的补码为:00000101
//5<<2 0000010100 -->00010100 (20) 本质是5*2*2=20
//5>>3 00000000101-->00000000 (0) 本质是5/2/2/2=0
//5>>>1 000000101 -->00000010(2)
System.out.println(5<<2);//20
System.out.println(5>>3);//0
System.out.println(5>>>1);//2
}
运算符优先级
该表中优先级按照从高到低的顺序书写,也就是优先级为1的优先级最高,优先级14的优先级最低。
结合性是指运算符结合的顺序,通常都是从左到右。从右向左的运算符最典型的就是负号,例如3+-4
,则意义为3加-4,符号首先和运算符右侧的内容结合。
总体而言,优先级顺序为__算术运算符>关系运算符>逻辑运算符__。
字符常量
字符常量 | 说明 |
---|---|
‘A’,‘a’ | 普通字符常量,对应ASCII码表中的数字 |
‘\n’ | 转义字符,表示换行 |
‘\t’ | 转义字符,表示按Tab键 |
‘\b’ | 转义字符,表示按backspace键 |
‘’ | 单引号中两个反斜杠,表示反斜杠 |
‘’’ | 单引号中一个反斜杠+一个单引号,表示单引号 |
‘"’ | 单引号中一个反斜杠+一个双引号,表示双引号 |
public static void main(String[] args) {
System.out.println("12\t12\t12");
//12 12 12
//println 中ln表示换行
//System.out.print()则为不换行打印
}
键盘输入/输出
Scanner类是用于扫描输入文本的应用程序。
使用时必须使用import语句导入Scanner类,即指定Scanner类的位置,它在java.util包下。
使用步骤:
1、导入Scanner类
import java.util.Scanner;
2、创建Scanner对象
Scanner input = new Scanner(System.in);
//System.in代表系统输入
3、获得键盘输入数据
Scanner类常用方法:没有nextChar()。
方法 | 返回值类型 | 说明 |
---|---|---|
next() | String | 获得一个字符串 |
nextInt() | int | 获得一个int型数值 |
nextDouble() | double | 获得一个double型数值 |
nextBoolean() | boolean | 获得一个boolean型数值 |
nextByte() | byte | 获得一个byte型数值 |
nextShort() | short | 获得一个short型数值 |
nextLong() | long | 获得一个long型数值 |
nextFloat() | float | 获得一个float型数值 |
hasNext() | boolean | 判断是否有输入数据,有则返回true;否则返回false |
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
//键盘输入整数并在控制台打印输出
Scanner input = new Scanner(System.in);
System.out.print("请输入一个整数:");
int num= input.nextInt();
System.out.println(num);
//当你输入什么,它打印什么
while (input.hasNext()){
System.out.print(input.next());
}
}
}
评论区