系列文章目录
第一章 基础知识、数据类型学习
第二章 万年历项目
第三章 代码逻辑训练习题
第四章 方法、数组学习
第五章 图书管理系统项目
第六章 面向对象编程:封装、继承、多态学习
第七章 封装继承多态习题
第八章 常用类、包装类、异常处理机制学习
第九章 集合学习
第十章 IO流、多线程学习
第十一章 仓库管理系统项目
第十二章 员工管理系统、多表查询、反射实现DBHelper学习
第十三章 DML、DDL、数据库对象学习
第十四章 网络编程、各种标签、CSS学习
第十五章 ECMAScript、BOM学习
第十六章 DOM、jQuery学习
第十七章 Servlet、jsp、Cookie、Ajax学习
文章目录
前言
第二周我们已经学习了数组、方法、多类共用一主类、父类子类、面向对象的封装继承多态等知识。其中面向对象编程是最重要的方面,若客官有时间请移步本系列第八章面向对象的课后练习。接下来我们会进行常用类(Object、String、Date)、异常处理的学习。在下攸攸太上,我们ൠ♄§星正在密谋选取新的地球大使,对我们星球感兴趣的客官请移步评论区,以不复制的方式打出我们星球的名字,我们会考虑由你来做我们的地球对ൠ♄§大使。千万不要复制,不然会被从我们星球发射的超光速毁灭光线射中大脑,在刚满80岁时自动得未知疾病转化为丧尸
一、常用类
1.Object(没有显式继承的类的父类)(所有类的祖先类)
1.1基本属性
这名字感觉挺牛啊:诸神之父 人类始祖
一看就是大人物!他确实是大人物,所有类的祖先类
在java.lang包下(lang包程序自动导入,也是为了Object类,因为所有类都是他的子孙后代)
特点:只有一个无参构造方法,不是抽象类、可以构建对象
属性:无
1.2重要方法
toString()
public String toString() {
return getClass().getName() + “@” + Integer.toHexString(hashCode());
}
作用: 将当前内存对象转成字符串形式输出给用户看
(全局限定名)@(哈希码转成16进制整数)
哈希码近似于邮政编码,全局确定你的地址
获取全局限定名,确定该类资源的身份
重写toString();为了得到该对象的所有属性,而不是内存地址(右键toString)给你返回属性值
举例:
private int stuid;
private String name;
private String phone;
@Override
public String toString() {
return "Student{" +
"stuid=" + stuid +
", name='" + name + '\'' +
", phone='" + phone + '\'' +
'}';
}
equals()
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return stuid == student.stuid &&
Objects.equals(name, student.name) &&
Objects.equals(phone, student.phone);
}
比的是地址
如果想要判断内容相同不相同
所以重写
hashCode()
@Override
public int hashCode() {
return Objects.hash(stuid, name, phone);
}
hashCode改写后改的是他们三个的哈希值相加不是原来的hash值,原来的hash是不变的
equals()如果确定两个对象是相等的话,那么两个对象的hash值应该相同,所以hashCode方法也应该进行重写
null,没有内存地址
[HashSet]集合—去重
首先比较hash值是否相同,(哈希值可能是2+2+2 = 1+1+4)
如果不等,可以直接开始存储了;
如果相等,在使用equals方法进行比较,比较属性是否相等
如果属性都相等,不可以存储
如果属性不相等,可以存储
String类下的equals如下(比的是内容):
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
2.String字符串的处理类
字符char
字符串String
*字符串处理类一共有三种:String, StringBuffer, StringBuilder
三者间的区别
String不可变
StringBuffer是可变的,线程安全的,效率低
StringBuilder是可变的,线程不安全的,效率高
一个内存地址只对应一个值叫做不可变
一个内存地址可以对应其他值叫可变
String类每次改变内容,都会新生成一个地址
在java.lang.String包下
2.1 继承结构,实现结构
继承java.lang.Object
Serializable , CharSequence , Comparable < String >
2.2 构造方法有哪些
Constructor and Description
String()
初始化新创建的 String对象,使其表示空字符序列。
String(byte[] bytes)
通过使用平台的默认字符集解码指定的字节数组来构造新的 String 。
String(byte[] bytes, Charset charset)
构造一个新的String由指定用指定的字节的数组解码charset 。
String(String original)
初始化新创建的String对象,使其表示与参数相同的字符序列; 换句话说,新创建的字符串是参数字符串的副本。
String(StringBuffer buffer)
分配一个新的字符串,其中包含当前包含在字符串缓冲区参数中的字符序列。
String(StringBuilder builder)
分配一个新的字符串,其中包含当前包含在字符串构建器参数中的字符序列。
2.3 常用方法有哪些
拆分:split
拼接:concat
截取:subString
查找:indexOf,lastIndexOf
比较:compareTo
替换:replace
大小写转换:toUpperCase、toLowerCase
1.Date时间类
第一阶段: 时间日期类
util下的时间类
可以获得年月日时分秒和星期几
java.sql.Date(没有无参构造)下的实践类
只能获得年月日
java.sql.date下的时间类是util时间类的子类
DateFormat时间的格式化:
是对util的格式化,可以自定义时间怎么分隔
一般使用yyyy-MM-dd-HH-mm-ss
年-月-日-时-分-秒
MMM写三个的话可以输出中文的月份
第二阶段
第一阶段的事件类型的方法已经几乎全部弃用了
我们使用Calendar类进行处理时间
jdk推荐使用Calendar类,进行时间管理
能够获取有有关时间的更多信息,使用Calender类改写过后的图书管理系统我会放在总结后,感兴趣的客官可以回到系列文章的第二章 JAVA集中学习第一周项目实践查看在什么地方有什么改进。
二、包装类
包装基本数据类型:都包装成包装类
8个数据类型,分别由对应的包装类
1.包装类的意义
1、基本数据类型不具备面向对象思想(基本数据类型没法找到对象调方法)
2、集合(约等于数组)只能存储引用数据类型变量,为了让集合能用基本数据类型
为什么集合不能使用基本数据类型?
目前还没有学到集合,学到集合时会有提及,有疑问的同学可以先查查。
是不是有了包装类就不用基本数据类型了?
程序会自动帮我转为包装类。(自动拆装箱概念:基本数据类型转型为包装类型)
我们使用Integer来举例:
在lang包下、继承了number、被final修饰不能继承number类、没有无参构造
主要的方法有MAX_VALUE和MIN_VALUE
有自动拆装箱方法
2.包装类和String类型之间的转换
字符串转化为数值
int c = Integer.parseInt(“123”);
System.out.println©;
基本自动转字符串
int d = 143;
Integer integer = new Integer(d);
System.out.println(integer.toString() + 4);
或
System.out.println(d + “”);(字符串自动将周围的其他类型转为【同化为】字符串)
3.自动拆包装操作
装箱:
基础数据类型转包装类
int a = 9;
Integer i = new Integer(a);
拆箱:
包装类转基础数据类型(程序自动.intValue())
Integer i = new Integer(7);
int b = i;
三、异常处理机制
1.基础理论
处理会使程序终止运行,报错的错误
作用: 可以保证程序继续运行,而不会因为不会影响大局的小问题而终止
2. 异常的分类
Throwable继承Object类
两个子类:
Error虚拟机内存溢出,内部错误(程序员解决不了,不用改代码)
Exception分为两个子类:
检查异常(编译前异常):检查时就标红(未运行时),这种异常必须处理
运行异常:运行时标红(运行后),可以不处理
3.保证程序不终止的两种解决方案
1、程序自己解决
try{//监控区
}catch(){//决定解决方案
}finally{//关闭资源
//出不出错都执行
}
try代码块没有问题不执行catch块,直接执行finally
有问题就执行类型匹配的catch块(子类异常在前,父类异常在后),执行finally
如果没有类型匹配的catch块,也会执行finally,最后在终止
2、程序自己解决不了,进行上报(声明/抛出异常)
throws 异常类型
异常处理机制的五个关键字
try
catch
finally
throws
throw
throw关键字:是自己制造异常
我们希望调用者重视这个问题,所以抛出这个异常,我们可以自定义一个异常类型,来精确的描述这个异常是什么种类的。
总结
本文介绍了常用类、包装类、异常处理三种知识。请各位客官在理解的基础上,思考如何在自己的代码中实现这些知识的使用。As always,如果帮到你一点点,在下也感到在下花费的时间是有价值的。
万年历项目Version2
import java.util.Calendar;
import java.util.Scanner;
public class Calender {
public static void main(String[] args) {
calacala();
}
public static void calacala(){
//1.接收
System.out.println("请输入一个时间(年-月-日)");
String str=new Scanner(System.in).next();
//2.转换:String---calender
java.sql.Date dt=java.sql.Date.valueOf(str);
Calendar calendar=Calendar.getInstance();//calendar 是当前系统时间。
calendar.setTime(dt);//calendar 代表 用户输入的时间。
//3.1 获得输入月份有多少天?
int days=calendar.getActualMaximum(Calendar.DATE);//获得该月份的最大日期。
//3.2 获得输入月份的1号是星期几?
calendar.set(Calendar.DATE,1);
int num=calendar.get(Calendar.DAY_OF_WEEK); //第几天:
//4.输入日历:
System.out.println("日\t一\t二\t三\t四\t五\t六\t");
for(int i=1;i<=num-1;i++){
System.out.print("\t");
}
for (int i=1;i<=days;i++){
System.out.print(i+"\t");
calendar.set(Calendar.DATE,i);
if(calendar.get(Calendar.DAY_OF_WEEK)==7){
System.out.println();
}
}
}
}