##概述
我们需要了解一些基础的java语法来进行java的学习,这里我做了一些小小的总结,具体涉及以下内容:标识符,关键字,常量,变量,基本数据类型的转换,引用数据类型,程序的格式,运算符,语句,方法,递归。是通过看视频,看书了解的,现在拿出来与大家分享。这部分的学习大概从2015年10月开始。
##标识符
1,标识符就是一切可以起名字的地方:包名,类名,方法名。
2,标识符命名规则
1,必须 以___,字母,KaTeX parse error: Expected group after '_' at position 19: …者是数字组成。 2,必须 以_̲__,字母,符号为开头
3,不能与关键字同名
4,对大小写敏感,长度没有限制
5,见名知意,最好用英文表述
##关键字
1,记住:void关键字表示该方法没有返回值
2,记住:一个类里只允许一个public修饰符的类的存在,其它可以有多个
3,记住:关键字全部都是英文小写字母
##常量
1,常见常量类型
1. 整形常量:int ,long
2. 浮点型常量:float,double
3. 字符常量(char):‘a’
4. 字符串常量(string):“abcdefg”
5. 逻辑常量(boolean):布尔类型,true ,false
2,常量还可以表示值不可以改变的变量,例如final关键字
##变量
1,变量要素:变量名,值,作用域
2,先声明再赋值 double d1,d2,d3=0.123 (注意:这里只有d3=0.123),一定要先声明再赋值,局部变量必须赋初始值,否则无法编译,成员变量只需声明。
**3,程序执行过程:**程序首先存在于硬盘上------然后被装载到内存区-------内存会找到main方法---------内存里分四部分:代码区,静态变量和字符串常量,存放局部变量的栈,堆:所有new出来的东西
栈里的局部变量从堆里new出一个空间,所以引用数据类型有两块儿内存空间
**4:局部变量:**在方法体里面声明的变量,成员变量:在类体里面,方法体外边声明的变量,注意方法的参数属于局部变量
**5:按照方法的作用域划分变量:**凡是在大括号里声明的变量,出了大括号就没人认识它了,在这个大括号里边的都认识它。
6,按照数据类型划分变量
靠内存的大小和内存的排列来区分数据类型
2进制转10,10进制转2,2若要想转8或16则先转为10
所有的数据类型在所有的操作系统上占的位数都一样,所以可以跨平台。
注意:java语言整型默认为int型,声明long型常量时候需要后边加’L’或者‘l’,但即使超出了int的表述范围,也不用担心,不会报错但会导致数值计算错误。
java语言默认浮点型常量为double型,如果要声明一个常量float型,则需要在后边加f或者F, 直接转不过去,直接转会导致溢出现象float在小数点后7位,double在小数点后15位大概
7,变量部分代码解析
public class testvar {
//int j;
static int j; // 成员变量,可以作用于整个类
public void m() { // 虽然在main方法里也有i,但没关系,作用域都是本方法
int i = 0;
System.out.println(i);
}
public static void main(String[] args) {
int i=0 ;
int t=i+5; //这里局部变量i必须先被赋初始值,否则不能编译。
int k=j+5; //成员变量可以不用赋初始值,系统会默认分配
System.out.println(k);
//testvar tt=new testvar(); //非静态方法,需要先new出一个对象来,然后再调用
System.out.println(i);
//System.out.println(tt.j);
System.out.println(j); //只有成员变量定义为static,才可以直接打印
System.out.println("tianmaolin" + 123); // 这个属于常量的概念,直接可以打印相对应的常量值,不用定义声明赋值。
boolean b = false;
if (b) {
int c = 0;
System.out.println("b is true");
}
// System.out.println(c); //打印不出来,出了c的作用域了,根本就找不到c
long longNum1 = 8888888888888L;
**注意:**成员变量和全局变量是有区别的,成员变量并不能随意在各个方法中使用,如果想直接使用,成员变量与方法之前必须加static关键字,此时该成员变量或成员方法即相当于全局的概念,如果不加static,那么必须先new该类出一个实例,然后再调用变量和方法
成员变量会默认初始化,局部变量不会。
##基本数据类型的转换
1,布尔类型和其他类型变量不可以互相转换
2,容量小的类型可以自动转换为容量大的数据类型,byte,short,char不能互相转换,在做运算之前会自动转换为int类型。容量大的转换为容量小的需要强制转化。
特殊情况:赋值的时候:只要int类型的数没有超出(byte,short,char)的表述范围,可以直接byte a=23,而long则需要long l=1232323L
3,多种混合计算时,自动将所有数据类型转换为容量最大的一种数据类型。
4 代码测试
public static void main(String[] args) {
boolean b=true;
System.out.println(b);
byte b1=67; //byte类型直接后边赋值即可,int类型可以自动赋值到byte上,只要不超过127,但是float f=0.1就不行,必须加f,虽然没超出范围。总结起来就是整型之间虽然不是int但是只要没超过int范围就没必要加强制转换或者是末尾加l,但是浮点型的不行,一定得加强制转换或者是末尾加f。
byte b2=99;
byte b3= (byte)(b1+b2); //在计算之前(byte,short,char会自动转换为int,所以需要强制转换为byte)
System.out.println(b3); //如果直接超过127 ,不会有溢出错误,直接砍掉多余位数
char c1='t';
int b4=b3+c1;
System.out.println(b4); //char,byte,short不可以互相转,但是可以进行混合运算
int i1=123;
int i2=456;
double d1=(i1+i2)*1.2; //系统将会自动把int型的转为double型的计算,因为浮点型的1.2是默认double型的,混合运算中又要取最大范围
System.out.println(d1);
float f1=(float)d1; //因为d1是double型的,所以要强制转换为float型的。
System.out.println(f1);
double d2=1e200;
float f2=(float)d2;
System.out.println(f2); //因为d2超出了float能承受的范围,所以会溢出
float f3=12.344343f; //后边必须加f
long l1=1234l;
long l2=3455l;
float f4=f3+l1+l2;
System.out.println(f4); //混合运算自动都变为float型的
long l3=(long)f4;
System.out.println(l3); //强行把浮点数类型的转化为整型的会导致没有小数位,不是四舍五入,而是彻底没有小数部分。
}
5,代码纠错
public static void main(String[] args) {
int i=1,j=12; //对i,j赋初始值
float f1=(float)0.1; //0.1f与这里的写法是有区别的,0.1f表示内存分配就分配了4个字节,而这种写法意思是8字节的double类型然后强制转换
float f2=123; //123默认是int类型的,可以自动转为float
long l1 = 12345678,l2=8888888888L; //l1这里没有超出int的范围,所以不用加l,而l2显然超过啦,所以必须加l
double d1 = 2e20,d2=124; //int类型自动转为double
byte b1 = 1,b2 = 2,b3 = 127; //只要没超过int的表述范围,赋值不需要加强制转化
j = j+10;
i = i/10;
i=(int)(i*0.1); //这里虽然与上边相同的计算结果,过程不一样,首先计算后为double,必须加强制转化
System.out.println(i); //i是int型,10是int型,所以计算结果为0,也必须是int型
i = (int)(i*0.1); //i是int型的,乘0.1后变为double型,必须强制转化为int型
char c1='a',c2=125;
byte b = (byte)(b1-b2);
char c = (char)(c1+c2-1); //混合运算,统统转为int,运算结束后再转为char型的
float f3 = f1+f2;
float f4 = (float)(f1+f2*0.1);
double d = d1*i+j;
float f = (float)(d1*5+d2);
}
##引用数据类型
除了基本数据类型,都是引用类型,引用类型占两块内存,一块为空值,定义一个引用类型,什么都不放另一块为引用类型new出来的 。放堆里边进行动态内存分配,不用的时候就会被垃圾回收机制回收。
同一类中的不同对象,共享该类方法,有不同的成员变量存储空间。
##程序的格式
package generaltest;
public class normal { // 1,大括号之间对齐 ,2遇到"{"缩进以表明是本代码块儿里的内容
int j = 111;
// 3,程序块儿之间要加空格
public static void main(String[] args) {
System.out.println("HW"); System.out.println("mmmm"); // 4,并排语句之间加空格
System.out.println("KKK");
int i = 8; //5,赋值语句符号两边要各有一个空格
}
public void m() { //6,左"{"前边最好有空格
System.out.println("LLLL");
}
}
##运算符
i++:相当于先运算么,再给i加1. ++i;相当于先加1再运算
a^b(异或):相异为true
&和&&的重要区别:&&在计算机中只需得出第一个表达式为假,第二个操作数不需要再计算了,而&必须将两个操作数都算完才可以
重要:+两边只要有一个字符串,那么系统会将令一个自动转换为字符串
当进行打印时,无论何种数据类型,都转化为字符串类型进行打印
运算符优先级问题
三目条件运算符
x一定为boolean类型的表达式
##语句
if中只有一句语句可以省略掉“{”但是不要省略任何大括号!!!!!
条件语句测试程序
public class choose {
public static void main(String[] args) {
int i = 7;
if (i < 20) {
System.out.println("free");
} else if (i < 40) {
System.out.println("normal:100yuan");
} else if (i < 60) {
System.out.println("free");
} else {
System.out.println("ok,you are right");
}
switch (i) { //java中的switch只能探测int型的数据
case 3:
System.out.println(33);
break; //每个break必须要打,如果没有,就会发生case穿透问题,直接连同下一个case内容都打印出来
case 4:
case 7:
case 12: //多个case可以合并到一起,是或的关系
System.out.println(44);
break;
case 5:
System.out.println(55);
break;
default: //default可以省略,但最好不要省略,破坏了程序的健壮性
System.out.println("error");
break;
}
}
这个流程图把for循环讲的太好了,简直完美!!!
public static void main(String[] args) {
for(int i=1;i<=99;i+=2) {
result+=i;
}
System.out.println(result);
}
1+3+5……+99;
选中部分代码按tab可以集体向右
同时按中shift+tab可以向左缩进
循环代码解析
第一个是测试循环
第二个是通过循环的方式打印斐波那契数列
public static void main(String[] args) {
int result = 0;
for (int i = 1; i <= 99; i += 2) {
result += i;
}
System.out.println(result);
int x = 0;
while (x < 10) {
System.out.println(x);
x++;
} //while....是先判断条件然后执行语句
x = 0; //注意这里不能int x=8,因为同一个作用域内,同一变量不能被声明两次
do { //do...while是先执行一次再判断条件
x++;
System.out.println(x);
} while (x < 10); //注意后边的分号!!
int stop=4;
for(int i=1;i<=10;i++){
if(i==stop) break; //注意if语句后边不要加分号!!!!
System.out.println("i="+i); //终止整个语句块儿的循环,跳出循环语句
}
int skip=3;
for(int i=1;i<=10;i++){
if(i==skip) continue; //终止本次值的循环,直接跳到下一次
System.out.println("i="+i);
}
System.out.println(fabonacciloop(-3)); //用循环的方式解决斐波那契数列问题
}
public static long fabonacciloop(int index) {
if (index<1) {
System.out.println("erro");
return -1;
}
if (index == 1 || index == 2) {
return 1;
} else {
long f1 = 1L;
long f2 = 1L;
long f = 0L;
for (int i = 3; i <= index; i++) {
f = f1 + f2;
f1 = f2;
f2 = f; //循环,变量互换赋值
}
return f;
}
}
循环测试小例子
第一个是每隔5个为一行打印出100内能被3整除的数
第二个是打印出100–200之间所有的质数
public class testloop {
public static void main(String[] args) {
int num = 0;
for (int i = 0; i < 100; i++) { //0~100之内能被3整除的数
if (i % 3 == 0) {
System.out.println(i);
num++;
}
if(num==5){
break; //如果计数达到5个可以被3整除,则终止计数
}
}
System.out.println("=======================我是分割线===================");
for (int i = 101; i < 200; i+=2) {
boolean f=true;
for (int j = 2; j < i; j++) {
if (i%j==0) {
f=false; //如果不是质数,设f为false,然后终止本次循环
break; //注意,这里只是把内层循环终止了
}
}
if(!f){ //如果不是质数,执行跳过,没跳过的都是质数,打印出来
continue;
}
System.out.println(i);
}
}
##方法
public class testmethod {
public static void main(String[] args) { //主车间,进行组装的地方
m();
m2(2); //这里传入的4, 相当于实参,实际传入的参数
m3('3', 4);
m4(4, 6); //有返回值,但是并没有被打印出来
/*int i = m4(4, 6);
System.out.println(i);*/ //把该返回值传给i,然后打印出该返回值
}
public static void m() { //该分车间不返回任何值,只是顺序执行
//return; //直接return会报错,因为没有任何语句得到执行
System.out.println("ok");
System.out.println("hello");
}
public static void m2(int i) { //形式参数i,必须传入一个值且必须为int类型的
if(i > 3)
return;
System.out.println(i);
}
public static void m3(int i, int j) { //该分车间可以有两个
System.out.println(i + j);
}
public static int m4(int i, int j) { //该分车间具有返回值
return i > j ? i : j;
}
##递归
public class recurison { // 类只能有一个public,方法不限
public static void main(String[] args) {
System.out.println(method(3));
System.out.println(fibonacci(5));
}
public static int method(int n) {
if (n == 1) {
return 1;
} else {
return n * method(n - 1); // 递归,n的阶乘
}
}
public static int fibonacci(int n) {
if (n == 1 || n == 2) {
return 1;
} else {
return fibonacci(n - 1) + fibonacci(n - 2); //斐波那契数列
}
}