java学习笔记
1|0键盘输入
接收用户输入的数据,使用键盘输入语句来获取。Input.java,需要一个扫描器(对象)Scanner
2|0打印九九乘法表
3|0类与对象
类就是数据类型
对象就是一个具体的实例
创建对象
- 先声明再创建
Cat cat;
cat = new Cat();
- 直接创建
Cat cat = new Cat()
4|0成员方法
成员方法的定义
public 返回数据类型 方法名 (形参列表……) {//方法体
语句;
return 返回值;
}
4|1方法使用细节
- 一个方法最多有一个返回值 返回多个结果 数组
- 返回类型可以为任意类型,包含基本类型或引用类型(对象、数组)
- 如果方法要求有返回数据类型,则方法体中最后执行语句为 return 值;返回数据类型和return的值类型一致或兼容
- 如果方法是void,则方法中可以没有return语句,或只写return;方法名 驼峰命名法
- 方法体内不能定义方法
同一个类中的方法: 直接调用
跨类中的方法A调用B类方法: 需要通过对象名调用。
跨类的方法调用和方法的访问修饰符相关。
输出:
4|2小练习1
编写类BB ,有一个方法: 判断一个数是偶数odd还是奇数,返回boolean
4|3小练习2
//根据行、列字符打印,对应行数和列数的字符
传参机制
基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参。
引用数据类型,传递的是值(地址)。(对象、数组)
5|0方法递归调用
递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂问题,同时可以让代码变 得简洁
6|0方法的重载
java 中允许同一个类中,多个同名方法的存在,但要求 形参列表不一致! 比如:System.out.println(); out 是 PrintStream 类型
注意事项
1)方法名: 必须相同
2)参数列表: 必须不同(参数类型或个数或顺序,至少有一样不同,参数名无要求)
3)返回类型: 无要求
7|0可变参数
基本概念: java允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。
基本语法: 访问修饰符 返回类型 方法名(数据类型… 形参名)
7|1注意细节
可变参数的实参 可以为0或任意多个
可变参数的实参可以为数组
可变参数的本质就是数组
可变参数可以和普通型的参数一起放在形参列表,但必须保证可变参数放在最后
一个形参列表中只能出现一个可变参数
7|2可变参数的使用
有三个方法,分别实现返回姓名和两门课成绩(总分),返回姓名和三门课成绩(总分),返回姓名和五门课(总分)。封装成一个可变参数的方法
8|0作用域
全局变量(成员变量): 也就是属性,作用域为整个类体 Cat类: cry eat 等方法使用属性
属性在定义时,可以直接赋值。全局变量可以不赋值,直接使用,因为有默认值,局部变量必须赋值后,才能使用,因为没有默认值。
使用细节 属性和局部变量可以重名,访问时遵循就近原则。
属性生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁。局部变量,生命周期较短
,伴随着他的代码块执行而执行,伴随着代码块的销毁而销毁,既在一次方法调用过程中。
全局变量/属性: 可以被本类使用,或其他类使用(通过对象调用)
局部变量只能在本类中对应的方法中使用
全局变量/属性可以加修饰符
局部变量不可以加修饰符
9|0构造方法/构造器
. 基本语法
1)构造器的修饰符可以默认,也可以是public protected private
2)构造器没有返回值
3)方法名和类名必须一样
4)参数列表和成员方法一样的规则
5)构造器的调用由系统完成
构造器,是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。
1)方法名和类名相同
2)没有返回值
3)在创建对象时,系统会自动的调用该类的构造器完成对对象的初始化。
如果没有定义构造方法,系统会自动给类生成一个默认无参构造方法也叫(默认构造方法)
一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器,除非显式定义一下,Person(){}
定义一个Person2类添加两个构造器
第一个无参构造器:利用构造器设置所有人的age属性初始值都为18
第二个带pName和pAge两个参数的构造器
使得每次创建Person对象的同时初始化对象的age属性值和name属性值。
分别使用不同的构造器,创建对象
10|0this关键字
java虚拟机会给每个对象分配this,代表当前对象。
this关键字可以用来访问本类的属性、方法、构造器
this用于区分当前类的属性和局部变量
访问成员方法的语法: this.方法名(参数列表)
访问构造器语法: this(参数列表);只能在构造器中使用 构造器中调用另一个构造器
this不能在类定义的外部使用,只能在类定义的方法中使用
11|0冒泡排序
12|0Idea(集成开发环境) -IDEA的使用
12|1idea常用快捷键
1.删除当前行默认ctrl + y
2.复制当前行ctrl + d
3.补全代码alt + /
4.添加取消注释 ctrl + /
5.导入该行需要的类 alt + enter
6.快速格式化代码 ctrl + alt+ L
7.生成构造方法 alt + insert
8.查看一个类的层级关系 ctrl + H 可以右击可以查看图
9.将光标放到一个方法上,输入ctrl + B,可以选择定位到哪个类的方法
10.自动的分配变量名,通过在后面.var
11.等等自定义
13|0idea自定义模板
模板自定义模板
file-> settings -> editor -> Live templates -> 查看现有的模板
14|0包
包的三大作用
1.区分相同名字的类
2.当类很多时,可以很好的管理类 【Java API 文档】
3.控制访问范围
14|1包基本语法
package com.hmklove
说明:
- package : 关键字,表示打包
- com.hmklove: 表示包名
14|2Java包原理
包的本质分析:(原理)
包的本质实际上就是创建不同的文件夹来保存类文件
14|3包的快速入门
14|4包命名
命名规则:
只能包含数字、字母、下划线、小圆点,但不能用数字开头,不能是关键字、保留字
命名规范:
一般是小写字母+小圆点一般是
com.公司名.项目名.业务模块名
举例: com.sina.crm.user //用户模块
14|5常用的包
一个包下,包含很多的类,java中常用的包有:
- java.lang.* //lang包是基本包,默认引入,不需要再引入
- java.util.* //util包,系统提供的工具包,工具类,使用Scanner
- java.net.* //网络包,网络开发
- java.awt.* //是做java的界面开发,GUI
14|6如何导入包
语法: import 包
- 引入一个包的主要目的是使用该包下的类
- 比如import.java.util.Scanner;就只是引入一个类Scanner
- import java.util.*;表示将java.util包所有都引入
注意事项和使用细节
- package的作用是声明当前类所在的包,需要放在类的最上面,一个类中最多只有一句package。
- import 指令 位置放在package的下面,在类定义前面,可以有多句且没有顺序。
15|0访问修饰符规则
java提供了四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限(范围):
- 公开级别:用public修饰,对外开放
- 受保护级别:用protected修饰,对子类和同一个包中的类公开
- 默认级别: 没有修饰符号,向同一个包的类公开
- 私有级别:用private修饰,只有类本身可以访问,不对外公开
不同包只能访问 public修饰的属性
16|0封装
封装介绍
封装就是把抽象出的数据[属性]和对数据的操作[方法] 封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作[方法],才能对数据进行操作。
好处: 1. 隐藏实现细节 2. 可以对数据进行验证,保证安全合理
16|1封装实现的步骤:
-
将属性进行私有化private 【不能直接修改属性】
-
提供一个公共的set方法,用于对属性判断并赋值
-
提供一个公共的方法(pubic)get方法,用于获取属性的值
17|0继承
解决代码复用
- 当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends来声明继承父类即可。
继承的基本语法
- 子类继承了所有的属性和方法,但是私有属性和方法不能直接在子类直接访问,需要通过父类提供公共的方法去访问。
- 子类必须调用父类的构造器,完成父类的初始化(相当于子类构造器有一个隐藏的super)
- 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则编译不通过。
- 如果希望只当去调用父类的某个构造器,则显式的调用一下:super(参数列表)
- super在使用时,需要放在构造器的第一行
- super()和this() 都只能放在构造器的第一行,所以这两个方法不能共存在一个构造器。
- java所有类都是Object类的子类,Object是所有类的基类
- 父类构造器的调用不限于直接父类!将一直往上追溯直到Object类(顶级父类)
- 子类最多只能继承一个父类(直接继承),java中是单继承机制
- 不能滥用继承,子类和父类之间必须满足is-a的逻辑关系
编写Computer 类,包含内存、cpu,硬盘等属性,getDetails方法用于返回Computer的详细信息
编写PC子类,继承Computer类,添加特有属性brand
17|1super关键字
super代表父类的引用,用于访问父类的属性、方法、构造器
- 访问父类的属性,但不能访问父类的private属性 super.属性名
- 访问父类的方法,但不能访问父类的private方法 super.方法名(参数列表)
- 访问父类的构造器 super(参数列表);只能放在构造器的第一句,只能出现一句。
18|0方法重写/覆盖(override)
方法重写就是子类有一个方法,和父类的某个方法的名称,返回类型、参数一样,那么我们就说子类的这个方法覆盖了父类的那个方法。
- 子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类,比如父类返回类型是Object,子类方法返回类型是String。
- 子类方法不能缩小父类方法的访问权限
19|0多态(polymorphic)
多态的基本介绍
方法或对象具有多态。是面向对象的第三大特征,多态是建立在封装和继承基础之上的。
19|1方法的多态
重写和重载就体现多态
19|2对象的多态
- 一个对象的编译类型和运行类型可以不一致
- 编译类型在定义对象时,就确定了,不能改变
- 运行类型是可以变化的
- 编译类型看定义时 = 号的左边,运行类型 看 = 号的右边
多态的前提是: 两个对象(类) 存在继承关系
19|3多态的向上转型
- 本质: 父类的引用指向了子类的对象
- 语法: 父类类型 应用名 = new 子类类型();
- 特点: 编译类型看左边,运行类型看右边。 可以调用父类中的所有成员(需遵守访问权限),不能调用子类中的特有成员。
19|4多态的向下转型
- 语法: 子类类型 引用名 = (子类类型) 父类引用;
- 只能强转父类的引用,不能强转父类的对象
- 要求父类的引用必须指向的是当前目标类型的对象
- 可以调用子类类型中所有的成员
属性没有重写之说,属性的值看编译类型
19|5instance of比较操作符,用于判断对象的运行类型是否为XX类型或XX类型的子类型
20|0java的动态绑定机制
21|0多态的应用
1)多态数组
数组的定义类型为父类类型,里面保存的实际元素类型为子类类型
应用实例:现有一个继承结构如下:要求创建一个Person对象、2个Student对象和2个Teacher对象,统一放在数组中,并调用say方法。
应用实例升级:如何调用子类特有的方法,比如Teacher有一个teach,Student有一个study 怎么调用?
Student
Teacher
== 引用类型 判断的是地址
equals方法
equals:是Object类中的方法,只能判断引用类型
默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。比如Inter,String
22|0重写Object equals方法
23|0hashCode方法
hashCode
public int hashCode()
返回对象的哈希码值。支持这种方法是为了散列表,如
HashMap
提供的那样 。
hashCode
的总合同是:
- 只要在执行Java应用程序时多次在同一个对象上调用该方法,
hashCode
方法必须始终返回相同的整数,前提是修改了对象中equals
比较中的信息。 该整数不需要从一个应用程序的执行到相同应用程序的另一个执行保持一致。- 如果根据
equals(Object)
方法两个对象相等,则在两个对象中的每个对象上调用hashCode
方法必须产生相同的整数结果。- 不要求如果两个对象根据
equals(java.lang.Object)
方法不相等,那么在两个对象中的每个对象上调用hashCode
方法必须产生不同的整数结果。 但是,程序员应该意识到,为不等对象生成不同的整数结果可能会提高哈希表的性能。尽可能多的合理实用,由类别
Object
定义的hashCode方法确实为不同对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但Java的编程语言不需要此实现技术。)
结果
该对象的哈希码值。
两个引用,如果指向的是同一个对象,则哈希值肯定是一样的!
两个引用,如果指向的是不同对象,则哈希值是不一样的
哈希值主要是根据地址号来的!不能完全将哈希值等价于地址
后面在集合中,hashCode如果需要的话,也会重写。
24|0toString()
返回对象的字符串表示形式。一般来说, toString
方法返回一个“textually代表”这个对象的字符串。结果应该是一个简明扼要的表达,容易让人阅读。建议所有子类覆盖此方法。
该toString
类方法Object
返回一个由其中的对象是一个实例,该符号字符的类的名称的字符串
@` ”和对象的哈希码的无符号的十六进制表示。 换句话说,这个方法返回一个等于下列值的字符串:
-
结果
对象的字符串表示形式。
重写toString方法,打印对象或拼接对象时,都会自动调用该对象的toString形式.
当直接输出一个对象时,toString 方法会被默认的调用,比如
System.out.println(monster);就会默认调用monster.toString()
25|0finalize方法垃圾回收
26|0类变量 类方法
26|1什么是类变量
类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量。
定义语法
访问修饰符 static 数据类型 变量名;
static 访问修饰符 数据类型 变量名;
访问类变量
类名.类变量名 或 对象名.类变量名 【静态变量的访问修饰符的访问权限和普通属性是一样的】
推荐 : 类名.类变量名
26|2类变量使用细节
什么时候使用类变量
当我们需要让某个类的所有对象都共享一个变量时,就可以考虑使用类变量(静态变量):比如:定义学生类,统计所有学生共交多少钱。Student (name,fee)
类变量与实例变量(普通属性)区别
类变量是该类的所有对象共享的,而实例变量是每个对象独享的
加上static称为类变量或静态变量,否则称为实例变量/普通变量/非静态变量
类变量可以通过 类名.类变量名 或者 对象名.类变量名 来访问,但java设计者推荐使用类名.变量名方式访问(前提 满足访问修饰符的访问权限和范围)
实例变量不能通过 类名.类变量名 方式访问
类变量是在类加载时就初始化了,即使你没有创建对象,只要类加载了,就可以使用类变量
类变量的声明周期是随类消亡而销毁
26|3类方法基本介绍
-
类方法也叫静态方法
-
形式:
-
访问修饰符 static 数据返回类型 方法名(){ } 推荐
-
static 访问修饰符 数据返回类型 方法名()
26|4类方法经典使用场景
-
当方法中不涉及到任何和对象相关的成员,则可以将方法设计成静态方法,提高开发效率。
-
比如:工具类中的 utils
Math类,Array类、Collections 集合类看下源码
-
在程序开发,往往会将一些通用的方法,设计成静态方法,这样我们不需要创建对象,就可以使用了,比如打印以为数组、冒泡排序,完成某个计算任务等。
- 类方法和普通方法都是随着类的加载而加载,将结构信息存储在方法区:类方法中无this的参数
- 类方法可以通过类名调用,也可以通过对象名调用
- 普通方法和对象有关,需要通过对象名调用,比如对象名.方法名
静态方法只能访问静态成员,非静态的方法,可以访问静态成员和非静态成员(必须遵守访问权限)。
27|0main方法语法
- main方法 虚拟机调用
- java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public
- java虚拟机在执行main()方法时,不必创建对象,所以该方法必须是static
- 该方法接收String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数
- java 执行的程序 参数1 参数2 参数3
1)在main()方法中,我们可以直接调用main方法所在类的静态方法或静态属性
2)但是,不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员
28|0final的基本使用
29|0抽象类
用abstract关键字来修饰一个类时,这个类就叫抽象类
访问修饰符 abstract 类名 {
}
用abstract关键字来修饰一个方法时,这个方法就是抽象方法
访问修饰符 abstract 返回类型 方法名(参数列表); //没有方法体
抽象类的价值更多的作用是在于设计,是设计者设计好后,让子类继承实现抽象类
30|0抽象类使用细节
- 抽象类不能被实例化
- 抽象类不一定要包含abstract方法。
- 一旦包含了abstract方法,则这个类必须声明为abstract
- abstract只能修饰类和方法,不能修饰属性和其他的
- 抽象类可以有任意的成员【抽象类还是类】
- 抽象方法不能有主体,既不能实现
- 如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为abstract类
- 抽象方法不能使用private、final、和static来修饰,因为这些关键字都是和重写相违背的
30|1练习
编写一个Employee类,声明为抽象类,包含如下三个属性:name,id,salary.提供必要的构造器和抽象方法:work()。对于Manager类来说,他既是员工还具有奖金(bonus)的属性。请使用继承的思想,设计CommonEmployee类和Manager类,要求类中提供必要的方法进行属性访问,实现work(),提示“经理/普通员工 名字 工作中”
31|0抽象模板模式
32|0接口
接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,再根据具体情况把这些方法写出来。
语法:
interface 接口名{
//属性
//方法
}
class 类名 implements 接口{
自己属性;
自己方法;
必须实现的接口的抽象方法
}
- 在jdk7前 接口里的所有方法都没有方法体
- jdk8后接口类可以有静态方法,默认方法,也就是说接口中可以有方法的具体实现
2个程序员,编写两个类,分别完成对mysql,oracle数据库的连接、关闭
接口
mysql 类实现接口
oracle类实现接口
32|1接口的注意事项与细节
- 接口不能被实例化
- 接口中所有的方法是public方法,接口中抽象方法,可以不用abstract修饰
- 一个普通类实现接口,就必须将该接口的所有方法实现
- 抽象类实现接口,可以不用实现接口的方法
- 一个类同时可以实现多个接口
- 接口中的属性,只能是final的,而且是public static final 修饰符。int a =1;实际上是public static final int a = 1;(必须初始化)
- 接口中属性的访问形式:接口名.属性名
- 一个接口不能继承其他的类,但是可以继承多个别的接口
- 接口的修饰符 只能是public和默认,这点和类修饰符是一样的
接口多态性
32|2多态参数
编写一个方法,计算机工作
形参是接口类型 实现了接口的类的对象可以传进来
public class Compute{
public void work(UsbInterface usbInterface){
// 通过接口,来调用方法
usb.Interface.start();
usb.Interface.stop();
}
}
32|3多态数组
给Usb数组中,存放Phone 和 相机对象,Phone类还有一个特有的方法call(),请遍历Usb数组,如果是Phone对象,除了调用Usb定义的 接口方法外,还需要调用Phone 特有方法call.
32|4多态传递
33|0内部类
基本介绍:
一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类(inner class),嵌套其他类的类被称为外部类(outer class)。是我们类的第五大成员。内部类的最大特点就是可以直接访问私有属性,并可以体现类与类之间的包含关系。
33|1内部类的分类
- 定义在外部类局部位置上(比如方法中)
- 局部内部类(有类名)
- 匿名内部类(没有类名 !!!)
- 定义在外部类的成员位置上
- 成员内部类(没用static修饰)
- 静态内部类(使用static修饰)
局部内部类
定义在外部类的局部位置,比如方法中,并且有类名。
-
可以直接访问外部类的所有成员,包含私有的
-
不能添加访问修饰符,因为它的地位就是一个局部变量。局部变量是不能使用修饰符的。但是可以使用final修饰,因为局部变量可以使用final
-
作用域:仅仅在方法和代码块中
-
局部内部类---访问---外部类的成员【访问方式:直接访问】
-
外部类---访问---局部内部类
访问方式: 创建对象,再访问(必须在作用域内)
-
外部其他类---不能访问---局部内部类(因为局部内部类地位是一个局部变量)
-
如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员可以使用外部类名.this.成员 去访问
匿名内部类
本质是类 内部类 该类没有名字 同时还是一个对象
匿名内部类是定义在外部类的局部位置,比如方法中,并且没有类名
-
匿名内部类的基本语法
匿名内部类的最佳实践
当参数直接传递,简洁高效。
成员内部类
成员内部类是定义在外部类的成员位置
- 成员内部类是定义在外部类的成员位置,并且没有static修饰
- 可以直接访问外部类的所有成员,包含私有的
- 可以添加任意访问修饰符(public、protected、默认、private),因为它的地位就是一个成员
- 作用域和外部类的其他成员一样,为整个类体,在外部类的成员方法中创建成员内部类对象,在调用方法
- 成员内部类---访问--->外部类 直接访问
- 外部类---访问--->内部类 创建对象再访问
- 外部其他类---访问--->成员内部类
- 如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员可以使用外部类名.this.成员 去访问
静态内部类
静态内部类是定义在外部类的成员位置,并且用static修饰
- 可以直接访问外部类的所有静态成员,包含私有的,但不能访问非静态成员
- 可以添加任意访问修饰符,因为它的地位就是一个成员
- 作用域:同其他的成员,为整个类体
- 静态内部类---访问--->外部类(静态属性,直接访问所有静态成员)
- 外部类---访问--->静态内部成员 (创建对象---访问)
- 如果外部类和静态内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员可以使用外部类名.成员 去访问
34|0异常
基本概念
java语言中,将程序执行过程中发生的不正常情况称为“异常”。开发过程中的语法错误和逻辑错误不是异常
执行过程中所发生的异常事件可分为两类
Error(错误):java虚拟机无法解决的严重问题。如JVM系统内部错误、资源耗尽等严重情况。比如StackOverFlow[栈溢出]和OOM(out of memory),Error是严重错误,程序会崩溃
Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针访问,试图读取不存在的文件,网络连接中断等。Exception分为两大类:运行时异常[]和编译时异常[]。
运行时异常,编译器不要求强制处置的异常。一般是指编程时的逻辑错误,是程序员应该避免其出现的异常java.lang.RuntimeException类及它的子类都是运行时异常,可以不做处理,这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响。编译时异常,是编译器要求必须处置的异常。
34|1运行时异常
空指针异常
数字格式不正确异常
数组下标越界异常
类型转换异常
数学运算异常
34|2编译时异常
编译异常是指在编译期间就必须处理的异常,否则代码不能通过编译
常见的编译异常
- SQLExecption 操作数据库时,查询表可能发生异常
- IOException 操作文件时,发生的异常
- FileNotFoundException 当操作一个不存在的文件时,发生异常
- ClassNotFoundException 加载类,而该类不存在时,异常
- EOFException 操作文件,到文件末尾,发生异常
- IllegalArguementException 参数异常
35|0异常处理
异常处理就是当异常发生时,对异常处理的方式
- try-catch-finally
程序员在代码中捕获异常,自行处理
- throws
将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM
35|1try-catch异常处理
-
java提供try和catch块来处理异常。try块用于包含可能出错的代码。catch用于处理try中发生的异常。可以根据需要在程序中有多个try...catch块。子类异常放在前面,父类异常放在后面。
-
基本语法
-
可以进行try-finally配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉。应用场景,就是执行一段代码,不管是否发生异常,都必须执行某个业务逻辑。
try-catch-finally
- 如果没有出现异常,则执行try块中的所有语句,不执行catch块中语句,如果有finally,最后还需要执行finally里面的语句
- 如果出现异常,则try块中异常发生后,剩下的语句不再执行。将执行catch块中的语句,如果有finally,最后还需要执行finally里面的语句。
36|0throws异常处理
- 如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显式地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法地调用者负责处理。
- 在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。
36|1throws异常处理使用细节
- 对于编译异常,程序必须处理,比如try-catch或者throws
- 对于运行异常,程序中如果没有处理,默认就是throws的方式处理
- 子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类型
- 在throws过程中,如果有方法try-catch,就相当于处理异常,就可以不必throws
37|0自定义异常
当程序中出现了某些“错误”,但该错误信息,并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述错误信息
37|1自定义异常的步骤
- 定义类: 自定义异常类名(程序员自己写)继承exception或RuntimeException
- 如果继承Exception,属于编译异常
- 如果RuntimeException,属于运行异常(一般来说,继承RuntimeException)
自定义异常应用实例
当我们接收Person对象年龄时,要求范围在18-120之间,否则抛出一个自定义异常(要求 继承RuntimeException),并给出提示信息
意义 | 位置 | 后面跟的东西 | |
---|---|---|---|
throws | 异常处理的一种方式 | 方法声明处 | 异常类型 |
throw | 手动生成异常对象的关键字 | 方法体中 | 异常对象 |
本章作业
编写应用程序EcmDef.java,接收命令行的两个参数(整数)。计算两数相除。
计算两个数相除,要求使用cal(int n1, int n2)
对数据格式不正确(NumberformatException)、缺少命令行参数(ArrayIndexOutofBoundsException)、除0 进行异常(ArithmeticException)处理
38|0枚举类
把具体的对象一个一个例举出来的类就称为枚举类
枚举是一组常量的集合
枚举属于一种特殊的类,里面只包含一组有限的特定的对象
枚举的两种实现方式
- 自定义枚举类
- 使用enum关键字实现枚举
38|1自定义枚举类
构造器私有化
本类内部创建一组对象
对外暴露对象(通过为对象添加public final static 修饰符)
可以提供get方法,但是不要提供set方法
38|2使用enum关键字实现枚举
枚举对象必须放在枚举类的行首。
38|3Enum使用细节
- 使用enum关键字后,就不能再继承其他类了,因为enum会隐式继承Enum,而java是单继承机制。
- 枚举类和普通类不一样,可以实现接口。
39|0注解
注解(Annotation)也被称为元数据(Metadata),用于修饰解释包、类、方法、属性、构造器、局部变量等数据信息。
和注释一样,注解不影响程序逻辑,但是注解可以被编译或运行,相当于嵌入再代码中的补充信息。
在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替java EE|旧版中所遗留的繁冗代码和XML配置等。
39|1三个基本的Annotation:
- @Override:限定某个方法,是重写父类方法,该注解只能用于方法
- @Deprecated:用于表示某个程序元素(类、方法等)已过时
- @SuppressWarnings:抑制编译器警告
@Override:
@Deprecated
用于表示某个程序元素(类,方法等)已过时
可以修饰方法,类,字段、包、参数 等等
该注解类有数组,String[] values() 设置一个数组 {"rawtypes","unchecked","unused"}
@Deprecated的作用可以做到新旧版本的兼容和过渡
39|2JDK的元注解
跳过
40|0常用类
包装类的分类
针对八种基本数据类型相应的引用类型---包装类
有了类的特点,就可以调用其中的方法
基本数据类型 | 包装类 |
---|---|
boolean | Boolean |
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
40|1包装类和基本数据类型的转换
包装类和基本数据类型的相互转换,这里int和Integer演示。
- jdk5前是手动装箱和拆箱,装箱:基本类型->包装类型,反之,拆箱
- jdk5以后(含jdk5)的自动装箱和拆箱方式
- 自动装箱底层调用的是valueOf方法,比如Integer.valueOf()
40|2String
-
String对象用于保存字符串,也就是一组字符序列
-
字符串常量对象是用双引号括起来的字符序列。
-
字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节
-
String类比较常用的构造方法
-
String类实现了接口 Serializable 【String 可以串行化:可以在网路上传输】
接口 Comparable 【String 对象可以比较大小】
-
String是final类,不能被其他的类继承
-
String 有属性 private final char value[];用于存放字符串内容
-
value 是一个final类型不可修改 地址不可修改 value不能指向 新的地址 单个字符可以变化
创建String对象的两种方式
- 直接赋值 String s = "myh";
- 调用构造器 String s = new String("myh");
重要规则: String c1 = "ab" + "cd"; 常量相加看的是池
String c1 = a + b; 变量相加是在堆中
String类的常见方法
String类是保存字符串常量的。每次更新都需要重新开辟空间,效率较低,因此java的设计者还提供了StringBuild和StringBuffer来增强String的功能,并提高效率。
40|3StringBuffer类
构造方法摘要
String 和StringBuffer的相互转换
StringBuffer类常见方法
StringBuffer类常见方法
- 增 append
- 删 delete(start,end)
- 改 replace(start,end,string) //将start---end之间的内容替换掉,不含end
- 查indexOf ///查找子串在字符串第一次出现的索引,如果找不到返回-1
- 插 insert
- 获取长度 length
40|4StringBuilder类
- 一个可变的字符序列。 此类提供一 个与StringBuffer 兼容的API,但不保证同步(StringBuilder不是线程安全)。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer要快[后面测]。
- 在StringBuilder. 上的主要操作是append和insert方法,可重载这些方法,以接受任意类型的数据。
40|5Math类
Math类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。
40|6Arrays类
Arrays里面包含了一系列静态方法,用于管理或操作数组(比如排序和搜索)。
- toString返回数组的字符串形式
Arrays.toString(arr)
-
sort排序(自然排序和定制排序)Integer arr[] = {1, -1, 7, 0, 45};
-
binarySearch通过二分搜索法进行查找,要求必须排好序
int index = Arrays.binarySearch(arr,3); //存在 返回索引
40|7System类
-
exit退出当前程序
-
arraycopy:复制数组元素,比较适合底层调用,一般使用Arrays.copyOf完成数组复制。
-
currentTimeMillens: 返回当前时间距离1970-1-1的毫秒数
-
gc:运行垃圾回收机制 System.gc();
40|8大数据处理
40|9日期类
Date Calendar LocalDate
-
第一代日期类 Date 精确到毫秒,代表特定的瞬间
-
SimpleDateFormat:格式和解析日期的类
SimpleDateFormat: 格式化和解析日期的具体类,它允许进行格式化(日期->文本)、解析(文本->日期)和规范化。
第二代日期类
Calendar类(日历)
Calendar 类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
第三代日期类
JDK1.0中包含了一个java.util.Date,但是它的问题大多数方法已经在JDK1.1引入Calendar类之后被弃用了。而Calendar也存在问题:
- 可变性: 像日期和时间这样的类应该是不可变的
- 偏移性:Date中的年份是从1900开始的,而月份都是从0开始
- 格式化:格式化只对Date有用,Calendar则不行
- 此外,它们也不是线程安全的;不能处理闰秒等(每隔2天,多出1s)
第三类日期类常见方法
1) LocalDate(日期)、LocalTime(时间)、LocalDateTime(日期时间) jdk8加入
LocalDate只包含日期,可以获取日期字段
LocalTime只包含时间,可以获取时间字段、
LocalDatetime包含日期+时间,可以获取日期和时间字段
第三代日期类更多方法
LocalDateTime类
MonthDay类:检查重复事件
是否是闰年
增加日期的某个部分
使用plus方法测试增加事件的某个部分
使用minus方法测试查看一年前和一年后的日期
41|0练习
41|1Exercise1
1.将字符串中指定的部分进行反转。比如将“abcdef”反转为aedcbf
2.编写方法 public static String reverse(String str, int start, int end)
41|2Exercise2
输入用户名、密码、邮箱,如果信息录入正确,则提示注册成功,否则生成异常对象
要求: 用户名长度为2或3或4
密码的长度为6,要求全是数字 isDigital
邮箱中包含@和. 并且@在.的前面
41|3Exercise03
编写java程序,输入形式为:Yang chen Xu的人名,以Xu,Yang .C的形式打印出来。其中.S是中间单词的首字母。
41|4Exercise04
输入字符串,判断里面有多少个大写字母,多少个小写字母,多少个数字。
__EOF__

本文链接:https://www.cnblogs.com/hekang520/p/17058134.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2022-01-17 k8s