Java编程基础

参考资料

韩顺平 - 零基础 30 天学会 Java(900 多集,顺序安排很合理,每个知识真正的打碎了,通俗、有示例、有实战、有思想)
西安电子科技大学 - 王煦:Java程序设计
廖雪峰 Java 教程

Java 特点(看不懂没事,别背!)

通过JVM屏蔽底层操作系统的差异

环境搭建

JDK、JRE、JVM的关系?

JVM:Java Virtual Machine,Java虚拟机,构建于操作系统之上,用以屏蔽操作系统底层差异从而实现Java的跨平台特性。像是一个代理人,这种在上层应用和底层实现之间穿插一层从而屏蔽底层差异的方式是一种软件编程思想。比如我们的浏览器现在有多种,如果想屏蔽浏览器之间的差异,我们就可以自己实现一种语言运行于浏览器和语言之间从而屏蔽掉浏览器间的差异。
JRE:Java Runtime Environment,Java运行时环境,对于仅仅想要运行Java程序的普通用户而言只需要安装JRE即可。JRE包含了JVM和Java运行时的一些核心类库。
JDK:Java Development Kit,Java开发工具包,对于想要开发Java程序的Java程序员而言,仅仅拥有JRE就不够了,还需要有javac(compiler),debugger,javadoc等常用开发工具。人如其名,JDK就是开发工具包。(好像白解释了。。。)

编程语言开发应用时都需要部署开发环境,从而给开发人员提供一些好用的开发工具。因为操作系统本身可能是不提供的,比如用c语言开发我们需要安装gcc,用python开发我们需要安装python等等。一般去所用语言的官网都能获取到相关的开发工具包。

path是什么?

操作系统刚开始的时候,只有一个内核,用以跟硬件打交道,即便是程序员也会感觉很难用,更别说普通的用户了。为了让操作系统更好用,人们在操作系统外面封装了一层来跟用户交互,因为像是在的外面套了层,所以就干脆把这个东西叫做shell了。再后来,操作系统有了图形界面,英文叫做GUI(Graph User Interface)就是我们现在经常用到的了。但是shell还保留在操作系统里面,一个操作系统就算没有图形界面,也一定会有shell,比如Windows里面有Dos,MacOS里面有终端,其实起到的都是同样的作用,只是在不同操作系统下实现不一样。
有了shell,我们就能通过命令行的方式来让操作系统帮我们干一些事情。而每一个命令其实在背后都是一个程序,你想想,计算机只会识别0/1,事情不会无中生有,怎么你输入了一个命令操作系统就能帮你干一件事呢,肯定有人在背后帮你编写了一些程序。那些人帮你编写了程序,怎么让操作系统知道在哪儿呢?一种是让你的shell工作目录在你程序所在的文件夹,但是这样会很麻烦,有没有种不管我们shell在哪个目录都能运行这个程序的方式呢?path就起到了这么个作用,操作系统会自动检索path下的路径,在那些路径里面检索可运行程序,如果你的程序放在了path里面,那么在shell中你就可以直接输入你的程序名来让程序运行了。

什么是编译?

很久以前,程序猿都是通过织带打孔代表0/1的方式进行编程的,称之为机器语言。为了让语言语言有一定的可读性,用一些接近人类的字母代替一些0/1指令进行编程,称之为汇编语言。可是汇编语言还是晦涩难懂,为了让语言接近人类真实的语言,一些高级语言诞生了,比如C/C++,Java,python等。高级语言需要经过编译变为汇编语言,汇编语言进过汇编变为机器语言,如此便能在计算机中运行了。在Java中编译是将Java源码编译成了JVM可以识别的字节码文件。

Java 基础语法

编码风格

// 这是单行注释

/* 这是多行注释,
可以跨行 */

/**
* 这是文档注释,可以被Javadoc工具自动生成文档
* @author 这是javadoc的标签
/

参考《阿里巴巴Java开发手册》
Java偏向于疏松编码,就是字符和变量之间都添加空格来增加阅读的舒服感觉。
变量采用驼峰命名,使用字母的大写来区分单词。
python则偏向于紧凑,字符和变量之间一般没有空格。变量采用蛇形命名,使用下划线来区分单词。

数据类型

基本数据类型

每种编程语言都提供了一些基本类型来方便我们编程,属于高级语言层面特有的东西,可以提高程序的可读性,这些基本类型的引用基本在转为汇编语言后消失。所以以下基本数据类型并非Java特有,并不需要特别记忆,每种编程语言还都提供了自身的数据结构来更方便我们对现实世界进行抽象和建模。编程语言提供的数据结构可以看作对于《数据结构与算法》这个科目所涉及的数据结构的具体实现。比如C语言提供了结构体,Java提供了CollectionMap 等可以很方便我们在应用层编程的数据结构。Java里面的基本数据类型消除了底层操作系统的差异,这也和JVM存在的原因息息相关,增加了程序的可移植性。

基本数据类型大小(Byte)范围注意点
byte1-128 ~ 127
short2-32768 ~ 32767
int4-2147483648~ 2147483647
  • Java里面的整形溢出并不会抛出异常,溢出的部分会直接舍弃,这一点跟c语言有点像。
  • 看到整形数和浮点数脑海里应该浮现的是二进制0/1的表示。有关计算机中数的表示可以参考《深入理解计算机系统》第一章。默认整数是int
long8-263 ~ 263-1声明long需要加lL,推荐使用 L 或 F 更容易识别。这种严格要求是强类型语言的一个特性。
float4声明float需要加fF
double8默认浮点数是double。浮点数因为小数点的位置不固定而得名。浮点数在机器中存放的形式:浮点数 = 符号位 + 指数位 + 尾数位。可以看到小数点是隐含的。浮点数是不精确的,所以在实际使用中尽量不要用 == 去判断两个浮点数相等。另外,尾数部分可能丢失,造成精度损失。关于浮点数的表示形式存在多种标准,不同的语言可能选择了不同的实现。因为double比float精度更高,所以在实践中更推荐使用double。这也是Java中默认的浮点数类型。浮点数也可以用科学记数法的方式赋值,比如 double num = 5.12e2,等价于 5.12 * 102,其中 e 表示 exponent(指数)。有关浮点数的精度损失与二进制存储小数的机制有关。其机制导致了二进制浮点数无法达到十进制浮点数的精度。如果要判断两个浮点数是否相等,更常见的方式是判断两数相减的绝对值是否在可接受的精度范围内。
char20 ~ 65545(无符号)Java中使用半角单引号来表示char类型,对于强类型语言的Java,要转化为int需要显示转化。其本身可以进行运算,但实际中涉及到自动类型转换
  • Unicode是一种字符集(charset),用两个字节就能囊括世界上多有的文字集合。
  • UTF-8是一种编码方式(encoding),是Unicode的一种表现方式。
  • 在Java文件中如果声明了char c = ‘中’,编译后生成的class文件会把中转化成Unicode的一种表现方式。
  • Java char在内存中只会使用Unicode编码,所有其他编码只可能是在转换成byte[]之后才能具体体现。
  • 理解字符集和字符编码的区别,有助于理解问题Java char只有两个字节,怎么表示utf编码的
boolean1
  • 布尔字面值只有两个逻辑值: true 和 false 。
  • true 和 false 的值不转换为任何数字表示。
  • Java中的 true 字面值不等于1,false字面值也不等于0.在Java中,它们只能分配给声明为boolean的变量。
  • 使用int会削弱类型检查,因为编译器无法防止传入的int值不应该在布尔上下文中使用的情况。因此创建Java的人希望boolean明确表示true或false,而不是1或0。相关说明:由于JVM对布尔类型的支持有限,因此Java编译器使用int表示布尔值。请参见第3.3.4节布尔类型。在JVM中,整数零表示false,任何非零整数表示true。其与JVM的具体实现有关,在实际编程中,我们应该把boolean和int当作两个类型来处理。其具体的大小在Java虚拟机规范中并没有定义,取决于具体的实现。boolean: The boolean data type has only two possible values: true and false. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its "size" isn't something that's precisely defined.可以参考这篇博文:Java中boolean类型到底占用多少个字节?
  • 另外,语言之间尚无关于1和0如何转换为布尔值的共识。 C使用任何非零值表示true,使用0表示false,但是某些UNIX shell则相反。

Java中,字符串属于引用数据类型,

自动类型转化

核心:表示范围小的可以转化给表示范围大的。具体和JVM的设计有关。
Java程序在赋值或者运算时,较小精度的自动转化为较大精度的,比如float -> double,实际存储大小较小的可以自动转化为较大的(即可表示范围小的可以自动转化为较大的)。

  • 较小的基本类型转化为较大的基本类型是自动转化的,因为在这个过程中不会存在精度损失,比如 int -> long,byte -> int。
  • char -> int -> long -> float -> double
  • byte -> short -> int -> long -> float -> double
  • 因为char没有负数范围,所以byte、short和char之间不会相互自动转化。
  • 有多种混合类型进行运算时,JVM首先自动将所有数据转化成容量最大的类型然后进行运算。
  • 大容量赋值给小容量会报错,因为可能存在数据丢失,需要程序员显氏转化。
  • byte、short、char他们三者可以计算,在计算时首先转换为int类型。应该与JVM的实现有关。
    byte b = 1;
    byte b2 = 2;
    short s = 1;
    short s1 = b + s; // 错误, b + s --> int
    byte b3 = b + b2; // 错误, b + b3 --> int
    
  • boolean不参与转换,详见上表。
  • 自动提升原则:表达式结果中的类型,自动提升为操作数中最大的类型。
    // e.g.
    int n1 = 10;
    float num = n1 + 1.1;// 编译不通过,1.1是double,不能直接赋值给float类型的double。
    
    // e.g.
    byte b = 10; // 正确,注意,这里是可以的,编译器首先会检查等号右边是否在左边变量可表达的范围内,如果在则通过,不在则不通过。这个应该跟JVM的实现有关。
    int i = 1;
    byte b2 = i;// 错误,变量i明确是int类型,不能直接赋值给容量更小的byte。
    

强制类型转换

当较大的数据类型转化为较小的数据类型时因为存在精度损失,所以需要程序员显式转化,在这个过程中编译器默认程序员清楚这个转化的风险。

引用数据类型

引用数据类型大小(Byte)
接口
数组

Java中的字符串

不同的语言对于字符串的实现不一样,Java中字符串属于引用数据类型。
对于加号拼接字符串的使用

// 造成下列现象的原因是没有加号的情况下加法运算是从做到右**依次**运算,如果不清楚,建议添加加号明确运算的优先级。
System.out.println("hello" + 100 + 3); // 输出: hello1003
System.out.println(100 + 3 + "hello"); // 输出: 103hello

流程控制
数组
面向对象
方法
重载
封装
继承
多态
抽象类
接口
枚举
常用类
String
日期时间
集合类
Java集合框架图

泛型
注解
异常处理
多线程
IO 流
反射

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值