黑马程序员——Java语言基础 笔记第一篇

来源:互联网 发布:兽娘动物园 知乎 编辑:程序博客网 时间:2024/06/05 15:28

java 语言基础—Java概述、环境的搭建、变量的数据类型、位运算符、流程控制语句

-----Java培训、Android培训、期待与您交流! -------

1 Java概述

1.1.  常见的dos命令

盘符: 进入指定的盘符下。

dir : 列出当前目录下的文件以及文件夹

md : 创建目录

rd : 删除目录    注意:rd不能删除非空的文件夹,而且只能用于删除文件夹。

cd : 进入指定目录

cd.. : 退回到上一级目录

cd \ : 退回到根目录

echo "hello java">a.txt  写入文本到指定文件 

type a.txt 显示文件内容命令

del : 删除文件    注意:不能删除文件夹,只能删除文件。

exit : 退出dos命令行

cls  : 通知计算机将当前的命令清空

*:  是通配符。

tab  命令补全。

方向键上下是找回上次你写过的命令。

 

    注:在dos命令行里用rd删除文件夹时,必须保证文件夹里面没有文件,此时可以单个的删除里边的文件,也可以使用del+文件夹的方式删除里边的所有文件。

技巧:当我们要进入一个目录,而目录名很长,如:目录名为woshiheimachengxuyuan,我们可以用 cd woshi*,用*代替后面文字的方式来简写,效率快。

 

1.2.  注释

    注释的作用:1、注解、说明、解释我们的程序,提高代码的阅读性。;2、调试程序。例如程序出现错误,可以例如注释来查找出错的地方。

    有三种注释方式:单行注释、多行注释、文档注释。

    单行注释://注释文字

    多行注释:/*-------中间可以有多行注释文字-------*/  注:多行注释不要嵌套多行注释。

    文档注释:是Java特有的注释,通常书写在类、域、构造函数、方法、定义之前。注释内容可以被JDK中的工具javadoc.exe所解析,生成一套以网页文件形式体现的该程序分说明文档。格式:例

    /**

    作者:

    版本:

    作用:

    等

    */

文档注释  (编写软件说明书)

1.         需要使用sum给我们提供的javadoc工具生成一个html的说明文档。

2.         只能抽取public的属性或者方法内容。

格式:

Javadoc –d 指定存储文档的路径  -version –author(可选)  目标文件

                  

       

 

         @author 作者

         @version 版本

         @param 方法的参数

         @return 返回值

 

初学者应该养成先写注释再写代码的习惯,因为代码仅仅是思想的一种体现形式而已。将自己的思想通过注释先整理出来,再用代码去体现,不要每行都加注释,也不要每行都不加注释。

 

1.3.   Java虚拟机(JVM)

Java Virtual Machine 一个软件模拟的计算机。Java源程序想象成我们的C源程序,Java源程序编译后生成的字节码(.class)就相当于C源程序编译后的二进制可执行文件。JVM虚拟机相当于计算机系统(操作系统+硬件环境),Java解释器相当于CPU。

.exe文件直接在windows操作系统下运行,在CPU上运行的是机器码(.exe文件)

.class字节码文件是运行在JVM虚拟机下的,在Java解释器上运行的是Java字节码。

Java解释器相当于运行Java字节码的“CPU”,但该“CPU”不是通过硬件实现的,而是用软件实现的。Java解释器实际上就是特定的平台下的一 个应用程序。只要实现了特定平台下的解释器程序,Java字节码就能通过解释器程序在该平台下运行,这是Java跨平台的根本。当前,并不是在所有的平台 下都有相应Java解释器程序,这也是Java并不能在所有的平台下都能运行的原因,它只能在已实现了Java解释器程序的平台下运行。

 

2 环境的搭建

2.1 JDK目录介绍

1.   bin目录:存放Java的编译器、解释器等工具(可执行文件)。

2.   db目录:JDK7附带的一个轻量级的数据库,名字叫做Derby。

3.   include目录:存放的调用系统资源的接口文件。

4.   jre目录:存放Java运行环境文件。

5.   lib目录:存放Java的类库文件。

6.   src.zip文件:JDK提供的类的源代码。

 

2.2 配置path环境变量

1、JAVA_HOME环境的配置

有时候可能需要更换Jdk的目录,但是经常修改path的值可能会不小心修改其他的路径,解决方法:

1、  创建一个JAVA_HOME的变量。

2、  JAVA_HOME的值为JDK的安装目录。

3、  配置path路径:%JAVA_HOME%/bin。

以后需要更换JDK的目录时,只需要更换JAVA_HOME的目录即可。

                   设置临时变量:

                            set: 查看所有的环境变量信息。

                     set  变量名 :查看具体一个环境变量的值。

set  变量名=:清空一个环境变量的值。

set  变量名=具体值 :给指定变量定义具体值。

想要在原有环境变量值基础上添加新值呢?

首先,通过%变量名%操作符获取到原有环境变量的值。

然后加上新值后在定义给该变量名即可

举例:给path环境变量加入新值

set  path=新值;%path%

注意:这种配置方式只在当前dos窗口有效。窗口关闭,配置消失。

 

2.3 classpath环境变量

1.   classpath的作用: 作用是指定类搜索路径,要使用已经编写好的类,前提当然是能够找到它们了,一旦配置了classpath路径信息的时候,jvm与java编译器都会根据classpath指定的路径去寻找class文件。

2.   如何设置当前目录(.)

set classpath=.;设置路径 与 set classpath=设置路径;.有什么区别?

“.”在前面的时候,java虚拟机会先从当前路径去寻找class文件,然后再到指定的路径去需找。如果”.”在后面,java虚拟机则会先寻找指定好的路径,然后再在当前的路径去寻找。

设置classpath的时候要加上 ; 就会在当前目录下查找。

2.4 疑问总结

1. JRE、JDK是什么

JRE  java运行环境   JRE = JAVA虚拟机+ 核心类库。

JDK  java开发工具集。  jdk = jre  + java开发工具

 

2. 配置path、JAVA_HOME、classpath的作用。

path: 为了让控制台在任意路径下都可以找到java的开发工具。

java_home:为了避免频繁修改path路径信息。 java_home保存的是jdk安装路径。

classpath: 设置class文件所在的路径。

 

3. 配置classpath的时候加上分号与不加分号的区别?

                  classpath如果添加分号,那么就先到classpath所配置的路径信息下去搜索class文件,如果找不到

         还会去到当前路径下去搜索。

         不添加 分号: 仅对去classpath配置路径信息下去搜索。

 

3 变量的数据类型

1. 整型

  byte   代表一个字节的大小   8bit  2(8)   -128~127        256

 short  代表两个字节的大小  16bit  2(16)  -2(15)~2(15)-1

  int    代表四个字节的大小  32bit  2(32)  -2(31)~2(31)-1

  long   代表八个字节的大小  64bit  2(64)  -2(63)~2(63)-1

  如果一个数值没有采取特殊的处理,那么该整数默认的类型是int

  可以使用数值后面添加L或小写L改变默认的整数类型。

2. 浮点型

   float  代表四个字节的大小  32bit

   double 代表八个字节的大小  64bit

java程序中所有的小数默认的类型是double类型,所以需要使用特殊的符号改变默认的小数类型。

3. 字符型

    char   代表两个字节的大小  16bit  2(16)

    原理:将字符映射为码表中对应的十进制数据加以存储。

4. 布尔型

     boolean  占一个字节。只有true与false两个值。

 

 

3.1表达式的数据类型自动提升

算术表达式,逻辑表达式                                   

所有的byte型、short型和char的值将被提升到int型。

如果一个操作数是long型,计算结果就是long型;

如果一个操作数是float型,计算结果就是float型;

如果一个操作数是double型,计算结果就是double型。

分析 System.out.println(‘a’+1)结果?

 

自动类型提升  

byte b = 3;

       int x = 4;

       x = x + b;// b会自动提升为int类型参与运算。

       System.out.println(x);// 7

 

 

强制类型转换 

byte b = 2;

       /*

        * 强制类型转换,强制将b+2强制转换为byte类型,再赋值给b

        */

       b = (byte) (b + 2);

       System.out.println(b);// 4

思考1

byte  b=126;

问:既然数据默认的有数据类型,那么126 默认是int类型的,为什么存储到byte类型时不会报错呢。

126 是常量java在编译时期会检查该常量(每个常量)是否超出byte类型的范围。如果没有可以赋值。

思考2:byte b=128;能否正常的编译和运行。

该语句会出现编译错误,128超出了byte变量的存储范围,所以出现编译错误。

 

思考2

byte b1=3,b2=4,b;

b=b1+b2;

b=3+4;

哪一句编译失败?为什么?

b =3+4, 3和4都是常量,所以java在编译时期会检查该常量(每个常量)是否超出byte类型的范围。如果没有可以赋值。例如b=128+1 就无法编译通过。b=127+1;也是无法通过。

b =b1+b2 不可以,因为b1 和b2 是变量,表达式求值时,变量值会自动提升为int型,表达式结果也就成了int型,这是要赋值给byte型的b,必须进行强制类型转换了。

 

思考 3

short s1 = 1;

 s1= s1+1;

 s1+=1;

问:s1= s1+1; s1+=1; 与有什么不同?

对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。

对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。

 

数据类型转换要注意的细节:

1.凡是byte 、char 、short数据类型数据在运算 的时候都会自动转换成int类型数据再运算的。

2.两个不同类型的数据在运算 的时候,结果取决于大的数据类型数据。

 

在做取模运算的时候结果的正负是取决于被除数。

    System.out.println("10%3 = "+(10%3));  //  1

    System.out.println("-10%3 = "+(-10%3)); //  -1 

    System.out.println("10%-3 = "+(10%-3)); //   1 

    System.out.println("-10%-3 = "+(-10%-3)); //  -1

 

i++ 后自增的运行原理:

    后自增实际上是是要使用到操作数没有加1之前的值的。 

    i = i++;

    先运算i++:

       int temp = i;

       i = i+1;

       return temp;

i存储的值的变化过程:

    0---->1--->0

 

比较运算符

    ==

作用:

    1. ==号用于基本类型数据的时候,判断的是两个基本类型变量的值是否相等。

    2. ==号用于引用类型数据的时候,判断的是两个引用类型变量是否指向同一个对象。

 

4 位运算符

规则:

可以把1当做true 0当做false

只有参与运算的两位都为1,&运算的结果才为1,否则就为0。

只有参加运算的两位都是0,| 运算的结果才是0,否则都是1。

只有参加运算的两位不同,^ 运算的结果才为1,否则就为0。

 

~ 反码

就是取反,二进制只有1和0,取反就是如果为1,取反就是0,如果是0,取反就是1。

0000-0000

0000-0000

0000-0000

0000-0110

6

1111-1111

1111-1111

1111-1111

1111-1001

取反 -7

System.out.println(~6);//-7

结论:当参与取反的数值是正数时,把对应的值加上负号,再-1

      当参与取反的数值是负数时,把对应的值加上负号,再-1

负数的表现形式就是对应的正数取反,再加1。负数的最高位肯定是1

负数表示

负数对应的正数的二进制-1,然后取反。

-6

0000-0000

0000-0000

0000-0000

0000-0110

6

1111-1111

1111-1111

1111-1111

1111-1001

取反

1111-1111

1111-1111

1111-1111

1111-1010

加1

 

异或特点

一个数异或同一个数两次,结果还是那个数. 用处一个简单的加密思想.

6^3^3

0000-0000

0000-0000

0000-0000

0000-0110

6

0000-0000

0000-0000

0000-0000

0000-0011

^3

0000-0000

0000-0000

0000-0000

0000-0101

 

0000-0000

0000-0000

0000-0000

0000-0011

^3

0000-0000

0000-0000

0000-0000

0000-0110

结果是6

5.流程控制语句

1、顺序语句

2、判断(if…else)

1.格式一 

if(判断条件){

         如果符合条件执行的代码;

         执行的代码块1;

         执行的代码块2;

         ……………….;

         执行的代码块n;

}

2.格式二

if(判断条件){

    执行的代码块1;

    执行的代码块2;

    ……………….; 

    执行的代码块n;

}else{

    执行的代码块1;

    执行的代码块2;

    ……………….;

    执行的代码块n;

}

if else 结构 简写格式: 变量 = (条件表达式)?表达式1:表达式2;

三元运算符:

好处:可以简化if else代码。

弊端:因为是一个运算符,所以运算完必须要有一个结果。

 

3. 格式三

if(判断条件1){

        执行的代码块1;

}else  if(判断条件2){

    执行语句;

}else if(判断条件3){

    执行语句;

}

 

 

3、选择判断语句(switch)

switch语句特点:

    1,switch语句选择的类型只有四种:byteshortint char

2,case之间与default没有顺序。先判断所有的case,没有匹配的case执行

default。

    3,switch语句停止的条件是遇到了break关键字或者结束switch语句的大括号。

    4,如果匹配的case或者default没有对应的break,那么程序会继续向下执行,运

行可以执行的语句,直到遇到break或者switch结尾结束。

    5,switch case中的值必须要与switch表达式的值具有相同的数据类型。而且case后跟的值必须是常量,不能跟变量。

 

if 和switch 语句很像,具体什么场景下,应用哪个语句呢?

如果判断的具体数值不多,而是符号byte,short int char 四种类型.

虽然2个语句都可以使用,建议使用switch语句.因为效率稍高.

其他情况:

对区间判断,对结果为boolean 类型判断,使用if if的使用范围更广。

if 除了能判断具体数值还能判断区间。switch 判断区间会很费劲的。要写好多case 对于运算结果是boolean型的 if 能判断 switch 是不能实现的。例如:根据学生考试成绩划分ABCD   A90-100  B80-89 C70-79 D60-69 E0-59。

 

实际开发怎么选择呢?

    如果要对具体数值进行判断,并且数值不多,那么 就用switch 来完成。switch的case条件都是编译期整数常量,编译器可以做到表格跳转查询,查找速度快。

但是switch 的局限性比较大必须是4种类型,并且值不多。一般都是使用if。 最后在jdk 7中对switch进行了增强还可以判断字符串。5.0 增加了对枚举的判断。

 

备注:JDK7.0开始可以使用switch可以使用字符串类型的数据了.

 

 

4、While循环

Java提供了三种类型的循环语句:while循环,do-while循环和for循环。

do while语句格式:

 

1、while语句格式

while(条件表达式)

{

    执行语句;

}

 

5、do while 语句

do

{

    执行语句;

}while(条件表达式);

do while特点是条件无论是否满足,

循环体至少被执行一次。

 

6、for 循环

1.格式:for(初始化表达式;循环条件表达式;循环后的操作表达式)

{

       执行语句;

}

 

总结:

1、for里面的两个表达式运行的顺序,初始化表达式只读一次,判断循环条件,为真就执行循环体,然后再执行循环后的操作表达式,接着继续判断循环条件,重复找个过程,直到条件不满足为止。

2、while与for可以互换,区别在于for为了循环而定义的变量在for循环结束时就在内存中释放。而while循环使用的变量在循环结束后还可以继续使用。

3、最简单无限循环格式:while(true) , for(;;),无限循环存在的原因是并不知道循环多少次,而是根据某些条件,来控制循环。推荐使用while(true)

 

 

经典的例子

forfor 嵌套for循环练习2

打印此种格式的图案

*****  

    ****

    ***

    **

    *

public static void main(String[] args) {

       for (intx = 5;x > 0;x--) {//行数

           for(int y=x;y>0;y--){//列数

              System.out.print("*");

           }

           System.out.println("");

       }

    }

 

练习:

*

**

***

****

*****

public static void main(String[] args) {

       for (intx = 0;x < 5;x++) {//行数

           for (int y = 0; y <=x; y++) {//列数

              System.out.print("*");

           }

           System.out.println("");

       }

 

}

 

     

  

 

 

 

 

 

 

 

 

练习:99乘法表

public class Test {

    public static void main(String[] args) {

       for(inti = 1 ;i<=9 ;i++){ //行数

           for(intj = 1;j<=i ;j++){ //列数

              System.out.print(i+"*"+j+"="+i*j+"\t");

           }

           System.out.println();//换行

       }

    }

}

 

7、break、continue关键字

break关键字break语句用于终止最近的封闭循环或它所在的 switch语句。控制传递给终止语句后面的语句(如果有的话)。

适用:for循环 、 switch两种循环语句。

break的用法:

1.   单独使用。

2.   与标签一起使用。(标签:即一个名字,满足标识符的条件即可)。

使用细节: 不要再break语句之后,编写其他语句,永远都执行不到,编译报错。

continue关键字语句将控制权传递给它所在的封闭迭代语句的下一次迭代。(跳出本循环,执行下一次循环)

适用于:while 、 do while 、 for循环语句

使用细节:

     1. 如果continue出现在循环的末尾(最后一条语句),那么可以省略。

     2. 如果continue出现在循环的第一条语句,那么后面的语句都无法执行,所以编译报错。

     3. 如果需要让continue作用于其他的循环语句呢?

解决方案: 配合标签的使用。

 

 

0 0
原创粉丝点击