巴拉巴

 找回密码
 立即注册

站内搜索

搜索
热搜: 活动 交友 discuz
查看: 61|回复: 0

Java中包的作用以及使用、访问权限、单例/多例设计模式、枚举和异常附带相

[复制链接]

3

主题

7

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2023-8-4 19:20:26 | 显示全部楼层 |阅读模式
包的本质其实是目录,一个项目如果都在同一个目录下,那么如果项目上有多个人在开发,并且创建的类名是一样的就会产生冲突,并且如果一个项目都在一个包里进行那么也不适合模块化的开发

使用: 包可以通过插入(import)进行使用其他包内的类,但是注意如果调用别的包里的类名字和你自己包里面类名字一样的话,必须要详细的类,即包名加类名

导入方法:import.类 或者import.*(代表自动导入)

举例:我在Example101包和Example102的包中都设置了主类为javaDemo,现在要调用到两个主类
静态导入:用static导入则如同放在在主方法上无需进行实例化,如下图可以直接调用想要用的方法
2.系统常用包:
java.lang 包:这是 Java 的核心包,提供了Java语言的基本类和常用工具类。例如,String、Object、System、Math等类就位于该包中。
java.util 包:这个包提供了 Java 中许多实用的工具类,包括集合类(如List、Set、Map等)、日期和时间类、随机数生成器、排序算法等。
java.io 包:这个包提供了进行输入输出操作的类和接口,用于读写文件、网络通信、序列化等操作。例如,File、InputStream、OutputStream、Reader、Writer等都是该包中的常见类。
java.net 包:这个包提供了与网络通信相关的类和接口,用于创建和管理网络连接,进行网络编程等。例如,Socket、URL、URLConnection等类可以用于与服务器进行通信。
java.sql 包:这个包提供了与数据库交互的类和接口,用于执行数据库操作、连接数据库等。例如,Connection、Statement、ResultSet等类可以用于执行 SQL 查询和更新。
java.awt 和 javax.swing 包:这些包提供了 Java 的图形用户界面(GUI)组件和相关类,用于创建图形界面应用程序。例如,Frame、Button、Label等类用于创建窗口和控件。
java.nio 包:这个包提供了新的非阻塞 I/O 进行文件和网络操作。它引入了通道(Channel)和缓冲区(Buffer)的概念,提供更高效和可扩展的 I/O 操作。


访问的权限有多个分别是private public default protected

以下列表展示其四者的对比:

  • private:仅类内部可访问。
  • 默认(无修饰符):同一包内可访问。
  • protected:同一包内及子类可访问,不同包内的子类也可以访问。
  • public:所有地方都可以访问,没有限制。
static与final
static关键字用于表示静态成员,包括静态变量和静态方法。静态成员属于类本身,而不是实例化后的对象。可以通过类名直接访问静态成员。final关键字用于声明常量、防止方法被重写或类被继承。对于变量,final表示该变量的值不可更改;对于方法,final表示该方法不能被子类重写;对于类,final表示该类不能被继承。 面试题:final 在 java 中有什么作用?

(1)用来修饰一个引用

如果引用为基本数据类型,则该引用为常量,该值无法修改;
如果引用为引用数据类型,比如对象、数组,则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改。
如果引用时类的成员变量,则必须当场赋值,否则编译会报错。

(2)用来修饰一个方法
当使用final修饰方法时,这个方法将成为最终方法,无法被子类重写。但是,该方法仍然可以被继承。
(3)用来修饰类
当用final修改类时,该类成为最终类,无法被继承。
比如常用的String类就是最终类。
面试题:final、finally、finalize 有什么区别?

final可以修饰类,变量,方法,修饰的类不能被继承,修饰的变量不能重新赋值,修饰的方法不能被重写

finally用于抛异常,finally代码块内语句无论是否发生异常,都会在执行finally,常用于一些流的关闭。
finalize方法用于垃圾回收。
一般情况下不需要我们实现finalize,当对象被回收的时候需要释放一些资源,比如socket链接,在对象初始化时创建,整个生命周期内有效,那么需要实现finalize方法,关闭这个链接。
但是当调用finalize方法后,并不意味着gc会立即回收该对象,所以有可能真正调用的时候,对象又不需要回收了,然后到了真正要回收的时候,因为之前调用过一次,这次又不会调用了,产生问题。所以,不推荐使用finalize方法。
所谓单例,就是指类只能实例化一个对象,比如一个企业的CEO,创建其相应的类后,因为一个公司一般只有一个CEO,所以不能实例化多个,防止其他程序员错误创建。
如何实现单例的设计模式呢?其实很简单,首先创建一个对象操作过程如下
Example ex1 = new Example(传参)
那么就需要在外部(主方法)让其没办法实现这个操作,只需要
单例设计模式分为两类,饿汉模式懒汉模式

区分在于其实例化的时机
1.饿汉模式

是在类加载的时候就进行实例化,意味着程序一开始就实例化对象
案例代码:
2.懒汉模式

是指在调用类时候,才开始进行判断是否有唯一一个对象,若没有则创建唯一的对象,与饿汉模式相比,在程序开始时候并不会创建对象,只有要用到的时候才开始创建。其好处是可以减少程序开始运行时候的消耗
案例代码:
刚刚讲述的单例设计模式是指只有一个岗位所以只能实例化一个对象,而多例设计模式就能理解是多个对象,比如红绿灯,只有三个对象,红色,绿色,黄色。其实现过程其实和单例是差不多的。就是将public static final = new 对象1 复制粘贴 成为
public static final = new 对象1
public static final = new 对象2
public static final = new 对象3
记得私有化构造方法防止其他人创建新的对象
枚举类:

枚举其实就是多例化的设计模式,枚举出有多少个对象,但是枚举也有着很多独特的优势,比如说创造一个红绿灯,三个对象分别是RED GREEN YELLOW 那么可以在其类的内部对其进行switch判断比如说switch(c)case RED 。。。print(“当前为红灯”);一般的对象就没办法直接判断

如下枚举类的实用举例:
枚举类的实现接口 枚举类实现抽象方法
枚举类的常用方法:


  • name:返回枚举常量的名称。
  • ordinal:返回枚举常量在枚举声明中的位置(从 0 开始计数)。
  • valueOf(String name):返回具有指定名称的枚举常量。如果找不到指定名称的枚举常量,将抛出 IllegalArgumentException 异常。
  • values:返回包含所有枚举常量的数组。
  • compareTo(E other):比较枚举常量和指定对象的顺序。如果指定对象为枚举常量,则返回两者在枚举声明中位置的差值;如果指定对象为 null 或不是同一枚举类的实例,则抛出 ClassCastException 异常。
  • equals(Object other):检查枚举常量与指定对象是否相等。
  • hashCode:返回枚举常量的哈希码。
  • toString:返回枚举常量的字符串表示。
1.一般程序在编辑时候可能不会出现问题,但是运行时候就有可能会出现很多问题,比如说除法 number / number1 ,大家都知道number1 即被除数不能为0 ,但是在写这个的时候可能没有留意也不会弹出异常,但是在运行时候就会出现异常了。一旦产生异常又没有解决措施,那么问题就会给虚拟机jvm处理,jvm就会先打印错误信息后进行中断
2.异常的关键字 try catch finnally 与方法printStackTrace
上面可以知道异常如果不做任何措施的话就会中断,但是很多程序一旦运行就尽量不能终止,否则会给公司带来难以想象的损失,因此就需要用到try catch 与finnally 关键字。先解释以下三者的功能
try:尝试运行这段代码并查看是否会出现异常,如果尝试的过程出现异常,则立即生成一个对应异常的对象。

catch:对异常进行判断,因为异常也有很多种类,比如数组可能越界异常,数学计算可能出现异常。还有很多种类异常那么对应的处理也不同,catch就是用来捕捉try产生异常对象的比较,比如catch(ArithmeticException e)表明捕捉数学计算异常,如果匹配成功那么就执行catch内的操作否则跳过。

finally:不管会不会出现异常都会执行里面的操作

printStackTrace:打印错误信息与错误在第几行
案例代码:
面试题 :try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

会的
2.异常的种类
在 Java 中,异常是以类的形式存在的,它们都是 Throwable 类及其子类的实例。Throwable 是异常类的根类,它有两个直接的子类:Error 和 Exception。


  • Error:


  • Error 表示程序中的严重问题,通常由虚拟机抛出,并且在大多数情况下不应该被程序员显示捕获。
  • 一旦 Error 被抛出,程序就无法恢复,并终止执行。
  • 常见的 Error 类包括:VirtualMachineError、OutOfMemoryError、StackOverflowError 等。
Exception:

  • 异常是表示非致命性问题或意外情况的类。
  • Exception 又分为两种类型:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。
面试题:常见的异常类有哪些?


  • NullPointerException:空指针异常;

  • SQLException:数据库相关的异常;
  • IndexOutOfBoundsException:数组下角标越界异常;
  • FileNotFoundException:打开文件失败时抛出;

  • IOException:当发生某种IO异常时抛出;
  • ClassCastException:当试图将对象强制转换为不是实例的子类时,抛出此异常;
  • NoSuchMethodException:无法找到某一方法时,抛出;
  • ArrayStoreException:试图将错误类型的对象存储到一个对象数组时抛出的异常;
  • NumberFormatException:当试图将字符串转换成数字时,失败了,抛出;
  • IllegalArgumentException 抛出的异常表明向方法传递了一个不合法或不正确的参数。
  • ArithmeticException当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。
将异常抛给其他人去处理,可能会问有了try catch 明明可以在其类内部就将异常进行处理了,为什么还要进行抛给外面的人去解决呢?其实很好理解,比如在工作时候腿给摔断了,那么应该由谁处理?当然是公司处理,让公司解决你出现的问题。
异常抛出关键字 throw
面试题 throw 和 throws 的区别?
(1)throw

作用在方法内,表示抛出具体异常,由方法体内的语句处理;
一定抛出了异常;
(2)throws
作用在方法的声明上,表示抛出异常,由调用者来进行异常处理;
可能出现异常,不一定会发生异常;
异常的流程:
自定义异常:

虽然有很多很多种的异常类但是有很多并不算是正常执行,比如数据过于离谱的这种就应该触发异常。下面我举一个例子,吃包子,一般吃几个包子没问题,但是如果有人输入自己吃的包子过于多了那就不对劲,可以直接触发我们自己定义的异常
案例:
RuntimeException与Exception区别
在 Java 中,异常分为两种类型:RuntimeException 和 Exception。它们之间的区别如下:


  • RuntimeException:


  • RuntimeException 是 Exception 的子类。
  • RuntimeException 是非受检异常(Unchecked Exception),在编译时不强制要求进行异常处理。
  • RuntimeException 通常表示程序本身的错误或逻辑错误。
  • 常见的 RuntimeException 包括:NullPointerException、IllegalArgumentException、ArithmeticException 等。
Exception:

  • Exception 是所有异常类的父类,包括 RuntimeException 在内。
  • Exception 的直接子类中有受检异常(Checked Exception)和非受检异常(Unchecked Exception)。
  • 受检异常是在编译时强制要求处理的异常。方法必须声明可能抛出的受检异常,并通过 try-catch 块或 throws 子句进行处理,否则程序将无法通过编译。
  • 非受检异常在编译时不要求强制处理,但仍然可以选择捕获或抛出。
  • 常见的受检异常包括:IOException、SQLException、ClassNotFoundException 等。
区别总结:

  • RuntimeException 是非受检异常,不需要在编译时强制处理;Exception 中的其他子类都是受检异常,在编译时需要强制处理。
  • RuntimeException 通常表示程序本身的错误或逻辑错误;Exception 的其他子类通常表示外部资源的故障或不满足某些条件的情况。
  • 对于 RuntimeException 可以选择捕获或抛出,但不是必需的;对于受检异常,必须进行处理,要么捕获并处理,要么在方法签名中声明 throws 子句。
需要注意的是,在设计自定义异常类时,应根据异常的特性和使用场景来决定继承 RuntimeException 还是 Exception。如果异常属于程序的逻辑错误或操作错误,则可以继承 RuntimeException;如果异常属于外部资源故障或需要强制处理的情况,则应继承 Exception 或其子类。

来源:http://www.yidianzixun.com/article/0q87hEAP
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 返回顶部