Java中创建一个对象

例如 Person person = new Person(“张三”, 20); 包括几部分

  1. 声明(Declaration):将变量名称与对象类型关联的变量声明。
  2. Person person 就是告诉编译器你将使用person引用一个Person类型的对象。其初始值将待定,直到有一个对象真正被创造和分配给它。

    这里只是简单地声明一个引用变量而并没有创建一个对象。

  3. 实例化(Instantiating):new关键字是一个java运算符,它用来创建对象。

  4. 初始化(Initialization):new运算符,随后调用构造函数,初始化新创建的对象。

    每个构造函数都允许你为矩形的起始值、宽度和高度提供初始值,同时使用原始类型和引用类型。如果一个类有多个构造函数,它们必须有不同的签名。java编译器区分构造函数基于参数的数量和类型。

方法的调用

1664551987366

加void则无返回值。

1664552028279

1664552796424


java创建类

对象的模板。

1664550727102


用户输入

1
2
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();

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)

方法是用于完成特定功能的整段代码。

1664197848825

1664207634885

P.s : 对象 . 方法(MethodSample01为对象,后者为方法)

(a)即(int num),被导入到num中。

1664551330768

包(Package)

1664247250316

包的命名规范

包采用“逆命名法”进行命名,用 “.” 分割,单词全部小写。

标准格式:域名后缀.组织机构名.项目名[.模块名].包的职能

E.D. com.imooc.weather.ui

​ com.alibaba.taobao.customer.data

1664248996092

1664249403065

要使用其他包下的类必须事先import导入。(语句3)

1664249700971

同一个包下的话无需import导入。

访问修饰符

访问修饰符用于控制类、成员变量、方法的访问范围。

1664249952480

1664555656578

E.D.

1664250227680


面向对象三大特征

封装、继承、多态。

封装

1664251145918

1664267901514

Algorithm即是被封装的算法。

—-对成员变量进行读写封装

getter方法,getter方法用于读取成员变量的内容。

书写格式:public 成员变量类型 get成员变量名(),PS:首字母大写

1664269093912

this关键字代表当前对象的…

this.owner就是指向上面的private String owner成员变量

后面的owner就是局部变量。

setter方法,setter方法用于设置成员变量的内容

setter书写格式:public void set成员变量的内容(记得首字母大写)

1664280593508

Code—>Generate—>Getter and Setter可同时生成设置和读取格式。


继承

extends

1664354917946

1664354979892

extends为继承关键字。

extends关键字前为子类,后面是父类。

1664357716970


多态

多态是同一个行为具有多个不同表现形式。

实现多态的关键是接口

接口(Interface)是一个抽象的类型,只提供方法的定义。

实现类是一个接口的具体体现,要实现每一个接口方法的功能。

在新建类中选择创建Interface类。

在接口(Interface)中不能大括号来作方法体。

1664362536350

implements是一个类实现一个接口用的关键字。

实现一个接口,必须实现接口中的所有方法。

使用接口关键字时报错点提示,使用method void调出方法体。

1664378692478

Language是接口名,English是实现类

1664378837048

Custmer.java中可调到public Language contact(int areaCode)方法体。

1664379166342

public void 名(); 用于类 多态的引入。


ArrayList列表类的使用(重要)

ArrayList是Java内置的数据集合,用于存储多个数据。

ArrayList是数组替代品,提供了更多的数据。

ArrayList几乎是每一个项目中必用的类。

1664380574197

1664380404737

出现import java.util.List;完成导入。

后面的ArrayList也是一样。

接着按住Ctrl点List弹出源代码。

List在这作为接口名,后者实现类。

1664380857589

bookList为对象,add方法是对List进行追加内容。

1664381041388

(0,“ ”),可定列表位置。但这样是错误的。

为了约束列表类型,采用泛型

1664381281720

1664427076748

String bookName = bookList.get(2) // get()为提取某个内容。

size( ) - 1为最后内容。

1664427339729

for循环对bookList中每个内容进行变例。(注意String)

API

1664439459124

1664448669587

调用接口,显示输入appCode,在阿里云中找。

1664449843416

利用字符串格式化替代拼接字符串

1664529874215

前者为普通,后者采用占用符。

注意row、format、new等关键字,和括号位置。


异常 (Throwable)

1664515053773

此类错误无提示。

在程序运行过程中,意外发生的情况,背离我们程序本身的意图的表现,都可以理解为异常。

1664517397216

Error对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。

Exception是程序本身可以处理的异常。异常处理通常指针对这种类型异常的处理。它包括非检查异常检查异常

非检查异常(RuntimeException):编译器不要求强制处置的异常。

它包括空指针异常(NullPointerException)、数组下标越界异常(ArrayIndexOutOfBoundsException)、算数异常(ArithmeticExceptior)、类型转换异常(ClassCastException)。

检查异常

IO异常、SQL异常。

在Java应用程序中,异常处理机制为:抛出异常捕捉异常

抛出异常包含异常类型、异常出现程序的状态。

1664518168492

异常处理的5个关键字:try、catch、finally、throw、throws

1664518246293

异常结构

处理异常

try-catch以及try-catch-finally

1664586723381

E.D.:

1664586991793

处理异常要按先子类后父类的形式。

1664587362114

顺序错了,程序也会报错。

finally语句块:

1664587467853

异常抛出

1664766131663

——自定义异常

1664766726155

E.D. : 1664767536606

补充:e 就是一个类型为 Exception 的异常对象

异常链

1664770556110

e.printStackTrace() : 当try语句中出现异常是时,会执行catch中的语句,java运行时系统会自动将catch括号中的Exception e 初始化,也就是实例化Exception类型的对象。e是此对象引用名称。然后e(引用)会自动调用Exception类中指定的方法,也就出现了e.printStackTrace() ;。
printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。

1664770643485

runtime exception,也称运行时异常,我们可以不处理。出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。

1664770912279


Java 中的字符串

Java中字符串的不变性:

166477279


String 类的常用方法:

img


Java 中 String 类的常用方法 Ⅰ

*
1664854484081

1664854657272

补充,Java中引号注意

1.java中的单引号表示字符;java中的双引号是字符串。

2.单引号引的数据一般是char类型的;双引号引的数据 是String类型的。

3.java中单引号里面只能放一个字母或数字或符号;java中的双引号里面是0到多个字符构成。所以字符可以直接转换成字符串。字符串需要使用charAt(n) 来获取第几个字符。

1664883900667

Java 中的 String 类常用方法 Ⅱ

“==” 和 equals() 的区别

==: 判断两个字符串在内存中首地址是否相同,即判断是否是同一个字符串对象

equals(): 比较存储在两个字符串对象中的内容是否一致。

PS:字节是计算机存储信息的基本单位,1 个字节等于 8 位gbk 编码中 1 个汉字字符存储需要 2 个字节1 个英文字符存储需要 1 个字节。 因为每个字节是 8 位,最大值不能超过 127,而汉字转换为字节后超过 127,如果超过就会溢出,以负数的形式显示。

E.D. :

1664935828817

认识 Java 中的 StringBuilder 类

在Java中,除了可以使用 String 类来存储字符串,还可以使用 StringBuilder 类或 StringBuffer 类存储字符串。但 String 类是具有不可变性。

至于 StringBuilder 和StringBuffer ,它们基本相似,不同之处,StringBuffer 是线程安全的,而 StringBuilder 则没有实现线程安全功能,所以性能略高。因此一般情况下,如果需要创建一个内容可变的字符串对象,应优先考虑使用 StringBuilder 类。

img

Java 中的 StringBuilder 类的常用方法

img

ED:

img

以上 操作修改了 str 对象的值,而没有创建新的对象,这就是 StringBuilder 和 String 最大的区别。

输出: img


Java中的包装类

基本数据类型是不具备对象的特性的,比如基本类型不能调用方法、功能简单。。。为了让基本数据类型也具备对象的特性, Java 为每个基本数据类型都提供了一个包装类,这样我们就可以像操作对象那样来操作基本数据类型。

基本类型和包装类之间的对应关系:

img

包装类主要提供了两大类方法:

1) 将本类型和其他基本类型进行转换的方法

2)将字符串和本类型及包装类互相转换的方法

img

img

ED:1664970822776

Java 中基本类型和包装类之间的转换

1664971273356

Java 中基本类型和字符串之间的转换

\1. 使用包装类的 toString() 方法

\2. 使用String类的 valueOf() 方法

\3. 用一个空字符串加上基本类型,得到的就是基本类型数据对应的字符串

img

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

img

使用 Date 和 SimpleDateFormat 类表示时间

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

img

使用 Date 类的默认无参构造方法创建出的对象就代表当前时间,我们可以直接输出 Date 对象显示当前的时间

1664973950866

E.D. :

1664975423336

Calendar 类的应用

由于本身设计的问题,Date类却遭到众多批评,不建议使用, 更推荐使用 Calendar 类进行时间和日期的处理。

java.util.Calendar 类是一个抽象类,可以通过调用 getInstance() 静态方法获取一个 Calendar 对象,此对象已由当前日期时间初始化,即默认代表当前时间,如 Calendar c = Calendar.getInstance();

img

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

img

ED: img

使用 Math 类操作数据

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

常用的方法: img

E.D.:**

img

1664981988202

补充:

增强型for循环 for(类型 变量:数组){

​ System.out.println(变量);}

集合框架

Java中的集合类是一种工具类,就像是容器,存储任意数量的具有共同属性的对象。

1664983816190

与数组区别

1664983971199

Java集合框架体系结构

分为了CollectionMap两主接口。

1664984214395

Collection接口

是List、Set和Queue接口的父接口。

定义了可用于操作List、Set和Queue的方法——增删改查。

1665022905252

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) 查找集合中是否存在传入的元素

1665025182580

1665032958165

1665033273326

1665059069441

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对应索引位置的元素取出来。

1665059573703

通过for循环可直接将元素连续取出。

输出顺序和输入顺序也是一致的。

1665059632614

迭代器

Iterator

1
通过迭代器来遍历List

1665063542917

1
通过for each方法访问集合元素

1665063775388

修改List元素

1665113933323

1665114106641

修改了索引位置上原来的 “数据结构”为“毛概”。

删除List中的元素

1665114519394

1665114558301

1665115705473

应用泛型管理课程 Ⅰ

1665120835108

强行添加字符串,会抛出异常。

这时候我们要引入泛型。


泛型

1665120980613

16651226865461665123100479

List<>

for(Course cr:courses) 直接作为课程类型取出来。

应用泛型管理课程 ⅠⅠ

1665123170490

会导致超类报错1665123418917

则需在该含参构造器下面再加一个无参构造器。如下:

1665123513490

补充1665123808683

1665123910415

1665124066520

泛型不能使用基本类型!

1665124092309

1665124257277

基本类型必须使用包装类作为泛型!

Set接口及其实现类——HashSet

Set是元素无序并且不可以重复的集合,被称作集。

HashSet——哈希集,是Set的一个只要实现类。

1665125264643


1665126443040

1665126850729

asList()方法:返回一个受指定数组支持的固定大小的列表。

1665150206350

Map和HashMap

1665202533535

Map接口 : 1665202654809

HashMap :1665202684840


1665202772754

1665230680437

1665232132408

判断List中课程是否存在。

1665236297894

1665285333544

equals 方法

1665285793013

containsAll1665292728985

1665309882349

1665325349514

生成equals()hashCode : Alt+Ins,equals and hashCode

泛型

1665382596574

什么是泛型?

所谓泛型,就是允许在定义类、接口、方法时使用类型形参(泛型),这个类型形参将在声明变量、创建对象、调用方法时动态地指定,进而让程序具备编译时检查能力

泛型是JDK1.5提供的特性,最常见的泛型应用场景便是在使用集合时通过泛型指定集合内对象的类型,为程序代码提供了编译时纠错的能力。

泛型类创建与使用

1665383793663

1665383904178

泛型方法

1665391178447

多线程

多线程的安全与应用

程序是静态文件

进程是程序运行的实例

1)当一个程序执行进入内存运行时,即变成一个进程

2)进程的资源是彼此隔离的,其他进程不允许访问

线程是进程内执行的“任务”。

1665396870505

CPU、进程、线程关系

1665397302222

Java进程与线程

1665397720390

通过继承Thread类创建线程

步骤: ①、定义类继承Thread;

     ②、复写Thread类中的run方法;

​ public void run(){

​ }

    目的:将自定义代码存储在run方法,让线程运行

     ③、调用线程的start方法:

​ start();

    该方法有两步:启动线程,调用run方法。

实现Runnable接口创建线程

接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为run 的无参方法。

   实现步骤: ①、定义类实现Runnable接口

​ class ** implements Runnable {

​ }

          ②、覆盖Runnable接口中的run方法

             将线程要运行的代码放在该run方法中。

          ③、通过Thread类建立线程对象。

          ④、将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。

1665408273896

             自定义的run方法所属的对象是Runnable接口的子类对象。所以要让线程执行指定对象的run方法就要先明确run方法所属对象

          ⑤、调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。

1665408409838

追加多个线程:

1665408514199

ps:注意可以直接在实例后面线程时直接(new Runner())

实现Callable接口创建线程

1665410199887

实现步骤:①、创建Callable接口的实现类,并实现call()方法,改方法将作为线程执行体,且具有返回值

         ②、创建Callable实现类的实例,使用FutrueTask类进行包装Callable对象,FutureTask对象封装了Callable对象的call()方法的返回值

1665410419962

         ③、使用FutureTask对象作为Thread对象启动新线程。

         ④、调用FutureTask对象的get()方法获取子线程执行结束后的返回值。

1665410676156

三种创建方式的对比

1665410829657

补充: 线程睡眠—-sleep:

    线程睡眠的原因:线程执行的太快,或需要强制执行到下一个线程。

    线程睡眠的方法(两个):sleep(long millis)在指定的毫秒数内让正在执行的线程休眠。

                sleep(long millis,int nanos)在指定的毫秒数加指定的纳秒数内让正在执行的线程休眠。

Java IO流

1665381442019

File类

File类是java.io包下代表与平台无关的文件和目录。

程序中操作文件和目录,都可以通过File类来完成,File能新建、删除、重命名文件和目录。

File类并不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。

1667054262481

p.s : .mkdirs( );创建多级文件

流-Stream

Java把输入的数据抽象成流(Stream)的概念,简化了程序处理。

1667060375970

四种抽象类:

字节输入流-InputStream

字节输出流-OutputStream

字符输入流-Reader

字符输出流-Writer

字节输入流-InputStream

InputStream是所有字节输入流的父类。1667110456804

InputStream提供核心方法read(),用于读取字节数据。

FileInputStream类专用于读取二进制文件。

InputStream通用开发模式

实例化InputStream对象。

利用read方法循环读取的字节数据,并进行处理。

调用close方法关闭InputStream对象。

1667115401333

字节输出流-OutputStream

OutputStream是所有字节输出流的父类。1667116250500

OutputStream提供核心方法write(),用于指定输出流输出字节数组

FileOutputStream类专用于写入二进制文件。

1667140901335

字符输入/输出流

ReaderWriter

Reader是所有字符输入流的抽象父类。

Writer是所有字符输出流的抽象父类。

FileReader与FileWriter分别对应了文本文件的读取与写入。

写入:

1667218210554

第五行file.exists()改为!file.exists():

读取:

1667219110876

转化流的应用

输入/输出流体系中还提供了两个转换流,这两个转换流用于实现将字节流转换成字符流

InputStreamReader将字节输入流转换成字符输入流

OutputStreamWriter将字节输出流转换成字符输出流

1667222501969

输出流同理:

1667222760025

ps:画出的蓝色部分其实是可以不写的,但小白最好养成习惯。

缓冲区的作用

默认文件的读取与写入都是逐个字节/字符完成的,但这种处理方式并不高效,如果将读取或写入的数据整块在内存中缓存,一次性批量读取、写入,便可以有效提高数据交互效率

BufferedInputStream与BufferedOutputStream用于缓冲字节输入、输出流

BufferedReader与BufferedWriter用于缓冲字符输入、输出流

BufferedReader实现文本整行读取

1667316660765

多线程下载器

需求介绍

通过读取源文件多线程自动下载所有网络资源到本地硬盘。

遇到下载故障在控制台打印错误信息。

允许自定义源文件的地址,保存下载文件的目录要自动创建。

允许自定义同时下载的任务数量,不指定默认开启10个下载任务。

下载的文件的文件名要与网址包含文件名保持一致。

下载成功后在控制台输出存储路径与文件尺寸。

1667452596954

封装URLConnection单资源下载器。

1667523393374

Properties类

Properties(属性)类是java.utils包专用于读取应用属性文件的类。

Properties文件采用属性名=属性值的形式存储数据。

多线程下载器我们利用config.properties保证程序配置信息。

1667538768911

1667538632941

读取download.txt下载列表

1667545584723

1667545606809

main方法同上。

实现多线程并行下载

JUC支持的线程池种类

在java.util.concurrent中,提供了工具类Executor(调度器)对象来创建线程池,可创建的线程池有四种:

1.FixedThreadPool-定常线程池

2.CachedThreadPool-可缓存线程池

3.SingleThreadExecutor-单线程池

4.ScheduledThreadPool-调度线程池

JDK不同版本特性

JDK9-通过try块自动关闭资源

1667867196147

原:

1667868409068

通过try块后简化。

1667868378416

JDK10新特性-var动态类型判断

1667871530733

1667876550747