让我们来一起学习Java吧!
前置
环境配置
工欲善其事必先利其器,先老老实实地把环境配置好吧。环境配置参见:https://www.runoob.com/java/java-environment-setup.html,至于ide安装的是:https://www.jetbrains.com/idea/download/download-thanks.html?platform=windows&code=IIC。
之后就是具有仪式性的一件事了——helloworld!
新建一个project,取名helloworld,添加一个java类,代码如下:
public class helloworld { public static void main(String[] args) { System.out.println("Hello World"); } }
结果如下:
利用Ide新建Java项目:https://www.evget.com/article/2020/9/8/38100.html
Java的工作方式:
源代码–编译器–输出字节码–Java虚拟机;
基础知识
基础语法
直接浏览网站:
https://www.liaoxuefeng.com/wiki/1252599548343744/1255883772263712
什么是强/弱类型语言?
强类型语言是一种强制类型定义的语言,即某一变量被定义类型之后,如果不经强制转换,那么就就一直是该类型;弱类型是可以根据环境变化自动进行转换;
什么是动态/静态语言?
动态语言在运行期间采取做数据类型检查,即编程时不会给任何变量指定数据类型,例如Python和Ruby;
静态语言需要声明数据类型,在编译时检查;
Java的包机制
将功能相近的类或接口放着同一个包里;
采用树形结构的存储方式;
面向对象
类,跟C++类似;
虚拟类,abstract修饰的类,无法创建实例;
接口,interface修饰,仅声明方法,由其继承类进行方法的定义,同样无法创建实例,实现接口使用implement关键词;
注:什么时候用继承?什么时候用接口?
is a 的时候用:继承,比如三角形是多边形,苹果是水果;
has a的时候用:接口,比如狗有一张嘴,屋子有门;
不想要某些类被初始化(即建立对象)?
——比如基类,”动物“无法被初始化,也不应该被初始化,因为动物的所有属性没有明确!几条腿?几张嘴?在这种情况下可以使用abstract来修饰,让编译器知道这个类无法创建实例。
核心类
Object
注意!⚠️!
在Java中的所有类都是从Object类继承出来的,这也是实现万用类(如ArrayList)的基础。
诶?话说,Object类(我们不妨称之为 终极类,其对象称为终极对象)除了实现万用类,还有什么实质性的东西么?比如——终极对象内部存储了什么东西?
——根据使用频度等方面原因,终极对象中主要有:
- equals():判断两个对象是否相等;
- getClass():获取当前对象的类;
- hashCode():该对象的的哈希码,全局唯一标识码;
- toString():获取类的名称及标识(暂略);
除了这些通用方法之外,还为线程同步所服务(见后)。
Object类是抽象的么?
——应该不是,如果是抽象类,那么所有类都必须实现覆盖其中的方法,但是实际情况来看,并没有。
StringBuilder
如果直接使用“+”进行字符串的拼接,每一次拼接字符串都会扔掉旧的对象,新建一个新的对象,效率太低。
针对这个问题,java设计类Stringbuilder类,用于高效拼接字符串;
StringJoiner
这个是为了用于指定分隔符来凭借字符串数组;
垃圾回收
在java体系中,内存分为堆栈。堆,主要是对象的生存空间;栈,主要是方法调用和变量的生存空间。所谓的垃圾回收,都是基于堆而言的。
对于一个引用对象的局部变量而言,局部变量本身在栈上,其引用对象在堆上。
一般对象的创建过程有三个步骤:
声明、创建、赋值,如下:
Duck duck = new Duck();
Duck duck 即是声明;
new ** 即是创建;
= 即是赋值;
对象什么时候死?
只要有活着的引用,对象就不会死!
垃圾回收器(GC)会检测活着的引用及相应的对象,如果某个对象的引用都死了,那么这个对象····也就该死了!
注解
什么是注解?放在java源码的类、方法、字段、参数前的特殊“注释”(注释是给人看的,会被编译器直接忽略掉;注解是给程序看的,会被编译器打包进入class文件)
它的主要作用是用作参数的配置,下面是一些常见的注解(省略@):
- configuration:表明当前类是i一个配置类,是方法bean的源;
- Resource:一般用在树形或set方法上用于为对象参数赋值;
- Bean:用于告诉方法,产生一个Bean对象,而后交给Spring管理;
- Component:将这个类交给Spring管理;
- Override:表示子类重写了父类的方法,可读性提高,编译器检查;
PS:一些java注解是为了代替xml配置;
还有lombok(是一个java的工具类)提供的注解:
- NonNull:用于检查对象非空;
- Data;
- Log
其他详见:https://blog.csdn.net/sunsfan/article/details/53542374
https://my.oschina.net/u/2935389/blog/1036598
多线程
java中建立线程是通过:Thread库。主要有以下三种方式,一是通过继承Thread,覆盖润()方法;实现Runable接口;三是利用lambda语法;
值得注意的是,新版java不存在强制中断线程的方法,但可以通过对目标线程调用interrupt()方法即发送中断请求,在目标线程内部执行相应的逻辑来进行线程中断。
MVC
MVC可不是数据库的多版本控制啊,而是Model-View-Controller,即模型-视图-控制器。Model用来实现复杂的业务逻辑,View通过渲染来实现视图的展示。
序列化(serialize)
java提供一种对象序列化的机制:可以将对象表示为一个字节序列(包括该对象的数据、有关对象的类型信息等)。
将上述字节序列可以进行反序列化,在内存中新建对象。
如何让类支持这样的机制?
——该类实现java.io.serializable接口(对应字段上加上transizent可以让该类不序列化),并且该类的所有属性必须是可以序列化的。
工具框架
JFrame&Swing
Java的GUI控件,Swing支持的组件和功能更强大。
三大布局管理器(Layout Managers):
BorderLayout:即分区
FlowLayout:即从左到右,从上到下
BoxLayout:从上到下
Maven
Maven是一个java项目管理和构建工具,它主要是提供来一套标准化的构建项目的流程,并且自动处理依赖管理(比如A依赖于B,B依赖于C,那么A会自动依赖于C)。一个默认的Maven项目结构如下:
其依赖关系一共有四种,在scope中定义:compile表示编译时需要;test表示测试时使用;runtime表示编译时不需要,但运行时需要;provided表示编译时需要,但运行时由JDK或者服务器提供;
PS:那么Maven如何知道在哪去下载依赖?——又一个中央仓库,三方库都去该中央仓库查询下载;
Lifecycle生命周期,Maven的生命周期由一系列阶段(Phase)构成,以内置的生命周期default为例:
运行mvn + XXX,即默认到对应的phase,例如mvn packge,会一直执行到package这个阶段。
常用的命令为claen compile test package(打包)。
执行phase会触发goal,goal是啥?没什么特别的,就是具体的操作,见下:
其实:
lifecycle相当于javaSE的package,是一个大整体,包含很多的phase;
phase相当于JavaSE的class,是整体中的一个部分,包含很多的goal;
goal相当于JavaSE的method,是每一个部分的真正操作;
PS:构建项目就是执行lifecycle,执行到制定的phase为止;
对于大型项目,需要进行模块化管理,每一个小项目都是一个小的Maven项目,例如三个模块的项目:
如果ABC的pom.xml中存在相同的配置文件,可以单独将这部分配置文件新建为一个xml,而后在ABC中引入即可;
Java从0开始(下):https://developer.aliyun.com/article/1508414