Java基础知识-[Javasec]
学习Java安全,跟着廖雪峰老师的博客再过一遍Java基础知识。
Java简介
Java将代码编译成“字节码”,类似抽象的CPU指令,之后针对不同平台开发虚拟机,虚拟机负责加载源码并执行,就可以确保“一次编写,处处运行”
Java版本如下:
- Java SE: Standard Edition (标准版)
- Java EE: Enterprise Edition (企业版,在SE的基础上加入大量的API和库)
- Java ME: Micro Edition (针对嵌入式设备)
除此之外,还有一些名词需要了解:
- JDK:Java Development Kit
- JRE: Java Runtime Environment
JRE是运行Java字节码的虚拟机,JDK可以将Java源码编译成Java字节码,JDK除了包含JRE,还提供了编译器、调试器等开发工具。
在安装Java的bin目录下有很多可执行文件:
- java:这个可执行程序其实就是JVM,运行Java程序,就是启动JVM,然后让JVM执行指定的编译后的代码
- javac:Java的编译器,将Java源码文件(.java后缀)编译成Java字节码文件(.class后缀)
- jar:将一组.class文件打包成一个jar文件
- jdb:Java调试器
classpath是JVM用的环境变量,用于指示JVM如何搜索class
jar包可以将package
组织的目录层级,以及各个目录下的所有文件(包括.class
文件和其他文件)都打成一个jar文件
目录结构:
src
目录存放Java源码resources
目录存放配置文件bin
目录存放编译生成的.class
文件
Java程序基础
- Java中规定,某个类定义的
public static void main(String[] args)
是Java程序的固定入口方法,因此,Java程序总是从main
方法开始执行。 - 如果类型名太长,想要忽略变量类型,可以使用
var
关键字,编译器会根据赋值语句自动推断出变量的类型 - 三元运算符:
b?x:y
- Java在内存中总是使用
Unicode
表示字符,一个char
保存一个Unicode
字符 - 数组定义使用
类型[]
,数组变量初始化时,需new 类型[数量]
System.out.println()
/print()
/printf()
,其中printf()
可以格式化输出java.util.Scanner
中的System.out
代表标准输出流,而System.in
代表标准输入流
面向对象基础
在方法内部,可以使用隐含变量
this
,它始终指向当前实例,通过this.field
就可以访问当前实例的字段和普通方法相比,构造方法没有返回值(也没有
void
),调用构造方法,必须用new
操作符一个构造方法可以调用其他构造方法,这样做的目的是便于代码复用。调用其他构造方法的语法是
this(…)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17fclass Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(String name) {
this(name, 18); // 调用另一个构造方法Person(String, int)
}
public Person() {
this("Unnamed"); // 调用另一个构造方法Person(String)
}
}方法名相同,但包含的参数不同,称为方法重载(
Overload
),方法重载的返回值类型通常都是相同的Java中使用
extends
关键字来实现继承,通过继承只需要编写额外的功能,不再需要重复代码在Java中,没有明确写
extends
的类,编译器会自动加上extends Object
。所以,任何类,除了Object
,都会继承自某个类。
用
protected
修饰的字段可以被子类访问(以及子类的子类),该关键字可以把字段和方法的访问权限控制在继承树内部在继承关系中,子类如果定义了一个与父类方法签名完全相同的方法(方法签名相同,并且返回值也相同),被称为覆写(
Override
)。在子类的覆写方法中,若想调用父类被覆写的方法,通过super
调用(若父类不允许子类对它的某个方法进行覆写,可以把该方法标记为final
。用final
修饰的方法不能被Override
)1
2
3
4
5
6
7
8
9
10
11
12
13
14class Person {
protected String name;
public String hello() {
return "Hello, " + name;
}
}
class Student extends Person {
public String hello() {
// 调用父类的hello()方法:
return super.hello() + "!";
}
}多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法
将方法声明为
abstract
(抽象方法,本身没有实现任何方法语句),但抽象方法无法执行也就影响了整个类无法被实例化,所以类本身也要被抽象化(抽象类)1
2
3abstract class xxx {
public abstract void run();
}若抽象类没有字段,全为抽象方法就可以将其改写为
interface
( 接口),具体的class去实现一个interface
,需要使用implements
关键字1
2
3
4interface Person {
void run();
String getName();
}上面也接触了extends(继承),一个类只能继承自另一个类,不能从多个类继承。但一个类可以实现多个
interface
。package(包)解决名字冲突,完整的类名为
包名.类名
,Java虚拟机执行时,只看完整类名,只要包名不同,类就不同。位于同一个包的类,可以访问包作用域的字段和方法(包作用域),若要引用其他的class,可以通过
import
导入完整类名。
Maven基础
Maven介绍
Maven是Apache的一个开源项目,主要用于帮助开发者管理项目中jar以及jar之间的依赖关系,最终完成项目编译,测试,打包和发布等工作。
- 提供了一套标准化的项目结构
- 提供了一套标准化的构建流程
- 提供了一套依赖管理机制(可以对Jar包进行统一的管理,包括快速引入Jar包,以及对使用的Jar包进行统一的版本控制)
(环境变量配置)
使用Maven管理的java项目,目录结构默认如下:
- 项目描述文件
pom.xml
(使用pom.xml
定义项目内容,Maven使用groupId
,artifactId
和version
唯一定位一个依赖) src/main/java
存放Java源码的目录src/main/resources
存放资源文件的目录- 所有编译、运行的临时文件、最终打包生成的文件都放在
target
目录里
- Maven多模块项目@Spring Boot Maven 多模块项目搭建
- Gradle@Gradle 详细手册(从入门到入土)
Maven仓库
Maven仓库是用来存放maven构建的项目和各种依赖的Jar包
- 本地仓库:自己计算机中的仓库,用于存储从远程仓库或中央仓库下载的插件和Jar包。
- 远程仓库:例如阿里云的maven远程仓库。
- 中央仓库:maven软件内置的一个远程仓库地址,由Maven团队维护。
maven本地仓库配置
maven仓库默认在C盘,可以在conf 文件夹下的settings.xml文件中进行修改
配置阿里云远程仓库
IDEA配置Maven
除此之外还需要配置Runner,以避免下载速度很慢,导致创建maven项目时需要很长时间
maven 在创建项目时,会从网络中下载一个叫做
archetype-catalog.xml
的文件作为项目的模板。配置该参数后,表示不用下载文件,进而加快项目的创建速度。
Maven测试
创建一个项目进行测试,查看maven是否配置好
但是报错了,查了一下才发现是IDEA和maven版本不兼容
IDEA 2021 兼容maven 3.8.1及之前的所用版本