数据的输入与输出
一.数据的输入
1.使用main方法的参数从键盘上接收数据(该程序只能在jdk下运行,在其他的继承环境中都无法运行)
2.使用Scanner类
从键盘接收字符串时可用nextLine(),next()方法
两者区别:
1.nextLine()接收到的字符串不受空格限制,只受回车的限制,而next()要受空格限制
2.如果从键盘上接收的数据是先接受数值型,再接收字符串类型时,如果在数值型的接收语句后面跟的是nextLine,则需要写两遍nextLine,第一遍是为了接收前面数值型数据的回车符,第二遍才能真正地接收到所需要接收的字符串。如果使用next,将不会收到前面数值型数据的影响。
二.数据的输出
Java的基本语言符号
一.关键字
二.标识符
用来标识类名,变量名,方法名,数组名,文件名的有效字符序列
Java语言规定,标识符由字母,下划线,美元符号和数字组成,并且第一个字符不能是数字
标识符中的字母是区分大小写的
类名由多个单词组成时,每个单词的首字母大写,其余小写
变量名或方法名由多个单词构成时,第一个单词的首字母小写,后续单词首字母大写,其余小写常量名完全大写,并且用下划线作为标识符中各个单词的分隔符,例如:SQUARED_PI表示固定的数π²
类名使用名词,方法名使用动词或动词词组
顾名思义
三.分隔符
包括空白,小括号,花括号,分号等
每条语句无论一行还是多行都以分号结束
一行最好只能有一条语句
空白指空格,制表符,换行和回车符
Java程序的元素之间可以插入任意数量的空白,编译器将会忽略多余空白
四.注释
1.单行注释//
2.多行注释/*
*/
3.文档注释/**
*/
文档注释与多行注释类似,只不过这些注释的内容可以被提取出来形成程序的帮助文档
使用javadoc程序可以从java代码中抽取文档注释内容,并创建出html格式的程序文档
Java中定义了一种文档注释方式,内置了一些标准的以@开头的关键字
Java的基本数据类型
基本数据类型又称简单数据类型,有8种,四大类
逻辑类型:boolean(1个)
占一个字节的储存空间,主要用于流程控制语句
常量:true,false
变量:boolean x=false
字符类型:char(2个)
常量:1.Unicode表中的字符就是字符常量
2.转义字符常量,以\开头
变量:占2字节,最高位不是符号位,没有负数。例如char x='a'hl和char x=97等价
整数类型:byte(占1个字节) short(2个) int(4个) long(8个)
都是带符号的,不存在无符号整数
常量:默认为int类型。一个整数前加上了0:八进制;0x:十六进制;后面有l或L:转化为long型
浮点类型:float(4个) double(8个)
常量:456.75469f float后面加上f或F
变量:占4字节。float x=22.555f,y=56.28f默认为double类型
基本数据类型之间的转换
把一种基本数据类型的常量或者变量的值赋给另一种基本数据类型时,就涉及到数据类型的转换
数据类型的转换分为自动类型转换和强制类型转换
数据之间的转换与数据类型的精度有关
byte<short<int<long<float<double
char<int<long<float<double
其中任何两种数据类型允许进行相互转换
boolean与任何其他数据类型之间没有精确度高低的比较关系,不能进行相互转换
把级别低的变量或常量的值赋值给级别高的变量时,系统会自动完成数据类型的转换。例如:int count=5;float amount=count;
char='我',int mark=c;
把级别高的变量或常量的值赋值给级别低的变量时,必须进行强制类型转换。
例如:int value=257;byte b=(byte)value;
int x=(int)36.9;
两数据类型不能进行精度比较但两者允许相互转换时,需要进行强制类型转换
例如:char c='我';byte b=(byte)c;
整型常量默认为int型,将其赋给比int类型级别低的变量时,只要没有超出变量的取值范围,可以不用进行强制转换
例如:byte b=3;
上面例子如果把整型常量3变为整型变量3,则需要进行强制转换
int n=3;
byte b=(byte)n;
Java的复合数据类型
包括数组,类,接口,泛型等
复合数据类型可以把相互之间有联系的变量组织起来
例如:
class Student
{
int age;
char gender;
float height;
float weight;
}
复合数据类型由程序员在源程序中自己定义,一旦定义,复合数据类型就可以像基本数据类型一样使用
对于上面的学生信息,把年龄,性别,身高,体重封装到类Student之后,各个变量之间就建立了关系
要通过定义Student类型的变量来操纵学生信息
基本类型变量和引用类型变量
Java的数据类型包括基本数据类型和复合数据类型,同样地,变量也有基本数据类型变量和引用类型变量
两种类型的变量的存储结构不同,系统对它们的处理也不相同
基本类型变量对应着一块内存区域,这块区域中包含了这个变量的数据值
系统直接给基本类型变量分配内存空间,程序可以直接操作这些变量
int j;//系统给j分配了4个字节的内存空间
j=2007;//系统改变空间的状态,为变量j赋值,这块内存区域中存储2007点二进制形式
声明引用类型变量时,只是给该变量分配引用空间,这段空间用来存放地址,数据空间没有分配
Student first;//开辟了first变量的引用空间
first.age=21;//错误,first.age的空间没有被开辟
改正:
Student first;
first=new Student();//使用new关键字去创建first对象,为first开辟了其引用对应的空间,即first指向的值空间
first.age=21;
运算符与表达式
优先级:!>算术运算符>关系运算符>&&>||>条件运算符>赋值运算符
算数运算符和算数表达式
+
-
*
除法运算符:/
求余运算符:%(两侧必须为整数,所以它只适用于整型和字符型)。例如:7%4,120%'a'
自增自减运算符
++x,--x:先使x+1或-1,再使用
x++,x--:使用完x之后再x+1或-1
只能用于变量,不能用于常量或表达式
用算数运算符和操作元连接起来想,符合Java语法规则的式子成为算数表达式。
例如:a+b-c
按算术运算符两边操作元的最高精度保留结果的精度,操作元必须是数值类型,数值类型的精度是byte<short<int<long<float<double
关系运算符和关系表达式
用来比较两个值的关系,结果是boolean类型数据
关系运算符和它的操作元形成关系表达式
逻辑运算符和逻辑表达式
优先级:!>&&(短路与)>||(短路或)
赋值运算符和赋值表达式
=
左边的的操作元必须是变量,不能是常量或表达式
条件运算符和条件表达式
条件运算符?:
op1?op2:op3 op1为true时该条件表达式的值为op2的值,为false时为op3的值
位运算符和位运算表达式
按位与运算符&
按位或运算符|
按位异或运算符^
按位非运算符~
左移位运算符<<
左边的操作元成为被移位数,右边的操作元成为移位量,左移位时右边空位补0
对于byte或short类型数据,运算时,首先将数据升级为int型,对于正数,高位用0填充,负数用1填充,然后再进行运算,结果是int型
右移位运算符>>
左边的空位补0(被移位数是正数时)或1(负数时)
instanceof运算符
左边的操作元是一个对象,右边的操作元是一个类,左边的对象是右边的类创建的时,结果为true,否则为false
Java语句类型
声明语句
声明变量或方法
表达式语句
复合语句
一组语句可以用一对大括号包括起来,构成复合语句,一个复合语句也称作一个代码块。在复合语句内部声明的变量是局部的,其作用范围不能超出大括号限制的范围
类的位置说明语句
package语句和import语句
流程控制语句
控制程序中语句的执行顺序
包括分支语句,循环语句,跳转语句
分支语句
if语句,if-else语句,if else-if语句,switch-case语句
switch(表达式)
{
case 常量表达式1:语句1;break;
case 常量表达式2:语句2;break;
… …
case 常量表达式n:语句n;break;
default:语句n+1;break;
}
循环语句
while(表达式)
{
语句
}
do
{
语句
}while(表达式);
for(表达式1;表达式2;表达式3)
{
语句
}
foreach循环
Java5提供了foreach循环,用以遍历数组和集合,使用foreach时,无须或得数组和集合的长度,无须根据索引来访问数组元素和集合元素,foreach循环自动遍历数组和集合中的每个元素
foreach语句等价于
跳转语句
break continue return
Java的数组
数组的声明
中括号在数组之后。例如float num[];
int manyNum[][];
中括号在数据类型之后。例如float[] num;
int[][] manyNum;
数组的名字称为数组的引用,在内存的栈中会为这个数组开辟一个引用空间,只有声明,这个引用空间里存放的是一个空引用,或称为一个空地址。也就是说这个数组名字变量不能够操作数组的任何一个元素,它没有发生任何的指向关系,必须去创建数组,才能够对数组的元素进行使用,创建数组时需要通过new运算符创建
数组的创建
通过new运算符创建一维数组:
数组名字=new数组元素的类型[元素个数];
例如:float num[];num=new float[4]等价于float num[]=new float[4]
在声明一维数组num的同时去进行这个数组的创建,在new运算符后面的数据类型的后面的中括号里有一个4,代表这个一维数组num有4个元素
在内存的栈中为数组名这个变量开辟一个引用空间,因为有了new运算符,所以这个引用空间里不再是一个空地址,而是一个具体的地址,在内存的堆里,为数组的四个元素开辟了连续的4个空间,分别来存放第一至第四个元素。这时num里存放的地址就是数组的第一个元素的首地址
通过new运算符创建二维数组:
int manyNum[][];
manyNum=new int[2][3];
等价于
int manyNum[][]=new int[2][3];
上述例子中数组每行元素个数相同
每行元素不同时:
int a[][]=new int[2][];
a[0]=new int[2];
a[1]=new int[3];
a[0][0]=1;a[0][1]=2;
a[1][0]=10;a[1][1]=12;a[1][2]=16;
第一条语句是创建一个二维数组,但是在new运算符的后边数据类型后面的两个中括号里只设定了二维数组的行数,没有对列数进行设定。这时,在内存的栈里,为二维数组变量a开辟了一个引用空间,这个空间里存放了一个地址,这个地址指向了这个二维数组的第一行,即a[0],a[0]和a[1]中也存放的是地址。接下来对a[0]这个一维数组使用new运算符来设定第一行的元素个数,同理对第二行设定第二行的元素个数。a[0]中存放的地址指向一段值空间,这个值空间里有两个值的存放。a[1]同理。a[0]中的地址就是第一行第一个元素的首地址
数组的初始化
数组创建好之后,系统会给每个元素一个默认值。例如,整数类型为0,浮点型为0.0,类类型为null
除了使用new运算符创建数组,也可以使用数组的初始化创建数组
例如:float[] num={21.3f,66.2f};
相当于
float[] num=new float[2];
num[0]=21.3f;
num[1]=66.2f;
二维数组同理
例如:int[][] a={{1,2},{10,12,16}};
数组的引用
数组名属于引用型变量,两个数组名如果具有相同的引用,它们就包含完全相同的元素
例如:int[] a={1,2,3},b={4,5};
/*此时a指向1,2,3所在的值空间,b指向4,5所在的值空间*/
a=b;
/*a将断开和原始值空间的联系,和b一起重新指向新的值空间*/
数组注意事项
1.Java允许使用int类型变量制定数组的大小。(在c语言中不允许)
例如:
int size=30;
double n[]=new double[size];
2.Java不允许在声明数组的中括号内指定数组元素的个数。int[12] a;和int a[12];都是错的
3.下标从0开始
4.length的使用
对于一维数组,数组名字.length的值是指数组中元素的个数
对于二维数组,数组名字.length是指它含有的一维数组的个数