API--Object

    科技2022-07-13  175

    API

    不同包中可以定义同名的类,同包中不能存在同名的类 同包中的类可以直接使用 但是不同包且不属于java.lang包下的类都需要通过导包才可以使用 import 包名.类名; import 包名.*;//当前包下包含的类 如果没有导包编译报错: Cannot resolve symbol ‘Scanner’ 一旦类中指定导入了具体的类,则程序中通过简单类名来使用都是导入的类;如果不想使用导入的类,可以通过单独指定全路径名称来使用 如果不导包可以通过使用类的全路径名称来编码 java.util.Scanner sc = new java.util.Scanner(System.in);

    常见的包: java:JDK本身提供 javax:扩展 org:第三方提供的 apache

    java.io : 通过数据流、序列化和文件系统提供系统输入和输出 java.lang: 默认所有类都导入了该包 提供利用 Java 编程语言进行程序设计的基础类 java.math: 数学计算相关 java.net:为实现网络应用程序提供类 java.sql:数据库操作相关 java.util:工具类所属的包

    Object

    类 Object 是所有类的顶级父类 默认每个java类都会继承Object,如果没有显示指定父类,则父类就为Object;如果单独指定了父类,父类继承了Object,最终多重继承了Object类; Object类中的方法会被所有类继承到; 所有的类的对象都可以赋值给Object类型的引用–向上造型 构造方法:–创建对象 Object() – 无参构造 通过无参构造来创建对象: Object obj = new Object(); 方法: protected Object clone() --创建并返回此对象的一个副本。 权限修饰符 返回值类型 方法名 通过调用某个对象的clone的方法可以获取到一个新的对象,属性值和当前对象一样的 注意: 1、clone方法是protected 修饰,只能在本类 同胞类以及子类中访问 2、重写clone方法,将权限修饰符给为public,方法实现通过super调用父类的clone方法 3、clone方法有异常,子类重写时需要抛出异常 调用子类方法时也需要抛出异常 Unhandled exception: java.lang.CloneNotSupportedException 4、clone的返回值Object类型,修改重写的clone方法的返回值类型 例如: @Override public Person clone() throws CloneNotSupportedException { return (Person) super.clone(); } 5、如果对象需要调用clone方法来拷贝 则需要该对象的类实现Cloneable接口 Cloneable接口中没有任何的属性和方法,Cloneable接口作用为标记接口 java认为clone方法克隆对象存在安全问题,默认情况下不允许克隆对象;如果在开发过程某个类的对象需要克隆,则该类必须实现Cloneable接口

    Exception in thread "main" java.lang.CloneNotSupportedException: cn.tedu.object.Person at java.lang.Object.clone(Native Method) at cn.tedu.object.Person.clone(ObjectDemo.java:36) at cn.tedu.object.ObjectDemo.main(ObjectDemo.java:23)

    6、Object clone 浅表克隆 如果克隆的对象中有属性是引用数据类型的对象,会将属性对象的地址赋值一份给到新克隆对象的属性; 深表克隆: 如果克隆的对象中有属性是引用数据类型的对象 在克隆时要新创建一个新的属性对象,且新的属性对象的值要和之前属性对象的值一致;

    案例: class Person implements Cloneable{ String name; int age; public void eat(){ System.out.println("吃饭~"); } @Override public Person clone() throws CloneNotSupportedException { return (Person) super.clone(); } } ``` ```java public class ObjectDemo { public static void main(String[] args) 抛出异常{ Person p = new Person(); p.name = "张三"; p.age = 18; p.eat(); System.out.println(p); //调用重写之后的clone方法 克隆p的对象 Person p3 = p.clone(); System.out.println(p3.name+","+p3.age); p3.eat(); } }

    protected void finalize() 当垃圾回收器确定不存在对该对象的更多引用时 由对象的垃圾回收器调用此方法。 自己调用finalize方法并不能立即释放对象的空间 堆空间

    Class<?> getClass() 返回此 Object 的运行时类 向上造型时,如果调用对象的getClass方法则可以获取到该对象的实际类型 获取实际类型的全路径名称: 对象.getClass().getName()–返回类的全路径名称的字符串

    String toString() 返回该对象的字符串表示 实现代码:

    public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }

    直接通过输出语句输出对象时底层默认就调用该对象的toString方法:

    System.out.println(obj); public void println(Object x) {//x=obj String s = String.valueOf(x); } public static String valueOf(Object obj) {//obj=obj return (obj == null) ? "null" : obj.toString(); }

    所有子类都会继承Object的toString方法;

    toString方法如果需要输出对象的属性值,则可以在子类中重写Object的toString方法; public String toString(){ return “name:”+name+",age:"+age; }

    int hashCode()–哈希码值 返回该对象的哈希码值。 特点: 同一个对象返回的哈希值相同 不同的对象对应的哈希码值不同 hash值相同–碰撞–概率非常小 暂时不考虑

    boolean equals(Object obj) equals()–比较引用对象的内容是否相同 默认实现比较的是地址

    指示其他某个对象是否与此对象“相等”。 Object中equals方法的实现如下: public boolean equals(Object obj) { return (this == obj); } equals方法的底层实现仍然时比较地址值;

    重写equals方法: 1、判断当前对象和参数对象地址值是否相同 2、判断参数对象是否为null 参数的实际类型和当前对象的实际类型是否一致 3、对象每个属性一 一判断 如果所有属性都相同则表示当前两个对象相同 返回true 否则false

    ==、equals方法: ==比较基本数据类型就是比较数据值 比较引用数据类型就是比较地址值 equals: 比较引用数据类型 如果没有重写equals方法 则比较的是两个对象的地址值 如果重写了equals方法 则比较的是两个对象内容

    空指针异常: 当对null调用属性或者方法时,就会抛出异常 NullPointException if(obj!=null){ //obj的属性和方法 }

    Processed: 0.011, SQL: 8