【Java核心技术-基础篇】基本语法(一)

在进行基本语法正式内容的介绍之前,还要讲两个东西,就是变量常量

变量


Java中,每一个变量属于一种类型(type)。在声明变量的时候,必须指明变量所属的类型并且写在变量名之前。例如:

byte flag;
int number;
long earthPopular;
boolean isDone;

需要注意的是,Java变量的明明遵循驼峰命名法,即单个单词字母小写,多个单词组成的变量名第一个单词小写,后面其他单词首字母大写,其余字母小写

  • 可以看出的是:每个声明以分号结束。由于声明是一条完整的语句,所以必须以分号结束。
  • 变量名必须是一个以字母开头的由字母或数字构成的序列。变量名是由字母、数字、下划线、$等所组成,且变量名的第一个字符必须是字母,且不允许空格和符号。(变量名还可以由一些在某种语言中代表字母的任何Unicode字符组成,但不建议,个人觉得还是字母+数字的组合最优)。
  • 大小写敏感没有长度限制
  • 不能将变量名命名为Java保留字

变量的声明还有一种方式——一行声明多个变量:
int i, j; // 都是int类型
但是不提倡这种风格。逐一声明每一个变量可以提高程序的可读性

变量初始化

声明一个变量之后,必须用赋值语句对变量进行显示初始化,千万不能使用未被初始化的变量。例如:

int number;
System.out.prinln(number);  // Error--variable not initialized Java编译器会提示变量未初始化

对变量赋值有两种方式,第一种,先声明,再赋值:

int number;
number = 12;

第二种,变量的声明和初始化赋值在同一行:

int number = 12;

在C语言和C++中,变量又有变量声明和定义的区分,例如int i = 10就是一个定义,且只能放在程序最开始。这不同于JavaJava中没有定义和声明的区分,且int i = 10可以放在程序任意合法的位置,不局限于程序开始部分。

常量


Java中,利用关键字final指示常量。例如:

final double CONST_SIZE = 24.0;

关键字final表示这个变量只能被赋值一次,一旦被赋值后就不能再更改了。习惯上常量名使用全大写,多单词使用_分开。
Java中,如果希望某个常量可以在一个类的多个方法中使用,通常称为类常量。使用static final关键字来设置一个类常量。例如:

public class Constants{
    public static final double CONST_SIZE = 24.0;
    public function1(){
        System.out.print(CONST_SIZE);
    }
    public function2(){
        System.out.print(CONST_SIZE);
    }
}

类常量的定义通常位于main方法外部。因此,在同一个类的其他方法中也可以使用这个常量。而当常量被声明为public,那么其他类可以通过类名+常量名来使用这个常量。如上述代码中的常量就可以通过Constants.CONST_SIZE来使用了。

虽然Java使用关键字final来设置常量,但const仍然是Java保留的关键字,只是目前没有使用。

基本运算


Java中,使用算术运算符+-*/表示加、减、乘、除运算。但参与/运算的两个操作数都是整数时,表示整数出发;否则表示浮点出发。整数的求余(取模)操作用%表示。来看代码:

System.out.println("3/2=" + (3 / 2 ));
System.out.println("3.0/2=" + (3.0 / 2));

输出结果:

3/2=1
3.0/2=1.5

从数学结果上看,3/2应该等于1.5,可以理解为int/int=int,而1.5是浮点数,所以小数部分丢弃,得1。注意,我说的是你可这样理解,但是实际上不是这样的。在计算机内部,除法的运算是通过移位->相加实现的,有兴趣可以拓展阅读——CSDN-计算机计算乘除法的原理

需要注意,整数除以0会产生一个·java.lang.ArithmeticException: / by zero异常,而浮点数除以0会得到无穷大或NaN结果。

赋值语句中可以采用一种简化的格式书写二元算术运算符,如:
x += 4;
等价于
x = x + 4;
-*/%同理。(通常,将运算符放在赋值号的左侧,如*=%=

自增/自减运算符

加法和减法运算中,如果是x = x + 1这样的算式可以写成x += 1,还可以更加简化x++,同样,x = x - 1也可以简化成x--。这就是常说的自增/自减运算符。例如:

int n = 10;
System.out.println("before n:" + n);
n++;
System.out.println("after n:" + n);

输出结果:

before n:10
after n:11

关系运算符和boolean运算符

Java包含各种各种关系运算符:

  • == 检测是否相等
  • != 检测是否不相等,与==相对
  • ><<=>= 分别是大于、小于、小于等于、大于等于

在这里,一定一定要注意===的区别。在几乎所有编程语言中,=的意义不是数学中的“相等”而是“赋值”,而==才是数学上“相等”的判断。后续if~else语句中使用的较多。

  • && 逻辑“与”
  • || 逻辑“或”
  • ! 逻辑“非”,常见与!=一起用表示“不等于”

逻辑与:expression1 && expression2
逻辑或:expression1 || expression2
&&||是按照短路方式求值的。&&:如果第一个表达式为False,结果不可能为真,则不必计算第二个表达式,结果自动为False||:如果第一个表达式为True,结果必为真,则不必计算第二个表达式,结果自动为True

Java支持三元操作符?:。表达式:
condition ? expression1 : expression2
当条件conditon为真时计算第一个表达式,否则计算第二个表达式。

位运算符

在处理整型数值时,可以直接对组成整型数值的各个位进行操作。这意味着可以使用屏蔽技术获得整数中的各个位。位运算符包括

  • &
  • |
  • ^ 异或
  • ~

关于位运算暂时就介绍这一点内容,知道位运算是对数的二进制形式进行操作的,在算法设计中以及加密运用广泛。有兴趣的自行了解,或者之后我通过专题的形式再做介绍。

基本语句/流程控制


基本语句,又称为流程控制。对Java而言,一个;表示一条语句结束,而Java也和其他程序设计语言一样,使用条件语句和循环结构控制流程。Java没有goto语句。

是时候祭出我最爱的“Hello world”了,不过这次换成了“Helo AZSG”:

public class BasicStatement {
    public static void main(String[] args){
        System.out.println("Hello AZSG!!!!");
    }
}

有过C语言编程经验的应该可以很快地知道这个main是什么了。public class BasicStatement{}是一个类,暂时不需要知道它有什么作用,注意大括号里面包含的public static void main(String[] args){},它是一个方法,方法名为main,你应该知道的是,对Java而言,main方法就是打开它的“钥匙”,也称作“程序入口”,也就是说,Java的代码首先从这个方法里面开始执行的。而执行的语句就是大括号里面包含的System.out.println("Hello AZSG!!!!");,这条代码的意思是在控制台打印Hello AZSG!!!!这几个字符。

块作用域

在学习控制结构之前,先了解一下块(block)的概念。
块,也就是通常说的“复合语句”,是由一对大括号(或者说花括号){}括起来的若干条简单的Java语句。块确定了变量的作用域。一个块可以嵌套在另一个块中。例如:

public class BasicStatement {
    public static void main(String[] args){
        int n;
        {
            int k;
        }
    }
}

但是不能在嵌套的两个块中声明同名的变量。例如以下代码就有错误,无法编译:

public class BasicStatement {
    public static void main(String[] args){
        int n;
        {
            int k;
            int n;  // ERROR--Variable 'n' is alread defined in the scope
        }
    }
}

再看看这段代码

public class BasicStatement {
    public static void main(String[] args){
        int n = 10;
        {
            int k = 12;
        }
        k = 12;  // can't resolve symbol 'k'
    }
}

编译器会提示can't resolve symbol 'k',也就是提示我们说'k'这个变量不存在!因为'k'变量声明的时候外面套了一层{},而k=12'k'重新赋值的这条语句又在'k'声明的外部,所以编译器就找不到'k'咯。再回头看看我前面说的——块确定了变量的作用域。能理解吗?能理解就太好了,要是不能理解的话,我会在后面梳理对象和类的部分再进行详细讲解,当然你也可以随时在QQ群内提问会给你一一解答的。

条件语句

Java中,条件语句的格式为
if (condition) statement
条件statement需要用括号{}括起来
例如:

public class BasicStatement {
    public static void main(String[] args) {
        int n = 10;
        if (n != 0){
            System.out.println("n的值不为0");
        }
    }
}

n的值不等于0,那么执行System.out.println("n的值不为0");
但是一般情况下常见的条件语句格式是这样的:
if (condition) statement1 else statement2
例如:

public class BasicStatement {
    public static void main(String[] args) {
        int x = 20;
        if (x >= 10) {
            x--;
        } else {
            x++;
        }
    }
}

当x的值大于或等于10的时候,执行x--,否则执行x++。其中else部分是可选的。
那么问题来了,以上案例都是针对单条件的判断语句, 针对对多条件进行判断操作当然也有方法,也就是完整的条件语句格式:
if (condition1) statement1 else if (condition2) statement2 esle statement3
给出完整的条件语句实例:

public class BasicStatement {
    public static void main(String[] args) {
        int x = 20;
        if (x == 1) {
            System.out.println("x==1");
        } else if (x == 2) {
            System.out.println("x==2");
        } else if (x == 3) {
            System.out.println("x==3");
        } else {
            System.out.println("x不为1、2、3");
        }
    }
}

可知else ifif用法相同,后面一定要跟条件,而语句是顺序执行下来的,当满足某个条件后,后续条件判断将不再执行,如果所有条件都未满足,则执行else后的语句。如上面代码,输出:x不为1、2、3

循环语句

  • while循环
    当条件为true时,while循环执行一条语句(也可以是一个语句块)。常用格式为
    while (condition) statement
    如果开始循环条件值就为false,则while循环体一次也不执行。
    实例,有一个进度条,最大值是100,从0开始每次加1,当进度条满,则不再继续往上加:
public class BasicStatement {
    public static void main(String[] args) {
        int progress = 0;
        while (progress < 100) {
            progress += 1;
        }
        System.out.println("Progress的值为:" + progress);
    }
}

输出结果:Progress的值为:100

  • do-while循环
    while循环首先检测循环条件,因此循环体中的代码可能不被执行。如果要循环体至少执行一遍,就应该把检测条件放在最后使用do/while循环语句实现。语法格式:
    do statement while (condition);
    末尾的;千万不能省略,因为这代表了一条语句的终止。
    这种循环语句限制性语句块,再检测循环条件,然后重复执行语句,再检测循环条件,以此类推,知道不满足循环条件退出循环。以上述进度条实现为实例:
public class BasicStatement {
    public static void main(String[] args) {
        int progress2 = 0;
        do {
            progress2 += 1;
        } while (progress2 < 100);  // 切记分号不能省略
        System.out.println("Progress2的值为:" + progress2);
    }
}

输出结果:Progress2的值为:100,以上代码就不做过多解释了。下面解释一种特殊的循环结构——for循环

  • for循环
    又称确定循环,是支持迭代的一种通用结构,与while循环和do while循环不一样的时,for循环能够通过类似计数器的变量来控制迭代次数。例如,下面代码打印从0~9的数字:
public class BasicStatement {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println(i);
        }
    }
}

for语句的三部分应该对同一个计数器i变量进行初始化int i = 0、检测i < 10和更新i++

  • foreach循环
    foreach实际上是一种“通用for循环”,格式简化了很多,没有对计数器的操作。foreach循环的格式为for(datatype value : data),data是遍历对象,应该是继承了itreable接口的的数据类型,如数组、字符串、集合等。基本用法如下:
public class BasicStatement {
    public static void main(String[] args) {
        int[] numbs = {1, 2, 3, 4, 5};
        for (int j : numbs) {
            System.out.println(j);
        }
    }
}

switch多重选择

在处理多重选择的时候,使用if-else会显得比较笨拙,于是switch应运而生。以上述if-else的例子为例,使用switch来写:

public class BasicStatement {
    public static void main(String[] args) {
        int x = 20;
        switch (x) {
            case 1:
                System.out.println("x==1");
                break;
            case 2:
                System.out.println("x==2");
                break;
            case 3:
                System.out.println("x==3");
                break;
            default:
                System.out.println("x不为1、2、3");
                break;
        }
    }
}

switch语句比起if-else简化了很多,括号中不必写整条语句,只需要写需要选择的那个数,而在case后面直接填写值,就不用像if-else那样name==value类似这样去判断了。

特别需要注意的是,case后面的break;千万不能省略,否则它会继续进行下面的case继续判断下去,直到遇到break;或者switch语句结束。

本节内容我已上传github,点击跳转

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容