Java基础(10)——小结与填坑
前面都写了9篇啦,虽然断断续续发了半个月,写着写着会发现每篇中都有些比较重要的地方没有讲到~这篇还是需要填一填目前我已发现的坑了~
一、 小结
- Java编译命令 javac、运行命令java
- java默认字符编码为Unicode
- Java程序从main方法开始
- 每一个语句都需要以英文分号结束。
- 程序会被{}划分出范围。
- 类型与方法都需要定义在{}中
- 对于空格通常不影响代码运行
- Java 中的标识符就是类名、变量名、方法名、包名。
- 关键字、保留字全部都是小写,比如null。
- 变量名可以由字母、数字、下划线、美元符组成,但标识符不能以数字开头,也不能是关键字,区分大小写。
- 变量类型分为基本数据类型和引用数据类型
- byte的取值范围是-128~127
- 常量定义之后,不会改变
- 注释有//、/**/、/** ... */
- 运算符涉及到优先级,建议加好()
- =号是赋值,==号是相等
- 选择结构的条件必须为布尔表达式,返回值必须为true或者false
- break会使程序跳出循环,continue只会跳过该次循环。
- System.out.print()是输出语句,System.out.println()是自带换行
- 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 = ; // 初始化变量。将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);//
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。
Java基础(10)——小结与填坑的更多相关文章
- JAVA基础(零)—— 踩坑与错误(常更)
JAVA基础(零)-- 踩坑与错误(常更) 1 坑 考虑输入为null的情况 自动转换 x/Math.pow(10,i)*Math.pow(10,i) //由于math.pow()返回double类型 ...
- Java基础10 接口的继承与抽象类
链接地址:http://www.cnblogs.com/vamei/archive/2013/03/31/2982240.html 作者:Vamei 出处:http://www.cnblogs.com ...
- Java基础10:全面解读Java异常
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
- Java 基础知识点小结
小知识点 所有的程序,都要定义在类里面: 异常 定义方法时,使用 throws 可以用来捕获方法体内没有捕获的异常,然后以 SomeException 抛出异常 java是解释型语言.java虚拟机能 ...
- JAVA基础关键字小结一
基础部分总是看起来简单,若要明白原理和使用场景,需要慢慢的体会. 本文对常用的关键字如final,transient,volatile,static以及foreach循环的原理重新梳理了一遍. 一.f ...
- Java基础10 接口的继承与抽象类(转载)
接口继承 接口继承(inheritance)与类继承很类似,就是以被继承的interface为基础,增添新增的接口方法原型.比如,我们以Cup作为原interface: interface Cup{ ...
- java基础(10):继承、抽象类
1. 继承 1.1 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系.例如公司中的研发部员工和维护部员工 ...
- java基础(10)---leetcode的String、数组以及集合的一些使用
整数 一.整数反转_7 /* 12345 变成 54321 */ public class 整数反转_7 { public static void main(String[] args){ int x ...
- Java基础数据类型小结
1. 记忆中的数据类型: 记忆中java一共有八种基础数据:boolean,byte,char,int,long,float,double,还有一种记不起来. 他们的长度分别为: 他们的用处 ...
随机推荐
- 透明数据加密 (TDE)常见问题解答
透明数据加密 (TDE)常见问题解答问题任何人只要有权访问加密数据就能对其进行解密吗?TDE 会带来哪些开销?哪些加密算法可与 TDE 一同使用?可以使用第三方加密算法代替 TDE 提供的算法吗?可以 ...
- Docker部署常见问题
一.删除容器和镜像 在删除镜像之前要先用 docker rm 删掉依赖于这个镜像的所有容器(哪怕是已经停止的容器),否则无法删除该镜像. 停止容器 # docker stop $(docker ps ...
- leetcode-682-Baseball Game
题目描述: You're now a baseball game point recorder. Given a list of strings, each string can be one of ...
- 获取指定<文字行数>的<高度>是多少 TextKit
- (CGSize)maxLineSizeWithLines:(NSInteger)lines constraintSize:(CGSize)size attributes:(NSDictionary ...
- print高亮显示
显示颜色格式:\033[显示方式;字体色;背景色m......[\033[0m] ------------------------------------------- --------------- ...
- 基础篇:3.1)规范化:3d草绘
本章目的:3d草绘不同于cad工程图,但也有自己的规范要求.草绘要多多练习. 1.建模草图绘制 草图是大多数 3D 模型的基础.通常,创建模型的第一步是绘制草图,随后可以从草图生成特征.将一个或多个特 ...
- odoo 二次开发的一些原理
一:self是什么 目前新版的Odoo中使用到的self,是对 游标cr.用户ID.模型.上下文.记录集.缓存 的封装. 我们可以通过 self.XX 获取到这些封装的东西,比如:self.cr. ...
- Linux Shell脚本编程基础
1. 脚本是一个包含一系列命令序列的文本文件,当运行这个脚本文件时,文件中包含的命令序列将得到执行. 2. 脚本主要由两部分组成:脚本解释器和命令序列 注:#!/bin/bash 指明脚本解释器为Ba ...
- Mysql技术内幕笔记
mysql由以下几个部分组成: 连接池组件 管理服务和工具组件 sql接口组价 查询分析器组价 优化器组价 缓存(cache)组价 插件式存储引擎 物理文件. 可以看出,MySQL数据库区别于其他数据 ...
- JAVA学习4:用Maven创建Struts2项目
采用struts版本:struts-2.3.8 一.创建一个web项目 参考前面文章,项目名:maven-struts-demo. 二.配置pom.xml文件添加struts2依赖 <pro ...