注意,下面即将出现一大波文字解释(可怕)
Java基础知识(一)的续集哈
Java基础知识(二)的续集哈哈
Java基础知识(三)的续集哈哈哈
一、Object类
1.1、Object类是所有对象的直接或间接父类,传说中的上帝...(哈哈哈);该类中定义的肯定是所有对象都具备的功能。
- Object类中已提供了对对象是否相同的比较方法equals(Object obj);
- 如果自定义类中也有比较相同的功能,没有必要重新定义;
- 只要沿袭父类的功能,建立自己特有比较内容即可,这就是覆盖;
- 输出语句打印对象时,会自动调用对象的toString方法,打印对象的字符串表现形式。
1.2、常用方法
- boolean equals(Object obj):用于比较两个对象是否相同;
- String toString(): 获取对象的字符串表现形式,类名@哈希值; getClass().getName()+"@"+Integer.toHexString(hashCode());
- Class getClass():获取正在运行的对象所属的字节码文件的对象,也就是如果Demo d = new Demo(); d.getClass()表示获取d执行的对象所属的字节码文件Demo.class对象
注:通常在自定义对象时,因为对象中都有自己特有描述,所以会建立对象自身的特有比较方法,或字符串表现形式,即会覆盖Object中的文件。
二、内部类
2.1、访问规则
- 内部类可以直接访问外部类中的成员,包括私有。之所以可以直接访问外部类中的成员,因为内部类中持有一个外部类的引用。 格式:外部类名.this
- 外部类要访问内部类,必须建立内部类对象; 直接访问内部类中的成员:Outer.Inner in = new Outer().new Inner(); in.function();
2.2、访问格式
- 当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中,直接建立内部类对象。格式: 外部类名.内部类名 变量名 = 外部类对象.内部类对象; Outer.Inner in = new Outer().new Inner();
- 当内部类在成员位置上,就可以被成员所修饰; 比如 private(将内部类在外部类中进行封装)、static(内部类就具备static的特性),当内部类被static修饰后,只能直接访问外部类中的static成员,出现访问局限性; 在外部其他类中,如何直接访问static内部类的非静态成员呢? new Outer.Inner().function(); 在外部其他类中,如何直接访问static内部类的静态成员呢? Outer.Inner.function();
- 注意:当内部类中定义了静态成员,该内部类必须是static的; 当外部类中的静态方法访问内部类时,内部类也必须是static的。
2.3、什么时候定义内部类呢?
当描述事物时,事物的内部还有事物,该事物用内部类来描述; 因为内部事物在使用外部事物的内容。
2.4、内部类在定义局部时
- 不可以被成员修饰符修饰(如static);
- 可以直接访问外部类中的成员,因为还持有外部类中的引用; 但不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量。
三、匿名内部类
- 匿名内部类其实是内部类的简写格式;
- 定义匿名内部类的前提: 内部类必须是继承一个类或实现接口;
- 匿名内部类的格式: new 父类或接口() { 定义子类的内容 };
- 其实匿名内部类是一个匿名子类对象,而且这个对象有点胖...(哈哈哈),可以理解为带内容的对象;
- 匿名内部类中定义的方法最好不超过3个(<3)。
四、异常:指程序在运行时出现不正常情况
4.1、异常的由来:
问题也是现实生活中一个具体的事物,也可以通过Java的类的形式进行描述,并封装成对象; 即Java对不正常情况进行描述后的对象体现。
问题的划分:
- 严重的问题:Java通过Error类进行描述,对于Error一般不编写针对性的代码,对其进行处理;
- 非严重的问题:Java通过Exception类进行描述,对于Exception可以使用针对性的处理方式,对其进行处理。
Error和Exception具有的共性内容:
- 如不正常情况的信息,引发原因等
Throwable(父类) |==> Error |==> Exception |==> RuntimeException
4.2、异常的处理:Java提供了特有的语句进行处理
// 异常处理语句
try {
// 需要被检测的代码
} catch(异常类 变量) {
// 处理异常的代码(处理方式)
} finally {
// 一定会执行的语句
}
4.3、对捕获到的异常对象进行常见方法操作
String getMessage(); // 捕获异常信息
String toString(); // 异常名称、异常信息
String printStackTrace(); // 异常名称、异常信息、异常出现的位置
// 其实 JWM 默认的异常处理机制,就是在调用 printStackTrace 方法
// 在函数上声明异常,便于提高安全性,让调用者进行处理,不处理编译失败
4.4、异常体系的特点
异常体系中所有类以及建立的对象都具备可抛性,即可以被 throw 和 throws 关键字所操作, 只有异常体系具备这个特点。
throw 和 throws 用法:
- throw 定义在函数内,用于抛出异常对象;
- throws 定义在函数上,用于抛出异常类,可以抛出多个,用逗号隔开。
- 当函数内容有 throw 抛出异常对象,并未进行 try 处理,必须在函数上声明,否则编译失败;
- RuntimeException 除外,即函数内如果抛出的 RuntimeException 异常,函数上可以不用声明;
- 如果函数声明了异常,调用者需要进行处理,处理方式可以在主函数上 throws 抛出异常、或者在主函数内 try 捕获异常
4.5、异常的分类
- 编译时被检测的异常: 该异常在编译时,如果没有处理,即没有抛也可以try,则编译失败; 该异常被标识,代表可以被处理;
- 运行时异常(编译时不检测): 在编译时,不需要处理,因为编译器不检查; 该异常的发生,建议不处理,让程序停止,需要对代码进行修正。
4.6、异常处理语句的三种格式
注: [finally] 中定义的通常是关闭源代码,因为资源必须释放; [finally] 只有一种情况不执行,当执行 System.exit(0); finally 不会执行,因为此时 JWM 停止,即终止了程序
// [1`]
try {
} catch() {
}
// [2`]
try {
} finally {
}
// [3`]
try {
} catch() {
} finally {
}
// 注: [finally] 中定义的通常是关闭源代码,因为资源必须释放; [finally] 只有一种情况不执行,当执行 System.exit(0); finally 不会执行,因为此时 JWM 停止,即终止了程序
4.7、自定义异常:定义类继承 Exception 或 RuntimeException
- 为让该自定义类具备可抛性;
- 为该类具备操作异常的共性方法。
当需要定义自定义异常的信息时,可以使用父类已经定义好的功能,异常信息传递父类的构造函数。
class MyException extends Exception { MyException (String message) { super(message); } }
自定义异常: 按 JWM 的面对对象思想,将程序中出现的问题进行封装。
4.8、异常的好处
- 将问题进行封装;
- 将正常流程代码和问题处理代码相分离,方便于阅读。
4.9、异常处理的原则
- 处理方式两种: throw 和 throws;
- 调用到抛出异常的功能时,抛出几个,处理几个,一个 try 对应多个 catch;
- 多个 catch,父类的 catch 放到最下面;
- catch 内需要定义针对性的处理方式,不要简单的定义 printStackTrace,输出语句,也不能不写。
// 当捕获到的异常,本功能处理不了时,可以继续在 catch 中抛出 try { throw new AException(); } catch(AExpcetion e) { throw e; } // 若异常处理不了,但并不属于该功能出现的异常,可以将异常处理后,再抛出和该功能相关的异常 // 或异常可以处理,当需要将异常产生的,和本功能相关的问题提供出去,当调用者知道,并处理,也可以将捕获异常处理后,转换为新的异常 try { throw new AException(); } catch(AException e) { // 对AException处理 throw new BException(); // 例如汇款的, A汇给B, B再汇给C }
4.10、异常的注意事项
- 当子类父类覆盖时:
- 子类抛出的异常,必须是父类的异常的子类或子集;
- 若父类或者接口没有异常抛出时,子类覆盖出现异常,只能 try 不能抛(在异常的函数内 try)
五、包package
5.1、为简化类名的书写,使用一个关键字 import; import 导入包中的类,建议不要写通配符 * ,需要用到包中哪个类,就导入哪个类(按需导入); 建议定包名不要重复,可以使用 url 来完成定义, url 是唯一的。
如: www.ishaha.cn
===> package cn.ishaha.demo
===> package cn.ishaha.test
5.2、包导入的错误原因
- 类名(全名)是: 包名.类名;
- package包不再当前目录下, 需要设置 classpath,告诉 JWM 去哪找指定的 package 包;
- 有了包,范围变大,一个包中的类要被访问,必须要有足够大的权限,所以被访问的类要被 public 修饰;
- 类公有后,被访问的成员也要公有才可以被访问。
5.3、包的总结
- 包与包之间进行访问,被访问的包中的类,以及类中的成员,需要 public 修饰,不同包中的子类还可以直接访问,父类中被 protected 权限修饰的成员。
- 包与包之间可使用的权限只有两种: public 、 protected
public protected default(默认) private 同一类中 ok ok ok ok 同一包中 ok ok ok --- 子类 ok ok(子类继承不同包中) --- --- 不同包中 ok --- --- ---
5.4、Java常用包的说明
java.lang | Java的核心包 jdk.12 版本以后,该包中的类自动导入 |
java.awt | 用于制作图形界面 |
java.io | import output 用于操作设备上的数据 |
java.util | 定义 Java 工具类,集合、日期等 |
java.net | 用于网络通讯 |
java.applet | application let server let servlet, java server page jsp. (class haha implements Servlet{ }) (class hehe extends HttpServlet{ }) |
写给自己的随笔,有问题欢迎指出¯\_(ツ)_/¯