只是根据个人情况的总结,不喜勿喷!!!
一、java标识符
标识符是编程时使用的名字,java中对包、类、接口、方法、变量、常量等命名时使用的字符称为标识符;
命名规则:
1、由字母、数字、"-"、"¥"组成,首字母不能是数字;
2、不能把java关键字作为标识符;
3、没有长度限制;
4、对大小写敏感;
二、关键字
又称保留字,是java语言规定的具有特定含义的标识符。
关键字不能用作变量名、方法名、类名、包名。
附java所有的关键字:
备注:
1、goto和const标识符虽然被定义为关键字,但是从不使用;
2、java中所有关键字一律由小写字母组成;
三、数据类型
数据类型决定了在内存中存储数据的类型以及所需内存的大小;
java中数据类型可以分为两大类:
1、基本数据类型:byte、short、int、long、double、float、boolean、char;
2、引用数据类型:类、接口、数组、枚举、注解
基本数据类型:
整型、浮点型、布尔型、字符型不过多叙述
基本数据类型转换包括:
(1)自动数据转换:将表示范围小的数据类型赋值给范围大的数据类型时,自动转换
顺序为:
byte–short/char–int–long–float–double
(2)强制类型转换:将范围大的变量赋值给范围小的变量,显示转换;
转换格式:(要转换的类型)被转换的值
备注:强制类型转换可能会导致数据精度损失或溢出;
四、变量和常量
1、变量
是java用来申请数据存储空间,并获取或改变存储的值;
变量的命名规则:
(1)必须遵循标识符的命名规则
(2)首字母必须小写,若是多个单词组成,从第二个字母开始首字母大写;
(3)变量名一般是名词;
变量定义的语法:[访问控制符] [修饰符] 数据类型 变量名 [=初始值];
示例:
private static int age;
2、常量
常量有final关键字修饰;不能二次赋值;声明时必须初始化;
定义常量的语法
[访问控制符] [修饰符] final 数据类型 常量名 = 初始值;
示例:
public static final double AGE=12;
3、二者的区别
标识符命名区别:
变量:在符合标识符的前提下,首字母小写,之后每个单词的首字母大写;
常量:在符合标识符的前提下,所有字母大写,多个单词之间用下划线间隔;
值是否可以重新改变:
变量:变量的值可以改变;
常量:常量的值初始化以后不允许再次改变;
是否使用final关键字:
变量:一定没有final关键字;
常量:必须使用final关键字修饰;
是否需要初始化:
变量:只有局部变量在使用前必须赋值(不是初始化);
常量:必须在声明的时候初始化;
五、java运算符
java中支持如下运算符:
算术运算符:+、-、、/、%、++、- -
赋值运算符:=、+=、-=、=、/=等等
位运算符:~、&、|、^
逻辑运算符:!、&&、||
关系运算符:>、<、>=、<=、= = 、!=
移位运算符>>、<<、>>>(无符号右移)
注意:
(1)Java的语法按照运算符两边最高精度保留结果,即如果int类型数据与float类型数据进行运算,结果为float类型。
(2)++、–运算符放在变量前边,则先计算再使用,否则先使用再计算;
(3)声明变量时不允许直接+=以及类似表达;
逻辑运算符:
运算规则:
&&两边同时为true才为true;||一个为true即为true;
而位运算是将数据先转化为二进制数补码形式,再逐位按规则计算。运算规则如下:
按位与&:全1为1,否则为0;
按位或|:全0则0,否则为1;
按位非~:遇1则0,遇0则1;
按位异或^:相同为0,不同为1;
逻辑运算符与位运算符的区别:
逻辑运算符只能针对boolean类型进行逻辑运算,而位运算还可以对数值进行逻辑运算;
逻辑运算符有短路情况,即前面的表达式可以得到最终结果时,后面的表达式将不被执行。
六、流程控制
这部分需要详细介绍的三个关键字可以参考我的一篇远古博客:
七、数组
数组是相同数据类型的数据按照顺序组成的一种引用数据类型。
一维数组的声明:
//指定长度的
int [] scores=new int [3];
System.out.println(scores[0]);
scores[0]=100;
System.out.println(scores[0]);//执行结果0 (换行)100
//穷举
①int [] scores= {55,66,99};
//②int scores=new int[]{55,66,99};
/*②的表达形式等价于int [] scores;
scores=new int[]{55,66,99};*/
一维数组的遍历:
//传统for循环
int [] scores= {99,100,88};
for(int i=0;i<3;i++) {
System.out.println(scores[i]);
}
//for-each循环
for(int score:scores) {//:左边是数据类型+变量名 右边是数组名
System.out.println(score);
}//输出结果就是数组中的元素
二维数组的声明:
//指定长度的:
int [][]grades=new int[3][4];
//此时数组中存的是{{0,0,0,0},{0,0,0,0},{0,0,0,0}}
int[][]grades=new int[3][];//指定了二维数组中有多少一维数组,未指定一维数组中有几个元素,下边只是举个例子;
grades[0]=new int[] {22,66,99};
grades[1]=new int[] {22,66};
grades[2]=new int[] {22,66,99,55};
//上边的表达方式也等价于下边这种
int [] [] grades={{22,66,99},{22,66},{22,66,99,55}}
二维数组的遍历:
//传统for循环:
int[] [] grades;
grades=new int [][] {{22,66,99},{22,66},{22,66,99,55}};
for(int i=0;i<grades.length;i++) {
int [] grade = grades[i];
for(int j=0;j<grade.length;j++) {
System.out.println(grade[j]);
}
}
//for-each循环
for(int []grade:grades) {
for(int g:grade) {
System.out.println(g);
}
}
//两端代码执行的结果都是将数组中的元素遍历得到
值传递与引用传递:
值传递:是指在调用函数时,将实际参数复制,一份传递到函数中;这样即使在函数中对参数进行了修改,不会影响实际参数。
public class Test {
public static void main(String[] args) {
int x=10;
test(x);
System.out.println(x);//输出10
}
public static void test(int y) {
y=0;
}
}
引用传递:是指在调用函数时将实际参数的地址直接传递到函数中,那么函数对于参数的修改,会影响到实际参数;
public class Test {
public static void main(String[] args) {
int [] x= {10};
test(x);
System.out.println(x[0]);//输出0
}
public static void test(int [] y) {
y[0]=0;
}
}
关于数组的排序问题,会在此篇之后再具体叙述,本文中不再过多叙述
八、类与对象
java中的对象是对现实世界中的对象的模拟;而把一组对象中相同的属性和方法抽象到一个java源文件就形成了类;
定义类
语法结构
public class 类名 {
//属性
属性1类型 属性1;
属性2类型 属性2;
…
属性n类型 属性n;
//方法
方法1;
方法2;
…
方法m;
}
类名的命名规则:
1、符合标识符命名规范;
2、类名必须使用英文字母,首字母大写;
3、类名由多个词组合时,每个单词的首字母都要大写;
对象的创建和使用
通过new关键字创建对象。(例如)
Student student = new Student();//创建一个Student类型的对象,将其内存地址赋值给student变量
使用“.”运算符访问对象的属性和方法。
student.属性=值;
student.方法名();
总结一下就是:
类是创建对象的模板,确定对象会有的属性和方法;
类是对象的抽象化,对象是类的具体化;
可以称类为一种数据类型,是相对于对象的数据类型(但因为类中有方法,所以区别于之前提到过的数据类型)
九、方法与方法的重载
方法是用于定义类的某种功能,语法结构如下:
访问控制符 [修饰符] 返回值类型 方法名( [参数] ) {
//方法体
}
示例:
public void sayHello(){
System.out.println("Hello");
}
protected final void show(int x){
System.out.println(x);
}
private static int add(int x, int y){
return x+y;
}
访问控制符
用于限制方法在其他类中的使用范围;
一共有四种:public、protected、友好的(默认不写)和private
修饰符static
用于限制方法的调用方式;主要如下:
static修饰的方法可以直接使用类名调用(推荐使用这种)也可以使用类创建对象调用;
非static修饰的方法只能通过类创建对象使用;
返回值类型
如果方法没有返回值,用void表示;
方法若是返回基本数据类型的数据,则返回值所属的数据类型或者是精度更高的数据类型;若是返回引用型,则返回值类型必须是返回数据所属的数据类型或者其父类。
方法若是有返回值,则必须借助return关键字将数据返回;
方法名
命名规则:
必须符合标识符的命名规范;
首字母小写,若是多个单词组成,从第二个单词开始首字母大写;
方法名一般是由一个动词或者动名词构成。
参数
一个方法可以有多个参数,各个参数之间用","间隔;
注意:定义在方法内的参数只在整个方法内有效;方法中的参数前边的数据类型用于限制调用方法时所传的具体数据的数据类型;
动态参数
动态参数实质上为数组;
定义位置必须位于参数列表的最后;
一个方法只能有一个动态参数(结合上条很容易分析出原因);
方法重载
使用同一个方法名,但是每次传入的参数个数或者对应类型不同即称之为方法重载;
注意:参数列表不同,不包括参数名不同;
方法中的访问控制符、修饰符、返回值类型不参与比较;
当一个类中有多个同名方法(构造方法或普通方法),在调用这些方法时,调用哪个取决于调用方法时传入的参数的数据类型和个数
public class Teacher {
public static void print(int age, String name) {
System.out.println(age + "," + name);
}
public static void print(String name, int age) {
System.out.println(name + "," + age);
}
public static void main(String[] args) {
print(33, “王小红”);// 依次传入int类型和String类型数据,所以调用第一个方法
print("王小红", 33);//依次传入String类型和int类型数据,所以调用第二个方法
}
}
十、代码块,全局变量,局部变量
代码块
java中代码块分为静态代码块和非静态代码块:静态代码块(static’修饰)只在类加载时执行一次,非静态代码块(无static修饰)每创建一次对象就执行一次;
全局变量
直接在类中声明的变量即为全局(成员)变量;
若未对成员变量初始化,系统会根据全局变量的数据类型自动分配初始值,int初始值为0,boolean初始值false,自定义类型分配初始值null;
成员变量的作用范围在整个类中;同时成员变量的定义位置没有先后顺序,但是最好在类的顶端;
局部变量
方法中的参数、方法中定义的变量和代码块中定义的变量统称为局部变量;
局部变量的作用范围:从定义位置开始到其所在的语句块结束;
如果局部变量的名字与全局变量的名字相同,则在局部变量的作用范围内全局变量被隐藏,即这个全局变量在同名局部变量所在方法内暂时失效,如果在局部变量的作用域范围内访问该成员变量,则必须使用关键字this来引用成员变量;
局部变量在使用前必须显式初始化或赋值,局部变量没有默认值;
声明局部变量时,数据类型前除了final外不允许有其他关键字,其定义的语法格式为` [final] 数据类型 变量名 = 初始值;
关于static关键字的若干补充:
静态方法不能直接调用非静态方法,可以间接通过创建该方法(指非静态方法)所在类的对象来调用;非静态方法可以直接调用静态方法;
静态代码块不能直接调用非静态方法;可以间接通过创建该方法(指非静态方法)所在类的对象来调用;静态代码块可以直接调用静态方法;
静态方法或者静态代码块不能直接使用非静态成员变量,可以间接通过创建该成员变量的对象来调用;静态方法或者静态代码块只能直接使用静态变量;
此处的补充仍然不够完整,近期内会专门整理出来。
十一、构造方法
构造方法:用于初始化类中的实例变量;
命名规则:
构造方法必须与类名相同;不包含返回值;不能有static和final关键字修饰
创建类时,如果没有显式定义构造方法,则默认有一个无参构造方法;
可以在一个类中声明一个或多个有参构造方法,但是每个构造方法在参数个数或参数类型上要有所差别;
当类中有显式构造方法时,默认的无参构造方法不再存在,除非显式定义无参构造方法;
类中可以有多个构造方法,构造方法之间可以通过this实现调用,但该行代码必须放在有效代码的第一行:
this关键字
this关键字表示对当前对象的一个引用,可以调用本类中的属性,方法及构造方法;
关于this的用法,会在后边的博客中给出;
十二、对象的初始化过程
用new创建并初始化对象的过程:
1、给对象的实例变量分配内存空间,默认初始化成员变量;
2、成员变量声明时的初始化;
3、初始化块初始化(又称构造代码块或非静态代码块);
4、构造方法初始化;
在这里插入图片描述
上图中蓝色方框内的代码执行后,对象的初始化过程如下:
1、给对象的实例变量分配空间,默认初始化成员变量;
2、成员变量声明时的初始化;
3、初始化块初始化;
4、参构造方法初始化;流程图如下: