Java基础(10)——小结与填坑

前面都写了9篇啦,虽然断断续续发了半个月,写着写着会发现每篇中都有些比较重要的地方没有讲到~这篇还是需要填一填目前我已发现的坑了~

一、 小结

  1. Java编译命令 javac、运行命令java
  2. java默认字符编码为Unicode
  3. Java程序从main方法开始
  4. 每一个语句都需要以英文分号结束。
  5. 程序会被{}划分出范围。
  6. 类型与方法都需要定义在{}中
  7. 对于空格通常不影响代码运行
  8. Java 中的标识符就是类名、变量名、方法名、包名。
  9. 关键字、保留字全部都是小写,比如null。
  10. 变量名可以由字母、数字、下划线、美元符组成,但标识符不能以数字开头,也不能是关键字,区分大小写。
  11. 变量类型分为基本数据类型和引用数据类型
  12. byte的取值范围是-128~127
  13. 常量定义之后,不会改变
  14. 注释有//、/**/、/** ... */
  15. 运算符涉及到优先级,建议加好()
  16. =号是赋值,==号是相等
  17. 选择结构的条件必须为布尔表达式,返回值必须为true或者false
  18. break会使程序跳出循环,continue只会跳过该次循环。
  19. System.out.print()是输出语句,System.out.println()是自带换行
  20. 1字节(byte) = 8位(bit)

二、Java的编译运行

写好源代码之后,我的学习记录里只有写到怎么用,却没有去详细解释流程,如此就造成了一些知其然而不知其所以然的问题,so,这里补充上:

首先,需要给几个定义:

Java虚拟机(JVM):是可以运行Java代码的虚拟计算机。只要电脑上安装有Java环境,就拥有JVM虚拟机。

字节码(Byte-code):是一种包含执行程序,由一序列 op 代码 / 数据对组成的二进制文件,是一种中间码。(百科)

机器码:指的是将硬件序列号经过一系列加密、散列形成的一串序列号。(百科)

1. 编译

写好代码后,保存的为 .java 文件,用 javac.exe(编译器)编译之后,编译器会先检查错误:

  如果有错,则编译无法完成,需要修改,直至修改到没错了,才能通过。

  如果没错,通过编译,产出一个字节码文件(.class)。

so,编译器:将Java源文件(.java)编译成字节码文件(.class文件,是特殊的二进制文件,二进制字节码文件)

字节码文件与平台是无关的,这也是JVM的平台无关性的来源。

2. 解释

编译完成后,JVM操作解释器将产生的字节码文件来解释。

解释器解释字节码的过程,就是将字节码文件解释成本机能够识别的机器码。

机器码与平台是有关的,不同平台的机器码不同。

解释由分成以下步骤:

  首先,通过类加载器(class loader)将所有代码装入解释器。

  然后,被装入的代码由字节码校验器进行检查,若无错误,则进入下一步。

3. 执行

Java字节码开始执行,这个也有两种方式:

    a. 即时编译方式:先将字节码编译成机器码,再执行该机器码。

    b. 解释执行方式:解释器通过每次解释并执行一小段代码来完成Java字节码程序的所有操作。

   通常情况下回采用解释执行方式,这样会使字节码翻译成机器码有更高的效率。当然,对于对运行速度要求较高的应用程序,还是选择即时编译比较好,可以很好的保证Java代码的可移植性以及高性能。

 三、变量的声明与初始化

在程序运行的过程中,内存有一部分的空间是变化的,这个空间就叫变量。那么声明变量就是申请了一个内存空间。内存空间在开辟之时,如果没有赋值的话,内存空间会根据变量的类型来设置默认值。

如果有赋值的话,就会将值存入内存空间,否则就是默认值。变量的用处:存放数据(可操作的存储空间)

int i;  // 声明变量。申请了一个内存空间,当前为int的默认值0
i = 1;  // 初始化变量。将i赋值为1

四、引用类型

对于引用类型来说,其默认值是null,没有任何指向的内存空间。

 

那么数组也是引用类型,在声明的时候如果没有直接给元素的话,那么其默认值为null。

五、逻辑运算符

关于逻辑运算符&&、||两者,有一点要十分注意:
这两个存在一个短路问题,意思就是前面第一个条件已经能够使表达式得出结果了,后面的条件就不用判断了。

比如:1>2&&2>1,那么这个因为1>2已经为假了,&&要求两个都为真才能返回True,所以后面的条件就不用计算,直接出返回结果。2>1 || 1>2,也是一样。

//短路与,第一个操作数的值为false,则不需要在计算后面的操作数
boolean a = 1>2&&2<(3/0);//如果不短路,则会抛出异常(被除数为0)
System.out.println(a);
//短路与,第一个操作数的值为true,则不需要在计算后面的操作数
boolean b = 1<2||2<(3/0);
System.out.println(b);

 

 

20190421补充 

A. 注释:

1. 注释不会出现在字节码文件中,即Java编译器编译时会跳过注释语句。

2. 多行注释的小技巧:可以当成行内注释使用,不会影响到后面的代码执行

B. 标识符

1. 因为Java采用的是Unicode编码,Unicode编码中也有汉字,所以用中文是可以的,但是不建议使用

附:各常用字符集之间的关系

C. 变量

1. 不建议一行定义多个变量

2. 浮点型变量的表示

十进制:1.109、11.09、110.9、1109、110900

科学计数法:1109e-3,、1109E-2、1109E-1、1109、1109E2

aEb:a乘10的b次方

3.浮点数是不精确的,一定不要用于比较!

float f = 0.1f;
double d = 1.0 / 10;
System.out.println(f == d); // 结果为false

float d1 = 423432423f;
float d2 = d1 + 1;
if (d1 == d2) {
    System.out.println("d1==d2");// 输出结果为d1==d2
} else { System.out.println("d1!=d2"); }

如果非要进行比较的话,可以使用java.math包下的BigInterger类以及BigDecimal类。

BigInterger实现了任意精度的整数运算、BigDecimal实现了任意精度的浮点运算

BigDecimal  bd2 = BigDecimal.valueOf(0.1);
BigDecimal  bd3 = BigDecimal.valueOf(1.0/10.0);
        
System.out.println(bd2.equals(bd3)); 

 4. char型变量只能用单引号,不能用双引号。可以使(int)变量或者0+变量来转成数字。String是字符序列(引用类型)

 5. boolean型变量在选择结构中,直接写:if(变量){}  即可,不推荐写成:if(变量==true){}

D. 数据类型

boolean的大小:理论上占一位,实际上单个的boolean类型在编译的时候使用的是int类型,占4个字节即32位,在数组中每一个 boolean 在 JVM 中占一个字节。转自:https://blog.csdn.net/u010642004/article/details/50099913

E. 常量

用final定义

1. 常量——常量,定义后无法更改的截图~

2. Java中整型变量的四种表现形式:

  • 二进制整数:0b01111101(要求以0b或0B开头)
  • 八进制整数:023(要求以0开头)
  • 十进制整数:99,-100
  • 十六进制证书:0x15(要求以0x或0X开头)
int  a = 0b1101;    //以0b开头是二进制
int  b = 0117;    //以0开头是八进制
int  c = 17;
int  d = 0x1f;    //以0x开头是16进制
        
System.out.println("二进制:"+a);
System.out.println("八进制:"+b);
System.out.println("十进制:"+c);
System.out.println("十六进制:"+d);

F. 二元运算规则

 1. 整数运算

  • 如果两个数有一个为long,结果类型为long
  • 两个操作数没有long时,不管原来是什么类型,结果为int类型

 2. 浮点运算

  • 如果两个数有一个为double,结果类型为double
  • 只有两个数都是float的时候,结果才是float

4. 取余运算

  • 取余的余数的正负取决于左边的数

5. 关系运算

  • ==、!=是所有(基本&引用)数据类型都能使用
  • >、>=、<、<=只有数值类型(整型和浮点型)以及char能够使用。
6. 字符串连接符 “+”

之前代码中经常出现“System.out.println("xx="+a);”,这样的输出语句,为了提示方便,所以我会在输出变量前加上字符串,然后会有一个加号,这个加好就是字符串连接符。

在使用 “+” 运算符连接字符串和 int 型(或 double 型)数据时,“+”将 int(或 double)型数据自动转换成 String 类型:(遇到字符串后,往后一行全是连接,括号里的除外(谁让括号是老大呢))

System.out.println(3+4);//  7
System.out.println(3+"4");//   3(连接)"4" = 34
System.out.println(3+4+"5");//   3(加法)4(连接)"5" = 75
System.out.println(3+4+3+"4");// 3(加法)4(加法)3(连接) "4" = 104
System.out.println(3+4+4+"3"+3);//   3(加法)4(加法)4 (连接) "3" (连接)3 = 1133

这个能看懂嘛⁄(⁄⁄•⁄ω⁄•⁄⁄)⁄

字符串连接符还有一个作用:当字符串很长的时候,可以用字符串连接符分成好几行来写:

System.out.println("我太长啦"
        + "真的,"
        + "不得不分成好几行来写!");

当然,+号叫字符串连接符,对于char字符型来说,它还是加法哈:(a在编码中为97)

System.out.println('a');//a
System.out.println(4+'a');//4+97=101

20190422 补充

A. 类型转换

1. 自动类型转换

容量小的数据类型可以自动转换成容量大的数据类型(容量是说的范围哦,转换时会损失一定的精度)

整型常量可以直接赋值给 byte、 short、 char 等类型变量,但是要求不超出其范围。

2. 在进行相对变量类型来说较大数值的计算的时候,要注意自动转换引起的数据溢出问题:

int money = 100000000; //1亿
int years = 22;
//int类型大约为21亿,wage为22亿,超过了int的范围
int wage = money*years;
System.out.println("wage="+wage);
//因为是两个int值相乘,所以结果仍然为int值,在转成long之前就已经造成了数据溢出
long wage1 = money*years; 
System.out.println("wage="+wage1);
//先将一个数变成long,以long型与int型进行计算,结果自动转为long型
long wage2 = money*((long)years); 
System.out.println("wage="+wage2);

输出结果:

所以建议大家在做运算的时候,如果结果有溢出的可能就将第一个操作数转型为更大的数据类型。


 

暂时先补充到这儿~以后发现没写到的再进行补充说明。

以上,阿里嘎多,20190420 from ahanwhite。

转载于:https://www.cnblogs.com/ahanwhite/p/10733507.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值