上一期我们讲到了计算机硬件概述,软件概述,编程语言概述,关于java的基本概念,以及如何配置和运行java,这一期我们就来学习java语言中的基本数据。
Java关键字是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字,还有特别意义的变量。Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名和参数。简单的概述一下就是,一些被高级语言(比如java)赋予了特殊含义的单词,不能随意的使用。一般为纯小写单词。
例如上一期的代码中:
public class A{
public static void main (String[] args){
System.out.print("你是宇宙无敌最可爱");}
}
其中class是关键字,表示的一个类,不能用做类名(A)
public 公共的;Java语言的一个关键字,在方法和变量的声明中使用,它表示这个方法或变量能够被其它类中的元素访问,是函数的权限。
void 空的;Java语言的关键字,用在Java语言的方法声明中说明这个方法没有任何返回值,表示的是函数的返回值类型。"void"也可以用来表示一句没有任何功能的语句。
System,String与A是一个东西,是类名而非关键字,但是也不是随意使用。
就是我们程序员在写代码的过程中自定义的一些名称,例如变量名,类名以及函数名
在程序设计术语中,这样的名字称为标识符(identifier)。所有的标识符必须遵从以下规则:
例如,$2、ComputeArea、area、radius 和 print 都是合法的标识符,而 2A 和 d+4 都是非法的,因为它们不符合标识符的命名规则。Java 编译器会检测出非法标识符,并且报语法错误。
注意:由于 Java 是区分大小写的,所以 area、Area 和 AREA 都是不同的标识符。
知道了标识符的含义和规则,那么标识符如何组成呢?
标识符的组成规范:
每个人都有每个人的思想,思想不同写出来的东西也不同,同理,程序员也是一样,每个程序员的思想不同,写出来的程序也就不同,为了方便程序员之间的代码交流,此时就需要注释,还有就是在代码写的过多的情况下,程序员容易忘记,此时便可以提示程序员。
值得注意的是,注释本身不属于代码范畴的,注释不会进字节码文件。
注释本身分为三类:
public class Test {
/**
* 这是文档注释
*/
public static void main(String[] args) {
}
}
常量本身是一些不能被改变含义的数据,数据在程序里面进行运算时不能发生改变的数据,成为常量。
Java直接出现在程序中的量,同时被称为字面量。
1.字符串常量:凡是用双引号引起来的部分,叫做字符串常量。例如:“abc”、“Hello”、“123”。
2.整数常量:直接写上数字,没有小数点。例如:100,200,0,-250。
3.浮点数常量:直接写上的数字,有小数点。例如:2.5、-3.14、0.0。
4.字符常量:凡是用单引号引起来的单个字符,就是字符常量。例如:‘A’、‘b’、‘9’、‘中’。
5.布尔常量:只有两种取值。true、false。
6.空常量:null。代表没有任何数据。
注意:
1.两个单引号中间必须有且仅有一个字符,没有不行。
2.两个单引号中间必须有且仅有一个字符,有两个不行。
3.空常量不能直接用来输出输出。
例如:System.out.println(’’);这是错误的。
例如:Syetem.out.println(‘AB’);这是错误的。
例如:System.out.println(nulll);这是错误的。
什么是进制?
进制也就是进位制,是人们规定的一种进位方法。 对于任何一种进制—X进制,就表示某一位置上的数运算时是逢X进一位。
十进制是逢十进一, 十六进制是逢十六进一, 二进制就是逢二进一,以此类推,x进制就是逢x进位。
二进制的表达形式:以0b/0B开头,其余是有0、1组成;
八进制的表达形式:以0开头,其余是有0-7组成;
十六进制的表达形式:以0x/0X开头,其余是有0-9、a、b、c、d、e、f组成;
进制之间的相互转换
二进制转十进制
例如一个二进制数:100
从最右边的一位算起,为 2^0
中间的一位为2^1
最左边的一位数为2^2,
由此可知二进制数100转换为十进制数为:02的0次方+02的1次方+02的二次方,结果为4
同理,1000 0100的十进制数为:12的二次方+1*2的七次方,结果为132
十进制转二进制
例如:十进制60,如何转换为2进制?
此方法称为短除法,将所得数由下往上排列,结果为0111100
二进制转八进制
二进制中每一有两个状态,八进制中每个位有八个状态,所以我们可以通过3个二进制位表示八进制位(2^3=8)
这里涉及8421码
什么是8421码?
在这种编码方式中每一位二值代码的1都是代表一个固定数值,把每一位的1代表的十进制数加起来,得到的结果就是它所代表的十进制数码。
由于代码中从左到右每一位的0分别表示8,4,2,1,所以把这种代码叫做8421代码。每一位的1代表的十进制数称为这一位的权。
8421码中的每一位的权是固定不变的。
二进制转换为十进制:一位一组;
二进制转换为八进制:三位一组;
二进制转换为十六进制:四位一组;
最后进行组合即可
例如:二进制数10010100
拆分(从右往前拆)为3个二进制码,为 010 010 100
由于八进制中最大为7,则用8421码中的421
0 1 0 0 1 0 1 0 0
4 2 1 4 2 1 4 2 1
取“1”对应的码,则二进制数10010100的八进制表示为0224。
同理,二进制转16进制也是一样,用8421全码
例如:二进制数10010100
拆分为4个二进制码,为 1001 0100
1001 0100
8421 8421
取“1”对应的码,则二进制数10010100的十六进制表示为0x94。
例:二进制数111111010111转换为十六进制。
同上:拆分为4个二进制码,为 1111 1101 0111
1111 1101 0111
8421 8421 8421
取“1”对应的码,则二进制数111111010111的十六进制表示为0xfd7。
在程序运行期间同,随时可能产生一些临时数据,应用程序会将这些数据保存在一些内存单元中,每个内存单元都用一个标识符来标识,这些内存单元称为变量,定义的标识符就是变量名,内存单元中存储的数据就是变量的值,变量的值在程序运行期间可以被改变。
变量的出现,解决了重复性数据更迭问题。
// 方法1
数据类型 变量名 = 变量值;
// 方法2
数据类型 变量名;
变量名 = 变量值;
// 例:
int num = 20;
进程:正在进行的程序。程序在被加载进内存当中时,会被分配空间,空间就是变量本身。
变量的本质:就是在内存当中某一个进程里的一个临时存储区域。
每一个变量空间在创建的时候都会被随机的分配地址(真实的物理内存地址)
变量空间中的数据在变化的过程中必须保持是可兼容的(至少是同一类型)
如果直接在代码中用变量的物理地址去访问空间中的数据的话 有可能访问不到,为了避免地址的不确定性,引入了变量名这个概念 由变量名-地址表 来保证变量名和变量之间的关系(底层实现)
常量数据一定是在变量空间当中吗?不是,所有的常量都在常量池(存放程序当中直接出现的数据)当中,变量空间当中存的就是常量在常量池中的地址。
其实 ,上述当中变量空间的地址 其实就是你们在C语言当中学的指针
我们C语言当中学习的指针,说白了其实也就是变量空间的地址。打个比方,有一本书,书上有一张便利贴,便利贴上面记录了书的某一页的页码和行号,这张便利贴其实就可以当作一个指针,我们通过访问便利贴上面的页码和行号,就可以具体的访问到书中的那一页那一行的文字
简单举个例子,int* a 这里面的*表示指针变量,a表示指针变量名,int表示这个指针是一个整型的指针。这如果还不明白的话,下面我用一串代码来更加具体的说一下。
#include
int main(){
int a=3; //创建一个名称为a的普通变量,这个变量里面存放数据3
int b=4; //创建一个名称为b的普通变量,这个变量里面存放数据4
int* c; //创建一个指针变量c,这个指针变量c指向普通变量b
c=&b; //这句话的意思是将变量b的地址赋予指针变量c
int** d; //创建一个指向指针变量c的指针变量d
d=&c;
printf("a的值=%d\n",a);//直接输出a的值,结果为3
printf("b的值=%d\n",b);//直接输出b的值,结果为4
printf("a的地址=%d\n",&a);//&是取地址符号,这里输出a的地址
printf("b的地址=%d\n",&b);//输出b的地址
printf("c的地址=%d\n",&c);//输出c的地址
printf("d的地址=%d\n",&d);//输出d的地址
printf("c的值=%d\n",c); //c是一个指针变量,存放的是b的地址,所以这里输出的是c所指向变量的地址,即b的地址
printf("*c的结果=%d\n",*c);//c本身存放的是b的地址,*c根据b的地址去找b,结果为4
printf("d的值=%d\n",d);//d里面存放的是c的地址,这里输出c的地址
printf("*d的结果=%d\n",*d); //d里面存放的是c的地址,*d就是根据c的地址去找c,而c里面存放的是b的地址,所以这里输出b的地址
printf("**d的结果=%d\n",**d); //同上,*d表示b的地址,**d就是根据b的地址去找b,这里输出的是b的值,结果为4
printf("%d\n",*&a);//&a是取a的地址,*&a就是根据a的地址去找a,结果为3
printf("%d\n",&**d);//同上,*d就是c,*c就是b,&b就是取b的地址
printf("%d\n",*&**&d); //&d是取d的地址,*&d就是d里面存放的c的地址,相当于d,*&*d,*d根据c的地址寻找c,*&c,&c就是取c的地址,*&c就是c指向的b的地址。
每个数据类型都有它的取值范围。编译器会根据每个变量或常量的数据类型为其分配内存空间。Java 为数值、字符值和布尔值数据提供了八种基本数据类型。