Java程序的基本格式:
Java程序代码必须放在一个类中,刚开始学习时,我们可以将类看作一个Java程序。
类使用关键字class定义,在class前面可以有类的修饰符。
类的定义格式如下:
修饰符 class 类名{
程序代码
}
1:Java程序代码可分为执行定义语句和功能执行语句,其中,结构定义语句用于声明一个类或方法,功能执行语句用于实现具体的功能,每条功能执行语句的最后必须用分号结束(;)。
举例:
System.out.println(“这是第一个Java程序”);
需要注意的是,在程序中,不要将英文的分号写成中文的分号。
否则编译器会出现如下所示的错误:
2:Java语言是严格区分大小写的
,在定义类时,不能将class写成Class,否则编译器会出现如下错误:
假设在程序中定义了一个Computer,computer和Computer是两个完全不同的符号
,因此在编写程序的时候需要注意!
3:在编写Java程序时,为了方便阅读
,通常会使用一种良好的书写格式进行排版,但这并不是必需的,我们可以在两个单词或符号之间插入空格,制表符以及换行符等任意的空白字符
举例:
第一种书写形式:
public class HelloWorld { public static void
main(String[
]args) {System.out.println("你好,Java");}
}
输出:
你好,Java
虽然Java语言并没有严格要求使用什么样的格式编排程序代码,但是,为了提高可读性,应该使自己编写的代码整齐美观,层次清晰
常用的编排方式即为如下所示:第二种的这种形式,一行只写一条语句,符号“{”与语句同行,符号“}”独占一行
第二种书写形式:
public class HelloWorld {
public static void main(String[]args) {
System.out.println("你好,Java");
}
}
4:Java程序中一个连续的字符串不能分成两行书写
举例:
public class HelloWorld{
public static void main(String[]args){
System.out.println("你好
Java");
}
}
编译并不能通过,出现以下错误:
但有些字符串太长,必须两行才能够显示出来,针对这种情况,我们可以**将字符串分成两个字符串,然后使用加号(+)将这两个字符串连接起来,在加号(+)处换行
**,例如:可以将上面的语句修改为如下所示:
public class HelloWorld{
public static void main(String[]args){
System.out.println("你好"+
"Java");
}
}
此时就可以输出正常结果啦!
Java中的注释:
单行注释:
单行注释用于对程序中某一行代码进行解释,一般用来注释局部变量,单行注释用符号“//”表示,“//”后面为被注释的内容
举例:
int c=10;//定义一个整形变量c
多行注释:
多行注释顾名思义就是注释的内容可以为多行,它以符号“/ ”开头,以符号"*/"结束。*
举例:
/*int c=10;
int x=5;*/
文档注释:
文档注释是以“/**”开头,并在注释内容末尾以“*/”结束。文档注释是对一段代码概括性的解释说明,可以使用javadoc命令将文档注释提取出来生成帮助文档。
举例:
/**
name="黑马程序员";
*/
Java中的标识符:
和我们之前学过的C语言、Python等一样,在使用Java语言进行编程的过程中也需要定义一些符号标记一些名称,如类名,方法名,变量名等等,这些符号我们统称为标识符。
标识符可以是由字母,下划线,数字和美元符号(¥)组成
,但不能是Java中的关键字,并且数字不可以开头
标识符的定义规则和C语言相同,这里就不过多赘述了
为了增加代码的可读性,在定义标识符时,以下规则建议遵循:
1:包名所有字母一律小写,例如:cn.itcast.test
2:类名和接口名每个单词的首字母都要大写,例如:ArrayList,Iterator
3:常量名所有字母大写,单词之间用下划线连接,例如:DAY_OF_MONTH
4:变量名和方法名的第一个单词首字母小写,从第二个单词开始每个单词首字母大写,例如:lineNumber,getLineNumber.
5:在程序中,应该尽可能的使用有意义的单词定义标识符,使得程序能够便于阅读,例如:定义用户名----username,定义密码----password
Java中的关键字:
注意:
1:所有的关键字都是小写的
2:不能使用关键字命名标识符
3:const和goto是保留关键字,虽然在Java中还没有任何意义,但在程序中不能用来作为自定义的标识符
4:true,false和null虽然不属于关键字,但他们具有特殊的意义,也不能作为标识符使用
Java中的常量:
常量就是固定不变的值,是不能改变的数据
举例:
数字1,字符‘a’,浮点数3.14等都是常量
在Java中,常量包括整形常量,浮点数常量,布尔常量,字符常量等
整形常量:
整形常量是整数类型的数据,有二进制,八进制,以及十六进制
在程序中为了标明不同的进制,数据都有特定的标识
八进制必须以0开头,例如:0211,0432
十六进制必须以0x或0X开头,例如:0xaf2,0Xdd
整数以十进制表示时,第一位不能是0
浮点数常量:
浮点数常量就是数学中用到的小数,浮点数分为单精度浮点数(float)和双精度浮点数(double)两种类型
单精度浮点数后面以F/f结束,而双精度浮点数后面以D/d结束,当然,在使用浮点数时也可以在结尾处不加任何的后缀,此时**JVM会默认浮点数为double类型的浮点数,浮点数常量还可以通过指数形式表示**
字符常量:
字符常量用于表示一个字符,一个字符常量要用一对英文半角格式的单引号(‘’)括起来,字符常量可以是英文字母,数字,标点符号,以及由转义序列表示的特殊字符
举例:
‘a’ ‘1’ ‘&’ ‘/t’
字符串常量:
字符串常量用于表示一串连续的字符,一个字符串常量要用一对半角格式的双引号(“”)括起来。
举例:
“HelloWorld” “123” “welcome\n”
布尔常量:
布尔常量即布尔型的值,用于区分事物的真与假,布尔常量有true和false两个值
null常量:
null常量只有一个值null,表示对象的引用为空
变量的定义:
在程序运行期间,随时可能产生一些临时数据,应用程序会将这些临时数据保存在内存单元中,每个内存单元都用一个标识符标识,这些用于标识内存单元的标识符就成为变量,内存单元中存储的数据就是变量的值
通过具体的代码实现变量的定义:
int x=0,y;
y=x+3
通过上述第一行代码定义了两个变量x和y,与此同时也在内存中分配了两块内存单元,不仅如此,在定义变量的时候,为变量x分配了初始值0,而y没有分配初始值,此时x和y在内存中的状态,如下图所示:
通过上述第二行代码,我们为y变量进行赋值,在程序执行到第二行代码的时候,程序首先取出变量x的值,与3相加后,将结果赋值给变量y,此时变量x和y的状态就会发生改变,如下所示:
变量的数据类型:
整数类型变量:
整数类型变量用来存储整数数值,即没有小数部分的值,为了给不同大小范围内的整数合理地分配存储空间,整数类型分为四种不同的类型,分别是字节型(byte),短整型(short),整形(int),长整型(long)
注:在为一个long类型的变量赋值时,所赋值的后面要加上字母L(或小写l),说明赋值为long类型,如果赋的值未超出int的取值范围,则可以省略字母L(或小写l)
举例:
long num=22000000000L;//所赋的值超过了int型的取值范围,后面必须加上字母L
long nums=189L;//所赋的值未超过int型的取值范围,后面可以加字母L
long nums=189;//所赋的值未超过int型的取值范围,后面的字母L可以省略
浮点数类型变量:
浮点数类型变量用于存储小数数值,double类型所表示的浮点数比float类型更精确
下图为两种浮点数所占存储空间的大小以及取值范围:
在Java中,一个小数会被默认成double类型的值,因此在为一个float类型的变量赋值时,在所赋值的后面一定要加上字母F(或小写字母f),而为double类型的变量赋值时,可以在所赋值的后面加上字母D(或小写d)或者可直接省略
举例:
float num=3.1423f;//为一个float类型变量赋值,后面必须加上字f
double nums=98.3;//为一个double类型变量赋值,后面可以省略字母d
double nums=189.8d;//为一个double类型变量赋值,后面可以加上字母d
字符型变量:
在Java 中,字符类型变量用char表示,用于存储一个单一字符,Java中每个char类型的字符变量都会占用两个字节
在给char类型变量赋值时,需要用一对英文半角式的单引号(’ ‘)把字符括起来,例如’a’.
无论是文字还是数字,在计算机中,他们都能够被表示为由连续的0或1表示出来的二进制,但人们是很难理解这种二进制的,于是就产生了各种方式的编码,使用一个数值代表某个字符,如我们在C语言中常用的字符编码系统ASCII
但Java使用Unicode字符编码系统
,Unicode为每个字符制定了一个唯一的数值
,在计算时,计算机会自动将字符转化为所对应的数值
举例:
char c='a';//为一个char类型的变量赋值字符a
char ch=97;//为一个char类型的变量赋值整数97,相当于赋值字符a
布尔类型变量:
在Java中,使用boolean定义布尔类型变量,布尔类型变量只有true和false两个值,定义布尔类型变量
举例:
boolean flag=false;//定义一个boolean类型的变量flag,初始值为false
flag=true;//改变变量flag的值为true
变量的类型转换:
自动转换类型:
自动类型转换也叫隐式类型转换
,指的是两种数据类型在转换的过程中不需要显示地进行声明,由编译器自动完成
自动类型转换必须同时满足两个条件:
一是两种数据类型彼此兼容
二是目标类型的取值范围大于源类型的取值范围
举例:
byte b=3;
int x=b;
上述代码中,使用byte类型变量b为int类型的变量x赋值,由于int类型的取值范围大于byte类型的取值范围,编译器在赋值过程中不会造成数据的丢失,所以编译器能够自动完成这种转换,在编译时,不报任何错误
总的来说就是取值范围小的转换为取值范围大的实现的是自动转换
比如:
byte转化为short,int,long等
short,char转化为int,long
反过来则不能自动进行转化,需要强制类型转化!
强制类型转化:
强制类型转化也叫做显式类型转化
,意为两种数据类型之间的转化需要进行显式的说明,当两种类型彼此不兼容,或者是将取值范围大的转化为取值范围小的,自动类型转化无法进行,必须进行强制类型转化
举例:
public class HelloWorld{
public static void main(String[]args){
int num=4;
byte b=num;
System.out.println(b);
}
}
编译并没有通过,而是报出以下错误:
解决办法:
进行强制类型转化,即强制将int类型的值赋给byte类型的变量
强制类型转化格式:目标类型 变量=(目标类型)值
因此对于上述类型转换,我们可以修改为:
byte b=(byte)num;
此时便可以正常运行!
在对变量进行类型转化的时候,如果将取值范围较大的数据类型强制转化为取值范围较小的数据,例如将int–>byte这种,则极容易造成数据精度的丢失
举例:
public class HelloWorld{
public static void main(String[]args){
byte a;
int b=298;
a=(byte)b;
System.out.println("b="+b);
System.out.println("a="+a);
}
}
输出:
b=298
a=42
通过输出结果,我们会发现,即使进行了强制类型转化,但a和b的值仍然不同,这就是因为取值范围大的变量类型int转化为取值范围小的变量类型byte的过程中,发生了数据精度的丢失
具体原因如下:
变量的作用域:
无论C语言还是Java,变量都需要先定义才能使用,但这并不代表定义了的变量在下面的程序代码中都可以使用,变量只能在其作用范围内才可以被使用,这个作用范围称为变量的作用域
变量一定会被定义在某一对大括号中,该大括号所包含的代码区域便是这个变量的作用域
举例:
基本了解了变量的定义域后,下面我们通过一个程序熟悉一下:
举例:
public class HelloWorld{
public static void main(String[]args){
int a=90;
{
int b=2;
System.out.println("a is"+a);
System.out.println("b is"+b);
}
a=b;
System.out.println("a is"+a);
}
}
编译未通过,报错如下:
原因即为:变量y在作用域范围之外被使用,出错代码为:a=b;这一句,由于变量b的作用域为内括号,因此出了这个内括号的范围,变量b便无法使用。
Java中的运算符:
在绝大多数的程序中都出现过以下的特殊符号,例如+,-,*,=,>等等,这些特殊符号叫做运算符,运算符通常用于对数据进行算术运算,赋值运算和比较运算
算数运算符:
算术运算符在使用的过程中需要注意以下几点:
1:在进行自增(++)和自减(–)运算时,如果运算符++或–放在操作数的前面,则先进行自增或自减运算,再进行其他运算。反之,如果运算符放在操作数的后面,则先进行其他运算再进行自增或自减运算
举例:
public class HelloWorld{
public static void main(String[]args){
int a=1;
int b=2;
int x=a+b++;
System.out.println("b="+b);
System.out.println("x="+x);
}
}
输出:
b=3
x=3
对于如下所示,这行代码,因为自增(++),放在了操作数的后面,因此先执行a+b运算,再执行b++操作
此时的b还是2,但当程序运行到下一步时,b就变成3了
int x=a+b++;
2:在进行除法运算时,当除数和被除数都为整数时,得到的结果也是一个整数,如果除法运算有小数参与,得到的结果会是一个小数
举例:
2510/1000 属于整数之间相除,会忽略小数部分,得到的结果是2
而2.5/10的结果是0.25
//这种规则和C语言是完全相同的,要想结果为浮点数,那么除数,被除数中,至少包含一个浮点数
3:在进行取模(%)运算时,运算结果的正负取决于被模数(%左边的数)的符号,与模数(%右边的数)的符号无关
举例:
(-5)%3=-2
5%(-3)=2
赋值运算符:
赋值运算符在使用的过程中需要注意以下几点:
1:在Java中可以通过一条赋值语句对多个变量进行赋值
举例:
int x,y,z;
x=y=z=-4;//同时为多个变量赋初始值为4
但是不能在定义变量的时候,进行多个变量赋多个初始值
举例:
int x=y=z=3;
2:在众多赋值运算符中,除了“=”,其他都是特殊的赋值运算符,以“+=”为例,x+=3所表示的含义即为x=x+3,表达式首先会进行x+3运算,再将其结果赋值给x,其他运算符以此类推
比较运算符:
注:一定不要将比较运算符“==”误写成赋值运算符"="
逻辑运算符:
逻辑运算符在使用的过程中需要注意以下几点:
1:逻辑运算符可以针对结果为布尔值的表达式进行运算
例如:
x>3&&y!=0
2:运算符“&”和“&&”都表示与操作,当且仅当运算符两边的操作数都为true时,其结果才为true,否则结果为false
虽然运算符“&”和“&&”都表示与操作,但二者在使用上还是有一定的区别:
在使用“&”进行运算时,不论“&”左边的表达式结果为true还是false,“&”右边的表达式都会进行运算,但在使用“&&”进行运算时,当“&&”左边的表达式结果为false时,“&&”右边的表达式就不再进行运算,因此“&&”被称作短路与
举例:
public class HelloWorld{
public static void main(String[]args){
int x=0;
int y=0;
int z=0;
boolean a,b;//a,b是布尔型变量,因此输出结果只能为true或者false
a=x>0&y++>1;//即使x>0为false,y++>1还是会执行,因此才有下面的y输出结果为1
System.out.println(a);
System.out.println("y="+y);
b=x>0&&z++>1;//挡x>0的结果为false,z++>1便不会被执行,因此z的值依然是0
System.out.println(b);
System.out.println("z="+z);
}
}
输出:
false
y=1
false
z=0
3:运算符“|”和“||”都表示或操作,当运算符两边的任一表达式的值为true时,其结果为true,只有两边表达式的结果都为false时,其结果才为false,和逻辑与操作相类似,“||”为短路或,当运算符“||”左边的表达式结果为true时,右边的表达式便不再进行
4:运算符“^”表示异或操作,当运算符两边的布尔值相同(都为true或者false),其结果为false,否则为true
运算符优先级:
上表中所列举的这些运算符,优先级的数字越小代表优先级越高
举例:
public class HelloWorld{
public static void main(String[]args){
int a=2;
int b=a+3*a;//*的优先级高于+,因此先执行3*a,在执行+a运算
System.out.println("b="+b);
int c=(a+3)*a;//()的优先级高于*,因此先执行(a+3),再执行*a运算
System.out.println("c="+c);
}
}
输出如下:
b=8
c=10