您的位置 首页 java

《零基础学习Android开发》第二课 Java语言基础1

变量声明、数据类型、赋值语句、选择语句

一、为程序添加代码

  同学们上一课我们制作了第一个Android程序,虽然一行代码也没写,但是也算我们第一个作品。这次课我们要在这个基础上写代码,把功能丰富一下。我们可以尝试做一个扑克牌游戏。这个游戏叫21点,规则是两个人玩,每个人可以不停地叫牌,最后两个人手里的牌比大小,大的那个人赢。同时还有一条规则,就是叫牌的时候,如果手里的牌加起来超过21点了,也算输。

  我们现在开始做这个程序。但是我们遇到一个问题,就是因为大家是零基础嘛,根本不知道该如何表达上面所说的那个逻辑。其实编程语言和我们学习外语时是一样的,当你掌握的语言知识越多,你能表达的意思就能越复杂、越丰富。但是因为同学们是零基础,就只能从最简单的表达来开始,我们先把最核心的部分表达出来。我们重新把上面的那段话(用程序员的行话,叫“需求”)看一遍,可以看出一个最核心的部分其实是一个数值的判断,就是两个数比大小。然后再根据大小决定哪个人赢。

  刚才我们做的其实是一次最简单的“需求分析”的过程。把一段完整的需求里最核心也最简单的内容找了出来。这恰恰是符合程序 算法 设计的规律的!程序的运算逻辑称为“算法”(Algorithm),同学们在以后进行算法设计的时候一定要记住两个基本方法,那就是简化与分解。所谓“简化”,就是把复杂问题转为简单问题。所谓“分解”就是把大问题拆成小问题。刚才我们所做的需求分析,就是一次简化,最核心的内容是最简单的,也就非常好实现了。

  现在我们开始敲代码。【写代码时要注意, Java 对大小写是区分的,因此大小写不能随意变,一定要按我示例中的样子写。】

       int a = 8 + 12;
      int b = 5 + 11;
      char c = ' ';
      boolean j = a > b;

      if(j){
          c = '赢';
      }else{
          c = '输';
      }  

  这段代码就算没有编程语言基础的同学也能很快就理解,就是声明了两个变量,并通过比较这两个变量的大小来判断输赢。这就是这个扑克牌游戏的核心算法逻辑。也就是我们完成了前面所说的“简化”后的功能。下面呢,我们再进行分解,第一步通过比较,已经得出了结果。要让游戏玩家看到结果,我们需要将结果显示在界面上。这样,算法就被分解为两个部分,第一部分是比较运算,得出游戏结果,第二部分是显示结果。

  为了显示结果,我们需要做如下工作:我们找到activity_main.xml文件,在设计界面上选择“Hello World!”这段文字,可以看到它被选中了。这个东西是TextView,中文是文本视图,是一种Widget,中文叫“微件”,也可以称为界面组件(Component),也有叫“控件”(Control)。这么多叫法其实是一回事,同学们知道就好了。点击它可以看到右边Attributes(属性)面板发生了变化,在这里我们要做两个设置,一个是在id部分,大家可以马上想到这是给这个组件进行命名,我们将其取名为txtResult。然后,因为显示的文字实现太小,我们找到txtSize属性,选为36sp。

  接着再敲下如下代码:

       TextView txtResult = (TextView)findViewById(R.id.txtResult);
      txtResult.setText(String.valueOf(c));  

  这段代码的意思是找到这个组件,并且把它的文本内容设为前面比较的结果。为了正常使用TextView这个widget,需要在前面加一个导入语句。

 import android.widget.TextView;  

  现在同学们先不用管是不是看得懂这段代码,先跟着我敲。代码敲得多了,陌生感少了,后面讲解概念时就会加快理解。代码输入之后,我们点击运行。在模拟器的界面上,我们看到输出了结果,显示的是“赢”。这是显而易见的。

二、计算机眼中的世界

  为了理解前面敲的代码,我们要开始学习Java语言的一些基础知识。

1. 一切不过都是数字!

  在开始讲Java之前,我要先问一个问题。同学们知道为什么计算机的名字叫“计算”机吗?这是因为它的本质就是一个算数的机器,只是它的运算能力很强,能进行很复杂的运算而且算得很快。有的同学又会问了,像上面代码中提到的两个整数,很好理解,因为这本来就是数。但如果是一段话,或者一张图片,就也是数吗?其实也是数。虽然文字本身不是数,但是文字的字符是有限的,英文字母总共是26个,包括大小写以及一些制表符之类的符号,总共也没有多少。它们就被做成了一张表,叫做ASCII码表,

字符在表中的位置是固定的。如果告诉计算机一个表中的编号,计算机就能找到这个字并按早已约定的方法将这个字显示出来。后来因为计算机技术的发展,要将世界上所有的文字都概括进去,就对ASCII表进行了扩展,发展出来Unicode表。Java中字符的编码使用的就是Unicode。我们可以新建一个文本文件,在里面先输入几个英文字母,如“hello world!”,再用EditPlus这个工具打开。打开以后点击工具栏上的“Hx”按钮,就可以看到几个数字,68,65,6C,6C,6F,20,77,6F,72,6C,64,21,大家要注意这里是用16进制表示的(16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这六个字母来分别表示10~15。字母不区分大小写。),68对应十进制就是104,在ASCII表里对应小写的h。我们可以一个个地在ASCII表里找到对应的字符,包括空格与叹号都有对应的索引。再在文本文件里输入“你好世界!”,再用EditPlus打开,我们看到后面的几个用十六进制表示的数字,这肯定是汉字的编码了。然后我们再用“记事本”打开这个文件,选择“文件>另存为…”,在这个对话框的编码部分可以看到Unicode编码的选项。如果在记事本里输入了不在默认的编码表里的字符,程序就会提示你另存切换字符编码表。

  至于图片呢?我们知道颜色是由红绿蓝三原色组成的,在计算机里每种颜色都是由其RGB值决定的,也就是红绿蓝各个部分的数值组合而成。一个RGB的值就是屏幕显示的一个点,称为像素(Pixle)。一个图片文件只要把图片文件上每一个点的颜色值都记录下来,我们就能看到一幅完整的图画了。我们用Windows自带的“画图”工具来给大家展示一下图片文件是怎么记录的。我们新建一个Bitmap位图(这是最原始的图片文件格式)。打开文件以后将大小调整为2×2,在工具栏上点击“编辑颜色,分别自定义两种颜色,RGB值分别为(255, 0, 0)和(0,255,0),也就是纯红与纯绿。

再将两种颜色分别点到图片两行的末端。

将这个图片保存为24位位图格式后,用EditPlus将其打开,我们可以看到图片文件也变成了一串数字。

  读这段数字可以知道以下信息:

  1. 42 4D对应的ASCII码是BM,表明这是一个BitMap位图文件。
  2. 46是该文件的大小,转换十进制是70,这个文件大小是70个字节。
  3. 两个2,表示的是宽和高都是2。
  4. 18表示的是用多少位表示一种像素的颜色,18转换十进制是24,说明这是24位位图文件,也就是3个字节表示一种像素。
  5. 第一个FF FF FF表示是白色,第二个00 00 FF表示是红色,对照图片可以看到是从底部和从左开始记录的。同时,跟我们常说的RGB的顺序,在存储的时候恰好是反的。第二个FF FF FF依然是白色,表示是第一行左边第一个像素的颜色,最后一个00 FF 00大家就可知道表示的是绿色。【至于每行为什么会有两个00,这是因为虽然我们存储一个像素的颜色只用24位,也就是3个字节,每个点的颜色都紧挨进行记录。记录两个点只需要48位,但给每行分配空间的时候最小单位却是32位,因此一行就分配64位,最后每行有16位就没有用到】

  位图文件是最简单的图片文件,它直接告诉计算机该在哪个像素显示什么颜色。其它的格式的图片文件都是在位图的基础上进行的升级,最重要的是进行了压缩,可以将图片文件的大小减少很多,比如说大家熟悉的jpg。但是jpg文件的数据在传输给显示器进行显示时,需要先进行解码将数据还原成与位图类似的格式再进行输出,但这部分工作已经进行了封装,对于程序员来说已经是“透明”的了。

  通过以上内容,大家就可以理解了,所有文本文件、图片文件里存的都是数字。其它的声音、视频等等文件也都是用不同的规则的数字。因此对于计算机来说:一切不过都是数字!它不用干别的就在那算数就行。【当然我们花了这么多时间去看文本文件与位图文件本质,并不只是为了说明这样一个事实。更重要的是让大家对文件有一个直观的认识,了解什么是文件,为以后在程序中对文件的处理有一个理论基础】

2. 编程的目的

  既然对于计算机来说,一切不过都是数字。那我们编写代码的目的其实就是告诉计算机两件事,一是有哪些数,二是该怎么算!因此程序的组成也就是两个部分:数和数的组织方式,即数据结构,和运算的逻辑,即算法。而所有的编程语言就是要把这两个部分的内容表达好。

  一个完整的编程语言,一般会包含如下内容:数据的声明与类型、 运算符 与关键词、3大语句(赋值、选择、循环)、数据结构、方法、类等。其中数据的声明与类型、数据结构是用于表达数和数的组织方式;剩余的除了类以外则是表达运算的逻辑;而类是最特殊的,它既包含数据结构又包含运算逻辑。

三、Java语言基础(一)

1. 数据的声明与类型

  同学们知道数分为整数(Integer)与实数(Real),实数有小数部分而整数没有。在计算机语言里则称为整数与 浮点数 (Floating-point)。在Java里整数具体分为byte、short、int、long四种类型,它们的区别是所占用的bit的数量是不同的,因而它们能表示的数的范围也不一样。具体区别如下:

  但是一般我们使用int类型就可以了,很少会用到其它整数类型,除非数据太大超出了范围才改用long。浮点数也分为两种类型,区别也是长度的不同:

  同样地一般我们用float也就够用了。

  现在回过头来看前面的代码:int a = 8 + 12; 就可以知道a是一个int类型的整数了。那a本身是什么意思呢?它是我们声明的一个变量,英文Variable。int a 的意思是让计算机在内存中划出32位的空间来存储一个整数,这个变量的名称就是a。“=”在Java中是一个运算符,表示把右边的运算结果赋给左边的变量,“=”就叫赋值运算符。这条语句的完整意思是声明一个名叫a 的整型变量,并且将8 + 12的运算结果作为初始值赋给a。最后作为一个完整的语句,以“;”结尾。【同学们在敲代码的时候一定要注意将输入法调整到半角英文的状态,如果输入的运算符和分号是中文式的就会出错】变量的意思是它的值以后可能通过新的赋值发生改变。但是有一种特殊的变量,在它被赋给初值以后就不能再发生改变。这种特殊变量就叫常量。Java中常量的声明是通过在变量前面加一个final关键词实现的,如:

  final int AA = 100;  

【一般为了使常量区别于变量,常量名往往采用全大写方式】这条语句我们声明了一个名为AA的常量,并且给它赋值为100。

  在这里要给大家介绍一下Java编程给变量取名的要求。变量的名称,还有后面要介绍的类名、方法名、包名等在编程中要取的名字都被称为标识符。Java的标识符,要按照以下规则:

  • 所有的标识符都应该以字母(A-Z 或者 a-z)、美元符($)、或者下划线(_)开始
  • 首字符之后可以是字母(A-Z 或者 a-z)、美元符($)、下划线(_)或数字的任何字符组合
  • 关键字不能用作标识符
  • 标识符是大小写敏感的

合法标识符举例:age、$salary、_value、__1_value

非法标识符举例:123abc、-salary

  我们再看代码的第三条语句:char c = ‘ ‘; 这里用到的是另一种数据类型,就是字符型char。大家通过前面的学习,知道字符型其实也是一个数,字符型的变量占有16位的bit,不同于整数与浮点数,char类型的数都是正数,因为字符本质是序号,而序号是不需要负数的。这条语句的意思是声明一个字符型的变量c,并将空格作为初始值赋给它。我们可以看到字符要用单引号 ‘ 给括起来,而且只能给一个字符,英文或者中文都可以。这是因为char的长度是16位,只能用于表示一个字符的序号。因为char类型本质上是正整数,因此可以直接给赋成数字,我们把if块里面的赋值改为87,运行一下就可以看到界面上显示出来了大写的字母“W”,因为大写W的ASCII码就是87。【大家可以自己根据ASCII表码再试试别的,看都能出来什么结果。还有的同学可以会问,如果我们要显示一句话该怎么办呢?这部分内容我们留到后面再讲,大家别急。】

  我们在前面的讲课内容中,同学们可以好几次听到 二进制 、bit(位)、byte(字节)、十六进制(八进制)等词。这里简单介绍一下。大家都知道计算机运算的数是使用的二进制,也说是只有0、1两个数字。这里因为对于芯片来说识别针脚的电平是高是低是简单的,这也就对应0和1两个数。同时在存储的时候每个存储单元也只用实现“无”或者“有”两个状态,让存储也变得很简单。这就是计算机系统要用二进制的原因。在存储空间里最小的单位是bit,中文是“位”,8个bit组成一个byte,中文是“字节”,往上还有2个byte组成一个word,中文是“字”。而3位二进制表示的二进制数的范围是0~7,正好是八进制,当我们看到一个八进制时,就马上能够知道在存储空间里这三位里每个bit里的存的是什么。同样的4位二进制的范围是0~15,正好是十六制,也方便我们知道四个bit里存的是什么。当然作为编程爱好者接触到对存储单元里bit这个级别的操作的机会是很少的,这里只是简单的介绍,感兴趣的同学可以自己找找资料深入了解。

【在这里我要讲一个关于程序员的笑话:有人向程序员借钱说:“借我1000块钱吧。”程序员很痛快地答应了,还说:“干脆给你1024吧,给你凑个整。”大家听出这个笑话的笑点了吧。】

  我们接着看下一句:boolean j = a > b; 右半部分是做一个比较,因为a的值确实是比b要大的,那么这个式子的结果就是对的,反之,则结果就是错的。由此我们知道通过这个比较只可能产生两个结果,也就是两种值,即“对”或者“错”,这两个值在Java语言里就是true和 false 【注意:是全小写,不能错】。而存储这种值的变量的类型就是boolean类型,中文叫布尔类型。布尔类型对代码的逻辑很重要,因为需要根据它的值来决定程序下一步是往一个方向走。当然布尔类型本质上也是数,true是1,false就是0。但因为Java语言比较严谨,它不允许对布尔类型进行直接数值的赋值,而必须使用保留字true与false,这一点与别的语言(比如C/C++)是不一样的,大家要注意。

  好,到这里为止,我们就学完了Java语言里所有的基本数据类型,它们之间的关系可以用下面的图来表示。

  当然,这不是Java语言数据类型的全部,全部类型是下面这张图,

  在这张完整的图里,可以看到除了基本类型还有引用类型与null即空类型,这个留到以后再讲。

  【我们还掌握了变量与常量的声明与赋值。在Java语言里声明一个变量或常量时,必须明确其所属的类型,而有的语言如JavaScript(制作网页程序时会经常用到),声明变量时并不需要明确其类型,而是通过之后的赋值来确定其类型。这样JavaScript就获得了灵活性,相对应地Java语言则被称为“严谨”的语言。大家看“灵活”、“严谨”这都是好词,说明整这些词的这帮人都是些老滑头。当然这也是因为各有各的好处,灵活的语言上手快,严谨的语言则能减少犯错。

  我们在前面声明变量的同时就给它们赋了初值,其实只声明不赋初值也是可以的,比如:int a; 因为这样程序在编译时这个变量会自动获得一个默认值,除了布尔类型之外的所有基本类型变量的默认值都是0,而布尔类型的默认值是false。但是我们现在声明的变量都是“局部变量”,局部变量没有默认值,所以大家现在声明变量的时候最好给赋上初值,免得后面没有赋值IDE报错。/*但是有的IDE不支持这种默认值的方式,像Android Studio如果发现声明而没有赋初值的变量在后面的代码中没有被赋值,就会有错误提示“Variable XX might not have been initialized”,即该变量可能没初始化,因而不能通过编译。因此,我在实际编程中不推荐不赋初值的声明方式,随手给变量一个初值就行,省得以后麻烦。*/】

2. 运算符与关键词

  通过前面的几行代码,我们接触到了变量、数据类型等知识点,其实还有一个知识点就是运算符,前面看到的 + > 都是运算符。运算符包括以下:

算术运算符 : +,-,*,/,%,++,–

赋值运算符: = 以及扩展赋值运算符 +=,-=,*=,/= 等

关系运算符: >,<,>=,<=,==,!=

布尔逻辑运算符: !,&&,||

  算术运算符中 +,-,*,/ 这些好理解,%是模运算符。要把 / 与 % 这两个运算符结合起来理解。在两个整数类型的变量进行除法运算时,其结果一定还是整数!/ 运算返回的结果是除法的商,把余数舍去了。而 % 运算则是返回余数。例如:5除以3,其商是1,而余数则是2。我们用以下代码试一下:

 int a = 5 / 3; // 结果是1
int b = 5 % 3; // 结果是2  

  而在 / 运算中,只要被除数变量与除数变量中有一个是浮点数变量(即 float 或 double)那么其结果就是一个浮点数,就能保留小数部分。但是这个结果也要赋给浮点数,才能保留小数部分。赋给整数类型变量其值只会截取整数部分(注意:不是四舍五入)。

  ++,– 是自增与自减运算符,它们的作用是将变量自身加一(或减一)以后再将结果赋给这个变量。也即 a++ 等同于 a = a + 1,a– 等同于 a = a – 1。

  赋值运算符 = 前面已经接触过,就是把右边的值赋给左边的变量。扩展赋值运算符则是将变量进行运算的结果赋给自己的语句进行简化的记法,如 a = a + 2可以改成 a += 2。对应地 -=, *=, /= 就很好理解了。这里面 += 与 -= 常用一些。

  接着说关系运算符。关系运算符就是比较两个变量的值,判断其是否与预期一致,如果一致则结果为true,反之结果为false。其中>,<,>=,<=很好理解。== 就是判断两个值是否相等,因为 = 已经被用作赋值了,就用 == 来表示相等的意思,!= 就是不等于。因为运算结果是true或false,因此结果只能赋给布尔类型变量。

  以上运算符除了==可以用于布尔类型变量之间的运算,其它都不能用。这也好理解,因为布尔类型的值就是真和假,没有进行加减或者比较大小的必要。布尔类型变量有专用的运算符:!,&&,||。其中 ! 是“非”运算符,也就是结果是相反的,原来是true,则运算结果是false。例如:

   boolean x = true;
  boolean y = !x; // y的值是false  

  !是一元运算符,也就是它只作用于一个变量。这个部分向同学们介绍的运算符中除了 ! 的其它运算符都是二元运算符,也就是作用于二个变量。剩下的两个布尔逻辑运算符&&, || 分别是“与”运算符与“或”运算符。与运算时,只有两个变量的值都为true时,其结果才是true,否则结果是false。或运算则只要两个变量中有一个变量为true,其结果就是true,那么我也就知道要或运算的结果是false,则需要两个变量的值同时为false。举例如下:

 boolean i = true, j= true, k = false, r = false;//如果是同类型的变量可以写在一行,中间用逗号隔开
boolean s = i && j; // 结果为true
boolean t = i && k; // 结果为false
boolean o = k && r; // 结果为false
boolean p = i || j; // 结果为true
boolean q = i || k; // 结果为true
boolean u = k || r; // 结果为false  

  运算符我们就先讲到这里,这并不是Java运算符的全部,还有一些知识等我们遇到的时候再学习,就不在这里堆砌了。课程到这大家对变量、变量类型以及运算符有了一个大致的了解。在这里还要跟大家提一个关键词(Keywords)的概念,这里的关键词不是大家在网上开玩笑的“你爸是老板,我爸是关键词”那种,而是被Java语言规范保留的代表特定意义的词,像前面提到的数据类型名称都是关键词,if, else之类逻辑词以及final之类的修饰词也是关键词。关键词在IDE中会被高亮显示,而且我们给变量取名时不能跟关键词一样(改变大小写是可以的)。

3. 选择语句

  同学们,通过对变量、数据类型和运算符的讲解,恭喜大家可以看懂代码的前4行了,我们继续往下讲解。if 开头的这个部分是选择语句,前面我说过代码的语句分为3种,即赋值、选择与循环。赋值已经讲过了,选择语句则根据给定的布尔类型变量的值的结果决定是执行不同部分的代码,如果是true,执行 if 部分的语句,否则执行 else 部分的语句。我们这部分代码是完整的形式,也可以省掉 else 部分。如:

       if ( a > b){
      // Do something
      }  

  给大家讲一个关于if语句的笑话:

老婆给当程序员的老公打电话:“下班顺路买一斤包子带回来,如果看到卖西瓜的,就买一个。”

当晚,程序员老公手捧一个包子进了家门……

老婆怒道:“你怎么就买了一个包子?!”

老公回答:“因为看到了卖西瓜的。”

  大家能理解这个笑话的笑点吧。

  选择语句还有一种方式是使用switch,它与 if 的区别是:if 只有两个选择分支,而 switch 可以有更多。switch语句使用示例如下:

     int a = 5;
    swith(a){
        case 0:
            // Do something
        
            break;
        case 1:
            // Do something
        
            break;
        default:
            // Do something
    }  

  这个很好理解,就是根据 a 的值决定去执行哪个分支,如果 a 的值与给定的分支的值都不相等,则执行default部分,也就是默认部分。default部分是可以不写的。有几点需要注意:

  1. if 语句中的作为选择依据的变量只能是布尔类型,而 switch 则是用的整数类型和字符型(也是整数)。
  2. 每个分支的代码最后要加上break,以跳过后面的分支。如果不加,再会顺序往下执行。

  switch语句的分支多,而且是数字,那么问题就来了,时间长了有可能自己都不记得数字是什么意思了。这里给同学们介绍一个技巧,为了使分支看起来更直观,可以用两种办法。一是用字符类型的变量,可以用一个字符来表示大概的意思。二是用常量。我们通过设置一个整数类型的常量,将常量名称取得比较有意思,分支的值使用常量就能很准确地表示这个分支的作用了。

4. 注释

  前面的讲解中用双正斜杠起头的语句是注释。注释不会被执行,只是给代码提供说明。注释常用的是单行注释,使用 // ,多行注释使用/* 开头,用 */ 结束。注释是代码很重要的组成部分,优秀的程序员一定有良好的注释习惯。注释作用是不仅能给自己做提示,更重要的是方便团队合作。

  本次课我们先是对21点扑克牌游戏的核心算法进行了实现,之后对其中涉及的Java语言基础知识进行了讲解。对这一课的内容,我们做一个简单的总结:

  1. 对程序功能的实现我们做了简单的需求分析,采用的是“简化”与“分解”的思维方法,实现了功能的最基本也是最核心的部分。这两种思维方法在以后我们会经常用到。
  2. 我们通过对不同文件本质的揭示,理解了“对于计算机来说,一切不过都是数字”这一真理。
  3. 编程语言的作用就是告诉计算机两件事:有哪些数和该怎么算这些数。因此所以语言都包括两个部分,即数和数的组织方式,即数据结构,和运算的逻辑,即算法。
  4. Java语言的内容包括:数据的声明与类型、运算符与保留字、3大语句(赋值、选择、循环)、数据结构、方法、类等。其中数据的声明与类型、数据结构是用于表达数和数的组织方式;剩余的除了类以外则是表达运算的逻辑;而类是最特殊的,它既包含数据结构又包含运算逻辑。【剩下的内容我们会逐渐接触到】
  5. 变量、常量的声明与赋值。标识符的命名规则。
  6. Java基本数据类型包括:整数、浮点数、字符和布尔等类型。
  7. 运算符我们这次接触了算术运算符、关系运算符、赋值运算符和布尔类型运算符。
  8. 3大语句我们这次学习了赋值与选择语句。选择语句有 if 和 switch 两种形式。

文章来源:智云一二三科技

文章标题:《零基础学习Android开发》第二课 Java语言基础1

文章地址:https://www.zhihuclub.com/186674.shtml

关于作者: 智云科技

热门文章

网站地图