Java基础知识(四) Object类、内部类、匿名内部类、异常、包package等

注意,下面即将出现一大波文字解释(可怕)

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、访问规则

  1. 内部类可以直接访问外部类中的成员,包括私有。之所以可以直接访问外部类中的成员,因为内部类中持有一个外部类的引用。   格式:外部类名.this
  2. 外部类要访问内部类,必须建立内部类对象;      直接访问内部类中的成员:Outer.Inner  in =  new Outer().new  Inner();  in.function();

 

2.2、访问格式

  1. 当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中,直接建立内部类对象。格式: 外部类名.内部类名  变量名 = 外部类对象.内部类对象;    Outer.Inner  in =  new Outer().new Inner();
  2. 当内部类在成员位置上,就可以被成员所修饰;  比如 private(将内部类在外部类中进行封装)、static(内部类就具备static的特性),当内部类被static修饰后,只能直接访问外部类中的static成员,出现访问局限性;     在外部其他类中,如何直接访问static内部类的非静态成员呢? new Outer.Inner().function();    在外部其他类中,如何直接访问static内部类的静态成员呢?  Outer.Inner.function();
  3. 注意:当内部类中定义了静态成员,该内部类必须是static的;    当外部类中的静态方法访问内部类时,内部类也必须是static的。

 

2.3、什么时候定义内部类呢?

当描述事物时,事物的内部还有事物,该事物用内部类来描述;    因为内部事物在使用外部事物的内容。

 

2.4、内部类在定义局部时

  1. 不可以被成员修饰符修饰(如static);
  2. 可以直接访问外部类中的成员,因为还持有外部类中的引用;   但不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量。

 


三、匿名内部类

  1. 匿名内部类其实是内部类的简写格式;
  2. 定义匿名内部类的前提:  内部类必须是继承一个类或实现接口;
  3. 匿名内部类的格式:  new 父类或接口() { 定义子类的内容 };
  4. 其实匿名内部类是一个匿名子类对象,而且这个对象有点胖...(哈哈哈),可以理解为带内容的对象;
  5. 匿名内部类中定义的方法最好不超过3个(<3)。

 

四、异常:指程序在运行时出现不正常情况    

4.1、异常的由来:

问题也是现实生活中一个具体的事物,也可以通过Java的类的形式进行描述,并封装成对象; 即Java对不正常情况进行描述后的对象体现。


 

问题的划分:

  1. 严重的问题:Java通过Error类进行描述,对于Error一般不编写针对性的代码,对其进行处理;
  2. 非严重的问题: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 定义在函数上,用于抛出异常类,可以抛出多个,用逗号隔开。
  1. 当函数内容有 throw 抛出异常对象,并未进行 try  处理,必须在函数上声明,否则编译失败;
  2. RuntimeException  除外,即函数内如果抛出的 RuntimeException 异常,函数上可以不用声明;
  3. 如果函数声明了异常,调用者需要进行处理,处理方式可以在主函数上  throws  抛出异常、或者在主函数内  try  捕获异常

 

4.5、异常的分类

  1. 编译时被检测的异常:  该异常在编译时,如果没有处理,即没有抛也可以try,则编译失败;    该异常被标识,代表可以被处理;
  2. 运行时异常(编译时不检测): 在编译时,不需要处理,因为编译器不检查;    该异常的发生,建议不处理,让程序停止,需要对代码进行修正。

 

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

  1. 为让该自定义类具备可抛性;
  2. 为该类具备操作异常的共性方法。

当需要定义自定义异常的信息时,可以使用父类已经定义好的功能,异常信息传递父类的构造函数。

class  MyException extends Exception {
    
    MyException (String message) {
        super(message);
    }

}

自定义异常: 按 JWM 的面对对象思想,将程序中出现的问题进行封装。

 

4.8、异常的好处

  1. 将问题进行封装;
  2. 将正常流程代码和问题处理代码相分离,方便于阅读。

 

4.9、异常处理的原则

  1. 处理方式两种:  throw  和 throws;
  2. 调用到抛出异常的功能时,抛出几个,处理几个,一个 try 对应多个 catch;
  3. 多个 catch,父类的 catch 放到最下面;
  4. 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、异常的注意事项

  1. 当子类父类覆盖时:
  2. 子类抛出的异常,必须是父类的异常的子类或子集;
  3. 若父类或者接口没有异常抛出时,子类覆盖出现异常,只能 try 不能抛(在异常的函数内 try)

 


五、包package

5.1、为简化类名的书写,使用一个关键字 import;   import 导入包中的类,建议不要写通配符 * ,需要用到包中哪个类,就导入哪个类(按需导入);    建议定包名不要重复,可以使用 url 来完成定义, url 是唯一的。

如: www.ishaha.cn 

    ===>    package       cn.ishaha.demo

    ===>    package       cn.ishaha.test

 

5.2、包导入的错误原因

  1. 类名(全名)是: 包名.类名;
  2. package包不再当前目录下, 需要设置 classpath,告诉 JWM 去哪找指定的 package 包;
  3. 有了包,范围变大,一个包中的类要被访问,必须要有足够大的权限,所以被访问的类要被 public 修饰;
  4. 类公有后,被访问的成员也要公有才可以被访问。

 

5.3、包的总结

  1. 包与包之间进行访问,被访问的包中的类,以及类中的成员,需要 public 修饰,不同包中的子类还可以直接访问,父类中被 protected 权限修饰的成员。
  2. 包与包之间可使用的权限只有两种: public  、 protected
 publicprotecteddefault(默认)private
同一类中okokokok
同一包中okokok---
子类okok(子类继承不同包中)------
不同包中ok---------

 

 

5.4、Java常用包的说明

java.langJava的核心包 jdk.12 版本以后,该包中的类自动导入
java.awt用于制作图形界面
java.io import output 用于操作设备上的数据
java.util定义 Java 工具类,集合、日期等
java.net用于网络通讯
java.appletapplication let server let servlet,  java server page jsp.  (class haha implements Servlet{  }) (class hehe extends HttpServlet{  })

 

写给自己的随笔,有问题欢迎指出¯\_(ツ)_/¯

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值