目录
引用类型:所有的引用类型都可以赋值为一个null值,但是代表什么都没有
9.数字和字符的对照关系(编码表ASCII和Unicode)
1.注释
// 行注释
/* */ 多行注释
/** */可以用来自动生成文档
2.语法解释
public class helloword{
public static void main(String[] args){
System.out.println("hello world");
}
}
第一行:public class 后面代表定义一个类的名称,类是java源代码中的基本组织单位
第二行:固定写法,代表main方法,表示程序执行的起点
第三行:System.out.println表示打印输出语句
3.关键字(格式全小写)
特点:(1)完全小写的字母;(2)在增强版的记事本中(例如notepad++)有特殊颜色
4.标识符(名字)
定义:程序中,定义的类的名字、方法的名字等等都是标识符
命名规则:可以包含英文大小写字母、0-9数字、$、_下划线。但是不能以数字开头,同时标识符也不能是关键字,不能和关键字重复。
命名规范:(1)类名规范使用大驼峰式:首字母大写后面每个单词首字母都是大写;(2)变量名规范使用小驼峰:首字母小写后面每个单词首字母都大写;(3)方法名规范也是用小驼峰。
5.常量
定义:在程序运行期间,固定不变的量。
分类(1)字符串常量:凡是用双引号的部分称为字符串常量。(2)整数常量,直接写上的数字没有小数点。(3)浮点数常量:直接写上的数字,有小数点。(4)字符常量:凡是用单引号引起的单个字符(有且只有一个字符,不能是串,也不能为空字符),就叫做字符常量。(5)布尔常量:只有两种取值true和false。(6)空常量:null,代表没有任何数据。
6.数据类型
大致分为基本数据类型和引用数据类型。
基本数据类型:四类八种数据类型
整数型:byte(1个字节) short(2个字节) int(默认,4个字节) long(8个字节)
浮点型:float(4个字节) double(默认,8个字节)
字符型:char(2个字节)
布尔型:boolean(1个字节)
引用类型:所有的引用类型都可以赋值为一个null值,但是代表什么都没有
字符串:String
数组:int[] char[] long[] byte[] float[]等
类:public class ClassName
接口:接口
Lambda:函数式编程
注意:(1)字符串不是基本数据类型,而是引用类型。(2)浮点数可能只是一个近似值,不是一个精确数。(3)数据范围与字节数不一定相关,例如float数据范围比long更加广泛,而long是8字节。 (4)浮点数默认类型是double,如果一定要使用float类型,需要加入后缀F;如果是整数,默认是int类型,如果一定要使用long类型,需要加上一个后缀L;都推荐使用大写字母后缀。
7.变量
定义:程序运行期间,内容可以发生改变的量。
创建一个变量并且使用的格式:数据类型 变量名称 = 数据值 // 在创建一个变量的同时,初始化值。
注意:
(1)变量名不可重复
(2)对于float和long类型来说,字母后缀F和L不能丢掉。
(3)如果使用byte和short数据类型的变量,那么右侧的数值范围不能超过左侧类型的范围。
(4)没有进行赋值的变量不能直接使用,一定要赋值之后才能使用。
(5)变量不能超出作用域范围。作用域:从定义变量的一行开始,一直到所属的大括号结束为止。
(6)可以通过一条语句创建多个变量,但是一般情况不推荐这么写。
8.数据类型转换
当数据类型不一样时,会发生数据类型转换,有自动类型转换(隐式)和强制类型转变换(显式)。
自动类型转换
(1)特点:代码不需要处理,自动完成。(2)规则:数据范围从小到大
示例:float n = 421L; // 左边是float类型,右边是long类型,不一致;long--->float,符合数据范围从小到大的要求,这一行发生了数据自动转换,成功。
强制数据转换
(1)特点:代码需要特殊的格式处理,不能自动完成。(2)格式:范围小的类型 范围小的变量名 = (范围小的变量名)原本范围大的数据
实例:int num = 100L; // 左边是int类型,右边是long类型,不一致; long--->int,不是从小到大,不能发生自动类型转换,会报错。
int num = (int) 100L; // 不会报错,强制转换成功。
注意:
(1)强制类转换一般不推荐使用,因为有可能发生精度损失、数据溢出。
(2)byte、short、char这三种数据类型可发生数学运算,例如加法。
(3)byte、short、char这三种数据类型在运算的时候,都会被首先提升成int类型,然后再计算,也就是说运算结果都变为int类型,byte + byte- ->int,short + short- ->int,byte + short- ->int,char + char --> int 等。
编译器的优化
(1)对于byte/short/char三种数据类型,如果右侧赋值的数值没有超过范围,那么javac编译器会自动隐含的补上(byte)(short)(char);如果右侧数值超过范围那么编译器报错。
(2)再给变量赋值的时候,如果右侧的表达式全都是常量,没有任何变量,那么编译器Javac将会直接将若干个常量表达式计算得到结果。例如short result = 5+8;等号右边全是常量,没有任何变量参与运算,在编译之后得到的.class字节码文件当中相当于【直接就是】:short result=13;右侧的常量运算结果数据,没有超过左侧范围,所以正确。这称为“编译器的常量优化”,但是注意:一旦表达式中有变量参与,就不能进行这种优化了。
public class Demo2Operator{
public static void main(String[] args){
byte a=8;
byte b=5; // 即使右边的数字5默认是int类型,但是没有超过byte数据范围,所以编译器会进行优化,隐式的添加强制转换。
byte c=128; // 报错,因为数值超过了byte的数据范围,编译器报错。
byte result1=8+5; // 得到的是13,因为时常量数值的直接相加
byte result2=a+b; // 报错,因为byte类型运算会直接提升为int类型,这里没有强制转换。
}
}
9.数字和字符的对照关系(编码表ASCII和Unicode)
ASCII码表:American Standard Code for Information Interchange 美国信息交换标准代码
Unicode码表:万国码,也是数字和符号的对应关系,开头0~127部分和ASCII码一样,但是从128开始包含更多字符。
几个特殊的码:48-‘0’,65-‘A',97-‘a’
10.运算符
运算符:进行待定操作代的符号,例如+
表达式:用运算符连起来的式子叫做表达式,例如20+5
(1)算术运算符:+、-、*、/、++、--、%
除法/:对于整数表达数来说,整数除以整数,结果仍是整数,只看商,不看余数。
取模%:只有对于整数除法来说,取模运算才有意义。
注意:一旦运算中有不同类型的数,那么结果将会是数据类型范围大的那种,eg:int+double---->double+double--->double,但是不要忘记byte/short/char在运算的时候都会自动提升为int。
加号“+”常见的三种用法:(1)对于数值来说,就是加法。(2)对于字符类型char来说,在计算之前,char会被提升为int,然后再计算。char类型字符和int类型数字之间的关系表:ASCII和Unicode。(3)对于字符串String(首字母大写,并不是关键字)来说,加号代表字符串的连接操作。任何数据类型和字符串进行连接时,结果都会变成字符串。eg: String tt="hello"; System.out.println(tt+20); // hello20 System.out.println(tt+20+30); // hello2030 System.out.println(tt+(20+30)); // hello50
自增/自减运算符:写在变量名称之前或者之后,eg:++num或者num++
使用方式:(1)单独使用,不和其他任何操作混合,自己独立成为一个步骤。(2)混合使用,和其它操作混合,例如与赋值混合或者打印操作混合等。
使用区别:
(1)在单独使用时,前++和后++没有任何区别。
(2)混合使用时,<1>如果是前++,那么这个变量立刻加1,然后拿着结果进行使用。【先加后用】<2>如果是后++,那么首先使用这个变量本来的数值,然后再让变量加1。【先用后加】
注意:
1.只有变量才能使用自增自减运算符,常量不可发生改变,所以不可用。
2.int和double变量都可以使用自增自减运算。
public class DemoOperator{
public static void main(String[] args){
//与打印操作混合使用
// 混合使用,前++,先加后用
int m=10;
System.out.println(++m); //11
System.out.println(m); //11
System.out.println("----------------------------");
// 混合使用,后++,先用后加
int n=30;
System.out.println(n++); // 30
System.out.println(n); // 31
System.out.println("----------------------------");
//与赋值操作混合使用
// 前--,先减后用
int num1 = 40;
int result1 = --num1;
System.out.println(result1); // 39
System.out.println(num1); // 39
System.out.println("----------------------------");
// 后--。先用后减
int num2=50;
int result2=num2--;
System.out.println(result2); // 50
System.out.println(num2); // 49
int x=10;
int y=20;
int result3=++x + y--;
System.out.println(result3); // 31
System.out.println(x); // 11
System.out.println(y); // 19
}
}
(2)赋值运算符(=,+=,-=,*=,/=,%=)
基本运算符和复合运算符
基本运算符:就是一个等号“=”,代表将右侧数据赋值给左侧变量
复合运算符:+=,-=,*=,/=,%=
注意:(1)只有变量才能使用赋值运算符,常量不能使用。(2)复合运算符其中隐含了一个强制类型转换。
public class Demo1Operator{
public static void main(String[] args){
byte num = 8;
/*
num = num +1
num = byte + int
num = int + int
num = int
num = (byte)int
*/
num +=1;
System.out.println(num); // 9
}
}
(3)比较运算符(==,>, <, >=, <=, !=)
注意:
(1)比较运算符,是两个数据之间进行比较的运算,运算结果都是布尔值true或者false。
(2)如果进行多次判断,不能连这写。数学中有这种写法如1<x<3,但是程序中不允许这种写法,编译报错,所以要拆开,使用逻辑运算符连接拆开的判断式子。
(4)逻辑运算符(&&, ||, !)
注意:
(1)&&和||具有短路效果:如果根据左边已经可以判断得到最终结果,那么右边的代码将【不再执行】,从而节省一定的性能。
(2)逻辑运算符只能用于Boolean值。
(3)与、或需要左右各一个Boolean值,但是取反只要有唯一的Boolean值即可。
(4)与,或这两种运算符,如果有多个条件,可以连续写。对于1<x<3的情况应该拆开两个部分,然后使用与运算符连接起来,int x=2; 1<x&&x<3;
(5)三元运算符(讲述一元,二元,三元运算符)
一元运算符:只需要一个数据就能操作的运算符,例如:取反,自增,自减。
二元运算符:需要2个数据就能操作的运算符,例如:加法,赋值。
三元运算符:需要3个数据就能操作的运算符,二者选其一。
格式:数据类型 变量名称 = 条件判断 ? 表达式A:表达式B;
流程:首先判断条件是否成立,如果成立为true,那么将表达式A的值赋值给左侧的变量;如果不成立为false,那么将表达式B的值赋值给左侧的变量。
注意(1)必须同时保证表达式A和表达式B都符合左侧数据类型的要求。(2)三元运算符的结果必须使用。
(6)位运算符
按位模式:&(按位与), |(按位或), ^(按位异或xor), ~(按位非)
按位移动:>>,<<, >>>
11.运算符优先级
12.方法
定义一个方法的格式:public static void 方法名称() { 方法体;} (实际上这是一个静态方法)
注意:
(1)方法定义的先后顺序无所谓。
(2)方法应该定义在类当中,但是不能在方法中再定义方法,不能产生嵌套包含关系。
(3)方法定义好了之后不会执行,如果要执行一定要进行方法的调用:以下三种调用的一种。
(4)如果方法有返回值,那么必须写上return 返回值,不能没有;同时,return后面返回的数据,必须和方法的返回值类型对应起来。
(5)对于一个void没有返回值的方法,可以写return也可以省略return,但是不能写return后面的返回值,只能写return。
定义方法的完整格式:
修饰符 返回值类型 方法名称(参数类型 参数名称,......){
方法体;
return 返回值;
}
修饰符:现阶段的固定写法 public static。
返回值类型:方法最终产生的数据结果是什么类型。
方法名称:方法的名字和变量的规范一样,使用小驼峰。
参数类型:进入方法的数据是什么类型。
参数名称:进入方法的数据对应的变量名称。 参数如果有多个使用逗号分隔。
方法体:方法要做的事情,若干行。
return:两个作用,第一停止当前方法,第二将后面的返回值还给调用处。
返回值:方法执行后最终产生的数据结果。必须要和方法名称前面的返回值类型保持对应。
定义方法的三要素:返回值类型,方法名称,参数列表。
方法的三种调用格式:
1.单独调用:方法名称(参数);注意返回值类型为void,这种方法只能够单独调用,不能进行打印调用和赋值调用。
2.打印调用:System.out.println(方法名称)(参数))
3.赋值调用 :数据类型 变量名称=方法名称(参数)
注意:
(1)对于有返回值的方法,上述三种调用都可以;但是对于无返回值的方法,只能使用单独调用。
(2)一个方法可以有0,1,多个参数;但是只能有0或者1个返回值,不能有多个返回值。如果希望一个方法中产生多个数据需要被返回,解决方案是使用一个数组作为返回值类型即可。
(3)任何数据类型都可以作为方法的参数类型或者返回值类型。
13.方法重载
对于功能类似的方法来说,因为参数列表不一样,却需要定义不同的方法名称,太麻烦。
定义:多个方法的名称一样,但是参数列表不一样。
优点:只需要记住唯一一个方法名称,就可以实现类似的多个功能。
方法重载和下列因素有关:(1)参数个数不同。(2)参数类型不同。(3)参数的多类型顺序不同。
方法重载和下列因素无关:(1)与参数名称无关。(2)与参数的返回值类型无关。
例子: