JavaEE学习笔记1
Note for JavaEE-Day1
基本配置
以前写的笔记,同步过来
JDK
官网下载,之后配环境变量。
安装后可以用java -version
查看JDK版本。
IDEA下载及安装
官网下载,之后申请/延长一下student license。
Git相关
官网下载git,远程仓库的创造就不必多说了。
Git基础
Git是版本管理的重要工具,开发者应该至少掌握其基本操作。
这里可以先通过learnGitBranch了解并熟悉其基本操作,再基于Kisugi Takumi的学习笔记进行实践。
基本操作如下:
- clone(克隆): 从远程仓库中克隆代码到本地仓库
- checkout (检出):从本地仓库中检出一个仓库分支然后进行修订
- add(添加): 在提交前先将代码提交到暂存区
- commit(提交): 提交到本地仓库。本地仓库中保存修改的各个历史版本
- fetch (抓取) : 从远程库抓取到本地仓库,不进行任何的合并动作,一般操作比较少。
- pull (拉取): 从远程库拉到本地库,自动进行合并(merge),然后放到到工作区,相当于fetch+merge
- push(推送): 修改完成后,需要和团队成员共享代码时,将代码推送到远程仓库
另外的操作如rebase、cherry-pick以及版本查看git-log和众多带参数形式都非常有用,可根据需要使用。
Java基础
基本介绍
首先推荐一下廖老师的博客,很棒的!下面介绍几个术语:
- JVM: java虚拟机,像编译+运行的C++要对不同平台编译机器码(因指令集不同),而解释型语言如Python运行效率太低,折中有了JVM,即对不同平台编写虚拟机,在虚拟机上运行java字节码文件。
- Java SE/EE/ME:SE即Standard Edition,标准版本;EE即Enterprise Edition,可理解为企业版;ME即Micro Edition,可以理解为精简版。ME在现在应用不多,因为移动端有Android;所以这里重点就是SE和EE了,SE对应的是Java的核心技术及标准库等,EE在SE的基础上加上了大量的API和库。
- JDK: Java Development Kit,包含JRE、编译器和调试器等工具。用于编译字节码及运行。
- JRE:Java Runtime Environment,即运行Java的虚拟机。
另外再介绍几个命令行操作,即再JAVA_HOME/bin目录下的可执行文件:
- java: JVM,用以运行java文件,即运行Java字节码文件。
- javac: java编译器,将Java源码(.java文件)编译为java字节码文件(.class文件)。
- jar: 用以将.class文件打包成一个.jar文件,便于发布。
- javadoc: 从java中自动提取注释并生产文档。
- jdb: Java调试器,用于开发阶段的运行调试。
java的编写需要有且仅有一个public类,且类首字母大写,且文件名需要与这个public类名完全相同,如Hello.java。结合前面我们可以用命令javac Hello.java
编译,再用命令java Hello
执行。但java11后可以直接使用java Hello.java
来运行单文件源码,然而实际中项目难免存在引用其他库,所以这个不是很重要。
基本语法
Java的基本语法和C#非常相似,当然也与C++也比较相似(如类、抽象类的使用),所以只需要注意一些特殊的小细节即可:(尚不完整,将补充)
程序基础
- 初值。java定义变量类似于C++的全局变量,默认初值为0。
- unsigned。java只定义了符号整形,即暂无unsigned类型。
- 浮点数。
- java中实数如3.1415会被默认为double类型,若想表示float类型需在其后加一个f,如3.1415f。
- 在其强转为整型时,若过大或过小将转换为整型的最大/最小值。
- 布尔类型。JVM通常将其表示为4字节整数,尽管其只有true和false两个值。
- 字符类型。java默认Unicode编码,即在集成ASCLL的基础上,字符还可以表示汉字等,但这也导致英文字符与中文字符一样需要2个字节来表示。
- 常量。final定义常量,与C++的const相似。
- var关键字。与JavaScript相似,也与C++的auto相似,用以定义变量,由编译器自动判断变量类型。
- 字符串。
- 字符串是引用类型,str1=str2类似于C++的指针判等而非字符串内容判等,内容判等应使用str1.equals(str2)。
- 欲在字符串中使用单双引号等需要用"\"来转义表示。
- Java13引入"“…”"用以表示多行字符串。
- 数组。
- 与C#比较像,使用int[] xxx形式,即方括号在前。
- 与C++不同,越界即报错。
流程控制与面向对象
-
关于除0。除0会导致运行报错,但编译时不会报错。
-
switch。switch用法与C++类似,需break。但在java12后引入了新语法->,即可以通过
case xxx->operation
方式调用,多条语句需用大括号,这样就可以无需添加break。另外这种写法也支持swich返回值,可直接将上面的operation
改为返回值,多条语句也可以使用yield 返回值/变量
的形式。 -
命令行参数。java程序的入口是main方法,形如
public static void main(String[] args)
,它可以接受一个命令行参数,即这里的args
,具体实现如命令行中输入java Main -version
。命令行参数由JVM接受用户输入并传给main方法。 -
可变参数。方法参数传递可以使用可变参数,相当于数组,即参数表
(String... names)
与(String[] names)
等价。当传入NULL时相当于传入空数组。 -
类的继承。
- 与C#相似,java一个类只能继承自一个父类,且默认继承自Obeject类(Object类没有父类)。
- 子类的构造函数若不显示声明则会默认优先调用父类的默认构造函数,即无参数形式,但若父类中只定义了构造函数的有参数形式,则会报错。
- 阻止继承。java15后引入sealed关键字及permits以显示的写出允许继承的子类名称,如
public sealed class Shape permits Rect, Circle, Triangle
。注意sealed在java15中只是预览状态,欲启用它需使用参数--enable-preview
和--source 15
。 - 关于转型。子类向父类转型是安全的,如
Person per = new Student()
,但反过来是不安全的,因此可能会报错。可以事先采取实例名 instanceof 类名
来判断是否是对应的类或其子类。在Java14后可以直接指定转换后的变量名,如stu instanceof Person per
,即起到了既判断又转型的作用。
-
类的多态。
- 与很多面向对象语言相同,方法名、参数都相同但返回值不同的方法在编译时会报错的。
- 注解
@Override
用以检查覆写的正确性。且覆写后的方法经向上转型后仍有作用,即替代了父类中的对应方法。 - 可以使用
final
修饰父类方法以禁止子类对父类方法的覆写。也可以直接修饰类以禁止继承。
stl与异常
- stl队列。声明形如ArrayList list=new ArrayList<>(),通过list.add(插入位置(默认为尾部插入),新元素)插入新元素,遍历既可以使用foreach形式、get(下标)形式,也可以使用Interator=list.iterator()的迭代器形式。
- stlMap。与队列同理,声明形如Map<Integer,String> map=new HashMap<Integer,String>。
- 例外&抛出异常。形如try{}catch(IllegalArgumentException e){}finally,try中出现异常后进入catch,catch处理完成后或无异常进入finally。期间可以使用throw new (异常名)抛出异常。