目录
一、前言
首先推荐一下B站上转载的Mosh讲Java课程,当然,建议有一定基础并且英文水平尚可的同学学习,否则你可能会被搞得很累并逐渐失去对编程的兴趣。
Mosh 【JAVA终极教程】中英文字幕 高清完整版 最简洁易懂的课程(3个PART齐全)更新完毕,注意看校对版!!!_哔哩哔哩_bilibili
二、全局介绍
很多人第一门语言接触的是C,相比于Java来说有明显的不同,毕竟C是面向过程的编程语言,而Java是面向对象的编程语言。两者之间意义上的不同,在我早期的一篇博客中进行了简单阐述,有兴趣可以看看:
从最简单直白的角度 浅谈面向过程与面向对象的区别_bit_Sakura的博客-CSDN博客
1、平台独立性(可移植性)
众所周知Java的一大优点就是他在所有安装了Java运行环境的OS上都可以运行,不管是Linux、Mac还是windows,这也是在国内Java使用率远超C#的一个原因。
Java将编译的源代码放到虚拟机(Java Virtual Machine)上,经过处理交给对应平台完成移植。
2、package
说回Java,在Java中存在一个新的概念,package(包),什么是包,通俗来说就是文件夹。
像我们写的程序都以文件的形式保存,那在一个项目里,必然有很多很多的程序文件,要统筹管理这些大量文件就需要文件夹分开整理保存。
package一般的命名方式是以公司域名的倒序命名,例如:com.baidu...
在project 所属的文件夹中可以看到图中创建的package。
看到这种结构为什么需要package也就不言而喻了————自然是层次性可维护性。
3、class
同样是基础对象的编程,和C++一样,Java中自然也有class (类)的概念。
类是一个抽象的概念,它是一个宏观的概念,而对象是它的实例,也就是具象化,比如说水果和苹果,家具和桌椅之间的关系。这部分相比不用多说大家都知道。
在Java编程中与C/C++等语言不同的一点是(尤其对于刚接触的新手):执行程序的接口或者说进入程序运行的地方的形式不一样(只是形式上)。
C/C++是以main函数为起始执行的,当然Java也是,但是他们长得不一样,这就导致了刚接触Java的人会产生疑惑。
这个public class Main 是什么鬼?嵌套在里面的那一串好像是main函数入口,但又好像不是。
先来看我们工程那一栏,
这里有个Main,首字母大写的,和第一行一样,这是我们创建的包的主类。
在这个主类中,public static void main(String[] args) 就是程序入口,public作为访问修饰符允许被所有类访问,static标明这是个静态方法(后面再说),参数String[] args 允许外部传参,能使编程更方便。
关于package和class话题实在太多,在后面的接触中会一一呈现。
三、Types
1、基本类型
Java中有两种类型,一种是基本类型:
byte、short 适用于表示范围不大的整数,比如一个人的年龄体重等。
long表示的范围就大很多了,在Java中表示长整型数字时,要在数字后面加L,否则会报错:
在Java中最好每3位使用一个下划线分割长整型数字,更清晰明了。
Java中有固定的常量不想使其被改变时我们可以用final修饰:
double 类型比float 类型存储范围更大,精度更高。
带小数点的字面量默认属于double类型,所以声明一个float类型的变量时,都要在数字后面加上 "F" 或 "f"。
2、引用类型
还有另一种类型是引用类型,用来表示除基本类型之外相对复杂的一些类型。
引用类型会在堆上申请开辟空间,借由new实现,并且Java环境会自动释放该空间。
现在我想创建一个日期类型,Java环境自动给我们提示了一串相关Date类型所在的包,“Enter" 将包导入:
现在来创建Date类型,打印时间:
使用 . 操作符可以显示该实例成员相关的函数操作,这是引用类型拥有而基本类型所不具备的。
基本类型开辟的空间在栈上,而引用类型开辟的空间在堆上,实际上是将对象的地址赋值过去了,这也是很大的一个差异。
3、字符串
字符串也是引用类型,早期的创建方式:
当然你现在可以这么做:
与C/C++不同,Java中字符串可以相加,也就是通过 + 的方式拼接:
String类中有很多有趣的方法,如 .replace:
将 “hello”中的 ' l ' 换成 'Q'。
如 .trim:
.trim会裁掉字符串前后多余的留白。
已经存储在内存的字符串是无法改变的,比如用.toUpperCase /.toLowerCase取得字符串的大/小写子串,改变的不是原始字符串,而是返回了一个新的串。
原始字符串并未改变,也不能改变。
4、数组
数组的创建方式(老版):
常用的:
现在想打印数组看一下,但是这样打印出来的是数组的首地址,
所以得借助Arrays:
二维数组也是一样:
这样出来的就是一个两行三列的数组。
但是打印不能用上面的Arrays.toString(),这样依然打印的是首地址,要用deepToString():
多维数组都是一样的规则。
5、显示类型转换、隐式类型转换
我们知道,float变量和int变量无法相加,那么byte 和 int ,short 和 byte , short 和long 之间又如何呢?
short 类型和int类型相加,居然转换成了long类型,结果没有问题,这是怎么回事?
这涉及到变量之间的隐式类型转换,表示范围小的会自动朝表示范围大的转换(当然浮点数和整形之间不可以)
byte < short < int <long ---> float ---->double
float < double
上图中变量x 先隐式类型转换成int , 编译器会生成一个匿名变量X,临时存放x转换成更高类型的值,和y相加,由于 = 左边是long类型,那么相加的值又会再次自动转变成更高的long类型。
float 和double之间也是大同小异。
那么浮点数和整形之间可以转换吗?————也是可以的,
当然也可以用显示类型转换。
单个字符char 类型也可以:
字符串与整形/ 浮点型之间也可以转换 :
总结一下:
6、Math类相关方法
Math.round()接收一个float,返回一个 int类型
接收一个double,返回一个 long类型
按四舍五入处理。
Math.ceil ,向上提升,不舍只进。接收一个double,返回一个double类型
Math.floor,向下取整,只舍不进。接收一个double,返回一个double类型
Math.random 返回一个0~1之间的double型浮点数。
7、Format格式化
碰到金钱处理 ¥$,经常需要格式化输出;还有百分制格式化。
8、输入Scanner
图中byte类型的变量隐式类型转换成了String类型。
要想接收从键盘读入的数据,需要用到scanner.nextByte(),scanner.nextFloat()等方法。
如果读的是字符串,需要scanner.next() / scanner.nextline(),两者区别在于前者只能读到空格处,后面的部分读不到;而nextline可以读到包括空格的所有字符。