Java学习之路03---标识符、关键字、变数概念

459 阅读9分钟

架构图


前言

Java程式是一系列对象的集合,而对象之间透过彼此之间调用方法来达到开发目的,因此在认识Java程式前需要特别注意几个专有名词:

  1. 类(class): 一个抽象的模板,例如人,他有身高、体重等属性,有说话、跳舞等动作
  2. 对象(object): 一个类的实例,例如美国人、欧洲人等
  3. 方法(method): 包在类当中的函数,可以代表该类的行为,例如人会说话。一个类可以拥有多个方法
  4. 实例变数(Instance variables): 每个类都有专属的变数,并且可以拥有多种不同变数

接着来看看一个简单的java程式,其中标识符是对所有需要名字的组成部分的通称,关键字是java为了特殊目的保留的字段,不开放给开发者使用,变数是一个用来储存变动数值的内存记忆体名称

如果有学过其他程式语言的朋友应该可以看到几分相似之处:

标识符

Java标识符是package,class,interface,method或变数名的总称。而好的命名必须要能明确反映出作用。不过在在正确命名前我们需要了解那些命名是合法的哪些又是非法的

合法命名

例如以下的例子,可以使用英文大小写(大小写有别)、数字、下滑线、美元符等特殊字元

  • Hello
  • hello
  • hello123
  • _hello_
  • haha$$$haha
  • Public(首字母大写)
  • Void

非法命名

但是但是,知道可以用英文字母、数字、特殊字元来表示并不代表没有限制,例如不能以数字开头、避免使用关键字予保留字、名称之间不能有空白等

  • class
  • void
  • 1hello
  • abc 123

关键字

关键字是对编译器有特殊用意的词,这些关键字代表的意思会在后面介绍,我们先熟悉几个常见的就可以 例如

  • package
  • public
  • class
  • static
  • void

保留字是虽然现在没有作为关键字,但是在以后版本说不定会进行更新,例如等

  • goto(危险的傢伙)
  • const

不管是关键字还是保留字,在做标识符命名时应该避免使用

下面的表格是常见的关键字表,不用特别去背,用到的时候自然会记得,或者看编辑器是否有highlight就知道了

abstractbooleanbreakbytecasecatch
charclasscontinuedefaultdodouble
elseextendsfalsefinalfinallyfloat
forifimplementsimportnativeint
interfacelonginstanceofnewnullpackage
privateprotectedpublicreturnshortstatic
superswitchsynchronizedthisthrowthrows
transienttruetryvoidvolatilewhile

变数

变数是用来储存不断改变数值的一小块记忆体区块的总称,我们在编写java程式时需要注意三个重点,分别是

int i=10;
  • 变数类型(int)
  • 变数名(i)
  • 变数值(10)

因为变数也是标识符的一种,因此他的命名也具有相同的规范性,同时变数的命名有专属于它的一套特别规则

驼峰命名法 假如变数只有单一一个词,那麽变数名必须要全部小写 例如: age

若该变数名是由两个单词组成那麽第一个单词小写,第二个单词首字母大写 例如: lastDay

好的单词需要简短有力,让其他开发者一看就知道它代表的意思,并且可以清楚区分他是类、方法或是变数

class命名规则

Pascal命名法 Pascal命名法是针对类的命名法,他要求首字母必须大写 例如:

package com.imooc;

public class Hello{

	public static void main(String[] args) {
		int a = 10;
		System.out.println(a);
	}
}

基本变数类型

java主要的变数类型大概可以用下图来表示,本篇将会大致介绍基本变数类型的基础,详细变数的操作会在后篇提及

基本变数类型的学习重点在于变数存储范围以及变数存储代表的含意,学习使用不同变数类型目的在于依照场合使用最适合变数

变数在使用前一定要进行初始化

下表示java不同变数类型的范围以及含意:

变数类型意思佔用位元组
byte字节型1
short短整数型2
int整数型4
long长整数型8
float单经度浮点数4
double双精度符点数8
char字元型2
boolean布林型1

可以将储存范围小的变数赋值给储存范围大的变数,反过来则不行,学过相关程式语言的朋友应该也理解这个概念

float f=123.23f;
double d;
d=f;

整数

整数的范围 整数类型依照储存大小从小到大分别为,储存范围如下表:

类型最小值最大值
byte-128127
short-3276832767
int-2,147,483,6482,147,483,647
long-9,223,372,036,854,775,8089,223,372,036,854,775,807

整数的表达方式 在java程式中可以用简单的8, 10, 16进位来表达整数值

  • 8进制: 0开头
    • 012
    • 079
    • 067
  • 10进制
    • 123
    • 78
  • 16进制: 0x开头
    • 0x3c
    • 0xabc
    • 0xabcL/0xabcl(long类型限定后缀)
byte
  • 变数长度为1个byte
  • 主要用来代替整,节约空间用
  • 有符号
byte b1 = 127;
byte b2 = -128;
short
  • 变数长度为2个bytes
  • short类型也可以用来代替整数,节约空间
  • 有符号
short s1 = 123;
short s2 = -321;
int
  • 变数长度为4个bytes
  • 一般整型常数预设为int类型
  • 最常见的整数类型
  • 有符号
int i = 2147483647;
int i = 0;
long
  • 变数长度为8个bytes
  • 通常用来储存非常长的整数(大型系统)
  • 需要在变数后面加上后缀
  • 有符号
long i = 2147483648; // 没有后缀的情况下,预设是int类型,编译会出错
long l = 123456L; // 后缀L或l可以代表long类型,不过通常会写大写以免l与1混淆

byte与short不用加上后缀 在java中常数预设是int类型,也就是说整数范围在-2,147,483,648~2,147,483,647。 如果使用long赋值时整数值超出,就要告诉编译器这个常数是long型。相反的byteshort的范围均在int之内,所以不需要增加后缀来增加常数表达长度,不过要注意赋值时不要超过宣告的变数范围,不然就要使用转型

浮点数

具有小数点的变数类型,常用于高精度计算,如果没有特定后缀,预设会将浮点数类型宣告成double,这点要特别注意

float f1 = 123.456; // 错误,应该改成
float f2 = 123.456f;
double d1 = 123.456d // 大小写没有限制
double d2 = 123.456D;

储存范围如下表:

类型最小数最小精度最大正整数
float-3.40E+381.4E-453.40E+38
double-1.79E+3084.9e-3241.79E+308

科学记号表示法 我们可以使用科学记号来表示浮点数

double d1 = 1.3e10;
double d2 = 1.3E10;

特殊表达方法

char c=.5; // c=0.5
float
  • 单精度的32位元浮点数
  • 要注意浮点数不能用来表示精准的值
  • 可以用float类型来节省double类型记忆体空间
float f1 = 0.239f;
float f2;
f2 = 0.239F;
double
  • 双精度64位元浮点数
  • 同样不能用来表达精确值
  • double类型是表达范围最广的变数类型
double d1 = 9453.9453d;
double d2;
d2 = 5942.5942D;
浮点数最精确值与最小值混淆点

有些书上会把最小值最精确值搞混,将float最小值写成1.4E-45,不过既然是有符号类型,那最小值一定是负数,这不就矛盾了吗

于是打开Float.class看看裡面的定义,果然找到一个常数MIN_VALUE,看了一下註解对它的解释该常数表示的最小正浮点数,也可以解释成float可以多精准。右侧的註解又提到大小为1.4e-45f跟书中最小值定义一样,还好有看註解,不然真的会被搞懵


由此可知真正的最小值应该是最大值取负,最大值在Float.class也可以找到MAX_VALUE这个值,大小是3.40E+38double的话就去参考Double.class就可以了

浮点的二进位表示方法可以参考之前写的文章


最后把这些常数定义打印出来,double check跟所学的没问题

字元类型

char类型是16bits无符号变数类型,它表示Unicode字元,其范围为0~65535

类型最小值最大值
char065535

在使用char类型数据赋值时应注意需使用' '单引号,但不能使用" "双引号

char c="h"; // c: Am I a joke to you?
char c='h' // 正确

整数表示

char c1='A'; // 可以用以下方法表示
char c2=0101; // 8进位
char c3=65; // 10进位
char c4=0x41; // 16进位

Unicode编码方法 根据Unicode Table的对应数做字面量的赋值

char a='\u0041' // 'A'

超出范围需要casting

char a = 65535; // 正常范围
char b = (char)65536 // 超出范围,需要进行casting

跳脱字元 字元中有代表特殊含意的跳脱字元,当跳脱字元放在字元阵列时,它会对后续的字元做特殊操作。常见的跳脱字元如下表

跳脱字元含意
\'单引号字元
\\反斜线字元
\ttab空行
\rEnter
\n换行字元
\bBackspace
\0null

字串类型

字串类型的变数,可以用来直接接收字串,注意字串类型要用两个双引号包起来

String s1 = "I Like Java!";

另外字串类型变数也可以用Unicode编码方式给值,例如我们可以将

String s1 = "ABC";

替换成

String s1="\u0041\u0042\u0043";

另外宣告字串类型后,要对它进行初始化操作,就算是是空字串,也要执行初始化

String s1=""; // 宣告时即初始化
String s2;
s2 = ""; // 宣告后再进行赋值

布林类型

java相对于C/C++不同,布林类型变数值只能是truefalse,不能是0或1。布林变数类型常用来做条件判断用

boolean b=true;
if(b) {
	System.out.print("boolean="+b);
}