JavaSE
Java中创建一个对象
例如 Person person = new Person(“张三”, 20); 包括几部分
- 声明(Declaration):将变量名称与对象类型关联的变量声明。
Person person 就是告诉编译器你将使用person引用一个Person类型的对象。其初始值将待定,直到有一个对象真正被创造和分配给它。
这里只是简单地声明一个引用变量而并没有创建一个对象。
实例化(Instantiating):new关键字是一个java运算符,它用来创建对象。
初始化(Initialization):new运算符,随后调用构造函数,初始化新创建的对象。
每个构造函数都允许你为矩形的起始值、宽度和高度提供初始值,同时使用原始类型和引用类型。如果一个类有多个构造函数,它们必须有不同的签名。java编译器区分构造函数基于参数的数量和类型。
方法的调用
加void则无返回值。
java创建类
类是对象的模板。
用户输入
1 | Scanner scanner = new Scanner(System.in); |
sout快捷生成System.out.println();
创建类的实例对象
类名 对象名 = new 类名();
new关键字是创建实例对象最重要的标志。
对象首字母要小写,不要数字开头和包含特殊字符。
输入psvm可快速生成main入口函数。
成员变量
public class 类名{
String name;
int age;
float weight;
}
成员变量使用
类名 对象名 = new 类名();
对象名.name = “名字”;
对象名 .age = 6;
对象名 .weight = 13.5f;
读取成员变量
System.out.println(对象名.name + “今天” + 对象名.age + “岁了”);
成员变量须知
*成员变量就是隶属于对象的变量 。
*成员变量用于保存对象的静态特征 。
*同类型的不同对象拥有相同的成员变量,但值彼此独立 。
(追加:String属于final类,也即意味着String类不能被继承,并且它的成员方法都默认为final方法。 可用于创建字符串对象。)
方法(Method)
方法是用于完成特定功能的整段代码。
P.s : 对象 . 方法(MethodSample01为对象,后者为方法)
(a)即(int num),被导入到num中。
包(Package)
包的命名规范
包采用“逆命名法”进行命名,用 “.” 分割,单词全部小写。
标准格式:域名后缀.组织机构名.项目名[.模块名].包的职能
E.D. com.imooc.weather.ui
com.alibaba.taobao.customer.data
要使用其他包下的类必须事先import导入。(语句3)
同一个包下的话无需import导入。
访问修饰符
访问修饰符用于控制类、成员变量、方法的访问范围。
E.D.
面向对象三大特征
封装、继承、多态。
封装
Algorithm即是被封装的算法。
—-对成员变量进行读写封装
getter方法,getter方法用于读取成员变量的内容。
书写格式:public 成员变量类型 get成员变量名(),PS:首字母大写
this关键字代表当前对象的…
this.owner就是指向上面的private String owner成员变量
后面的owner就是局部变量。
setter方法,setter方法用于设置成员变量的内容
setter书写格式:public void set成员变量的内容(记得首字母大写)
Code—>Generate—>Getter and Setter可同时生成设置和读取格式。
继承
extends
extends为继承关键字。
extends关键字前为子类,后面是父类。
多态
多态是同一个行为具有多个不同表现形式。
实现多态的关键是接口。
接口(Interface)是一个抽象的类型,只提供方法的定义。
实现类是一个接口的具体体现,要实现每一个接口方法的功能。
在新建类中选择创建Interface类。
在接口(Interface)中不能用大括号来作方法体。
implements是一个类实现一个接口用的关键字。
实现一个接口,必须实现接口中的所有方法。
使用接口关键字时报错点提示,使用method void调出方法体。
Language是接口名,English是实现类。
Custmer.java中可调到public Language contact(int areaCode)方法体。
public void 名(); 用于类 多态的引入。
ArrayList列表类的使用(重要)
ArrayList是Java内置的数据集合,用于存储多个数据。
ArrayList是数组替代品,提供了更多的数据。
ArrayList几乎是每一个项目中必用的类。
出现import java.util.List;完成导入。
后面的ArrayList也是一样。
接着按住Ctrl点List弹出源代码。
List在这作为接口名,后者实现类。
bookList为对象,add方法是对List进行追加内容。
(0,“ ”),可定列表位置。但这样是错误的。
为了约束列表类型,采用泛型。
String bookName = bookList.get(2) // get()为提取某个内容。
size( ) - 1为最后内容。
for循环对bookList中每个内容进行变例。(注意String)
API
调用接口,显示输入appCode,在阿里云中找。
利用字符串格式化替代拼接字符串
前者为普通,后者采用占用符。
注意row、format、new等关键字,和括号位置。
异常 (Throwable)
此类错误无提示。
在程序运行过程中,意外发生的情况,背离我们程序本身的意图的表现,都可以理解为异常。
Error对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。
而Exception是程序本身可以处理的异常。异常处理通常指针对这种类型异常的处理。它包括非检查异常和检查异常。
非检查异常(RuntimeException):编译器不要求强制处置的异常。
它包括空指针异常(NullPointerException)、数组下标越界异常(ArrayIndexOutOfBoundsException)、算数异常(ArithmeticExceptior)、类型转换异常(ClassCastException)。
检查异常:
IO异常、SQL异常。
在Java应用程序中,异常处理机制为:抛出异常、捕捉异常。
抛出异常包含异常类型、异常出现程序的状态。
异常处理的5个关键字:try、catch、finally、throw、throws

处理异常
try-catch以及try-catch-finally
E.D.:
处理异常要按先子类后父类的形式。
顺序错了,程序也会报错。
finally语句块:
异常抛出
——自定义异常
E.D. :
补充:e 就是一个类型为 Exception 的异常对象。
异常链

e.printStackTrace() : 当try语句中出现异常是时,会执行catch中的语句,java运行时系统会自动将catch括号中的Exception e 初始化,也就是实例化Exception类型的对象。e是此对象引用名称。然后e(引用)会自动调用Exception类中指定的方法,也就出现了e.printStackTrace() ;。
printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。
runtime exception,也称运行时异常,我们可以不处理。出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。
Java 中的字符串
Java中字符串的不变性:
String 类的常用方法:

Java 中 String 类的常用方法 Ⅰ
*
补充,Java中引号注意:
1.java中的单引号表示字符;java中的双引号是字符串。
2.单引号引的数据一般是char类型的;双引号引的数据 是String类型的。
3.java中单引号里面只能放一个字母或数字或符号;java中的双引号里面是0到多个字符构成。所以字符可以直接转换成字符串。字符串需要使用charAt(n) 来获取第几个字符。
Java 中的 String 类常用方法 Ⅱ
“==” 和 equals() 的区别
==: 判断两个字符串在内存中首地址是否相同,即判断是否是同一个字符串对象
equals(): 比较存储在两个字符串对象中的内容是否一致。
PS:字节是计算机存储信息的基本单位,1 个字节等于 8 位, gbk 编码中 1 个汉字字符存储需要 2 个字节,1 个英文字符存储需要 1 个字节。 因为每个字节是 8 位,最大值不能超过 127,而汉字转换为字节后超过 127,如果超过就会溢出,以负数的形式显示。
E.D. :
认识 Java 中的 StringBuilder 类
在Java中,除了可以使用 String 类来存储字符串,还可以使用 StringBuilder 类或 StringBuffer 类存储字符串。但 String 类是具有不可变性。
至于 StringBuilder 和StringBuffer ,它们基本相似,不同之处,StringBuffer 是线程安全的,而 StringBuilder 则没有实现线程安全功能,所以性能略高。因此一般情况下,如果需要创建一个内容可变的字符串对象,应优先考虑使用 StringBuilder 类。

Java 中的 StringBuilder 类的常用方法

ED:

以上 操作修改了 str 对象的值,而没有创建新的对象,这就是 StringBuilder 和 String 最大的区别。
输出: 
Java中的包装类
基本数据类型是不具备对象的特性的,比如基本类型不能调用方法、功能简单。。。为了让基本数据类型也具备对象的特性, Java 为每个基本数据类型都提供了一个包装类,这样我们就可以像操作对象那样来操作基本数据类型。
基本类型和包装类之间的对应关系:

包装类主要提供了两大类方法:
1) 将本类型和其他基本类型进行转换的方法
2)将字符串和本类型及包装类互相转换的方法


ED:
Java 中基本类型和包装类之间的转换
Java 中基本类型和字符串之间的转换
\1. 使用包装类的 toString() 方法
\2. 使用String类的 valueOf() 方法
\3. 用一个空字符串加上基本类型,得到的就是基本类型数据对应的字符串

而将字符串转换成基本类型有两种方法:

使用 Date 和 SimpleDateFormat 类表示时间
要处理日期和时间的相关数据,此时我们可以使用 java.util 包中的 Date 类。这个类最主要的作用就是获取当前时间 :

使用 Date 类的默认无参构造方法创建出的对象就代表当前时间,我们可以直接输出 Date 对象显示当前的时间
E.D. :
Calendar 类的应用
由于本身设计的问题,Date类却遭到众多批评,不建议使用, 更推荐使用 Calendar 类进行时间和日期的处理。
java.util.Calendar 类是一个抽象类,可以通过调用 getInstance() 静态方法获取一个 Calendar 对象,此对象已由当前日期时间初始化,即默认代表当前时间,如 Calendar c = Calendar.getInstance();

Calendar 类提供了 getTime() 方法,用来获取 Date 对象,完成 Calendar 和 Date 的转换,还可通过 getTimeInMillis() 方法,获取此 Calendar 的时间值,以毫秒为单位。

ED: 
使用 Math 类操作数据
Math 类位于 java.lang 包中,包含用于执行基本数学运算的方法, Math 类的所有方法都是静态方法,所以使用该类中的方法时,可以直接使用 类名.方法名,如: Math.round();
常用的方法: 
E.D.:**

补充:
增强型for循环 for(类型 变量:数组){
System.out.println(变量);}
集合框架
Java中的集合类是一种工具类,就像是容器,存储任意数量的具有共同属性的对象。
与数组区别
Java集合框架体系结构
分为了Collection和Map两主接口。
Collection接口
是List、Set和Queue接口的父接口。
定义了可用于操作List、Set和Queue的方法——增删改查。
List接口常用的实现ArrayList。
常用方法:add(Object obj) 增加一个元素
add(int index,Object obj) 在指定索引位置添加元素
remove(int index) 删除指定位置的元素
remove(Objiect) 从列表中删除元素
set(index,Object) 修改指定位置的元素
get(int index) 获取指定位置的元素
size() 获取集合大小
contains(Object obj) 查找集合中是否存在传入的元素
coursesToSelect.add(cr1); 直接将obj(括号里的)对象加入List末位
coursesToSelect.add(i,cr1) ; 将obj对象加入第i位。
coursesToSelect.addAll(Arrays.asList(course)) ;
coursesToSelect.addAll(i, c) ;将n个对象插入到第i位至第i+n位。
同时加入多个对象,需要注意的是,addAll方法的参数为collection对象,需通过Arrays类的asList方法将数组转换为collection对象才可。
get()将List对应索引位置的元素取出来。
通过for循环可直接将元素连续取出。
输出顺序和输入顺序也是一致的。
迭代器
Iterator
1 | 通过迭代器来遍历List |
1 | 通过for each方法访问集合元素 |
修改List元素
修改了索引位置上原来的 “数据结构”为“毛概”。
删除List中的元素
应用泛型管理课程 Ⅰ
强行添加字符串,会抛出异常。
这时候我们要引入泛型。
泛型
List<>
for(Course cr:courses) 直接作为课程类型取出来。
应用泛型管理课程 ⅠⅠ
会导致超类报错
则需在该含参构造器下面再加一个无参构造器。如下:
补充:
泛型不能使用基本类型!
基本类型必须使用包装类作为泛型!
Set接口及其实现类——HashSet
Set是元素无序并且不可以重复的集合,被称作集。
HashSet——哈希集,是Set的一个只要实现类。
asList()方法:返回一个受指定数组支持的固定大小的列表。
Map和HashMap
Map接口 :
HashMap :
判断List中课程是否存在。
equals 方法
containsAll
生成equals()hashCode : Alt+Ins,equals and hashCode
、
泛型
什么是泛型?
所谓泛型,就是允许在定义类、接口、方法时使用类型形参(泛型),这个类型形参将在声明变量、创建对象、调用方法时动态地指定,进而让程序具备编译时检查能力
泛型是JDK1.5提供的特性,最常见的泛型应用场景便是在使用集合时通过泛型指定集合内对象的类型,为程序代码提供了编译时纠错的能力。
泛型类创建与使用
泛型方法
多线程
多线程的安全与应用
程序是静态文件
进程是程序运行的实例
1)当一个程序执行进入内存运行时,即变成一个进程
2)进程的资源是彼此隔离的,其他进程不允许访问
线程是进程内执行的“任务”。
CPU、进程、线程关系
Java进程与线程
通过继承Thread类创建线程
步骤: ①、定义类继承Thread;
②、复写Thread类中的run方法;
public void run(){
}
目的:将自定义代码存储在run方法,让线程运行
③、调用线程的start方法:
start();
该方法有两步:启动线程,调用run方法。
实现Runnable接口创建线程
接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为run 的无参方法。
实现步骤: ①、定义类实现Runnable接口
class ** implements Runnable {
}
②、覆盖Runnable接口中的run方法
将线程要运行的代码放在该run方法中。
③、通过Thread类建立线程对象。
④、将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
自定义的run方法所属的对象是Runnable接口的子类对象。所以要让线程执行指定对象的run方法就要先明确run方法所属对象
⑤、调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。
追加多个线程:
ps:注意可以直接在实例后面线程时直接(new Runner())
实现Callable接口创建线程
实现步骤:①、创建Callable接口的实现类,并实现call()方法,改方法将作为线程执行体,且具有返回值。
②、创建Callable实现类的实例,使用FutrueTask类进行包装Callable对象,FutureTask对象封装了Callable对象的call()方法的返回值
③、使用FutureTask对象作为Thread对象启动新线程。
④、调用FutureTask对象的get()方法获取子线程执行结束后的返回值。
三种创建方式的对比
补充: 线程睡眠—-sleep:
线程睡眠的原因:线程执行的太快,或需要强制执行到下一个线程。
线程睡眠的方法(两个):sleep(long millis)在指定的毫秒数内让正在执行的线程休眠。
sleep(long millis,int nanos)在指定的毫秒数加指定的纳秒数内让正在执行的线程休眠。
Java IO流
File类
File类是java.io包下代表与平台无关的文件和目录。
程序中操作文件和目录,都可以通过File类来完成,File能新建、删除、重命名文件和目录。
File类并不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。
p.s : .mkdirs( );创建多级文件
流-Stream
Java把输入的数据抽象成流(Stream)的概念,简化了程序处理。
四种抽象类:
字节输入流-InputStream
字节输出流-OutputStream
字符输入流-Reader
字符输出流-Writer
字节输入流-InputStream
InputStream是所有字节输入流的父类。
InputStream提供核心方法read(),用于读取字节数据。
FileInputStream类专用于读取二进制文件。
InputStream通用开发模式
实例化InputStream对象。
利用read方法循环读取的字节数据,并进行处理。
调用close方法关闭InputStream对象。
字节输出流-OutputStream
OutputStream是所有字节输出流的父类。
OutputStream提供核心方法write(),用于指定输出流输出字节数组
FileOutputStream类专用于写入二进制文件。
字符输入/输出流
Reader与Writer
Reader是所有字符输入流的抽象父类。
Writer是所有字符输出流的抽象父类。
FileReader与FileWriter分别对应了文本文件的读取与写入。
写入:
第五行file.exists()改为!file.exists():
读取:
转化流的应用
输入/输出流体系中还提供了两个转换流,这两个转换流用于实现将字节流转换成字符流
InputStreamReader将字节输入流转换成字符输入流
OutputStreamWriter将字节输出流转换成字符输出流
输出流同理:
ps:画出的蓝色部分其实是可以不写的,但小白最好养成习惯。
缓冲区的作用
默认文件的读取与写入都是逐个字节/字符完成的,但这种处理方式并不高效,如果将读取或写入的数据整块在内存中缓存,一次性批量读取、写入,便可以有效提高数据交互效率
BufferedInputStream与BufferedOutputStream用于缓冲字节输入、输出流
BufferedReader与BufferedWriter用于缓冲字符输入、输出流
BufferedReader实现文本整行读取
多线程下载器
需求介绍
通过读取源文件多线程自动下载所有网络资源到本地硬盘。
遇到下载故障在控制台打印错误信息。
允许自定义源文件的地址,保存下载文件的目录要自动创建。
允许自定义同时下载的任务数量,不指定默认开启10个下载任务。
下载的文件的文件名要与网址包含文件名保持一致。
下载成功后在控制台输出存储路径与文件尺寸。
封装URLConnection单资源下载器。
Properties类
Properties(属性)类是java.utils包专用于读取应用属性文件的类。
Properties文件采用属性名=属性值的形式存储数据。
多线程下载器我们利用config.properties保证程序配置信息。
读取download.txt下载列表
main方法同上。
实现多线程并行下载
JUC支持的线程池种类
在java.util.concurrent中,提供了工具类Executor(调度器)对象来创建线程池,可创建的线程池有四种:
1.FixedThreadPool-定常线程池
2.CachedThreadPool-可缓存线程池
3.SingleThreadExecutor-单线程池
4.ScheduledThreadPool-调度线程池
JDK不同版本特性
JDK9-通过try块自动关闭资源
原:
通过try块后简化。














































































































































