零基础学习java------day11------常用API

时间:2019-08-13
本文章向大家介绍零基础学习java------day11------常用API,主要包括零基础学习java------day11------常用API使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

API概述

API(application Programming Interface, 应用程序编程接口),是一些预先定义的函数。目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节

比如我需要在一个程序里面嵌入语音识别交互功能,那么这个功能如果让我们自己从零开始实现,肯定是不现实的,所以市场上面就出现了提供这个语音识别功能的公司,这些公司会提供给应用程序编程的接口,大家把这些类称为Xxx Voice API. 我们只需要调用相应的方法就可以实现我们想做的事情,底层实现不需要我们关注。本章涉及的java API指的就是JDK中提供的各种功能的java类

一   Object

1. 构造方法:

  public Object()

2. 成员方法

2.1  方法介绍

  public int hashCode()   返回对象的hashCode值(默认地址值根据特定算法运算得到的一个整数值),可重写(源码不可见,此方法是用native修饰,用native修饰的方法一般都是用其他语言实现(C),效率高)

  public final Class getClass()   返回字节码对象(Class对象),里面包含了类中的所有信息,不能被重写(此方法使用final修饰)

  public String toString():  返回对象的字符串形式(默认是全类名+地址值),可重写

  public boolean equals(Object obj):   判断两个对象是否是同一个对象,默认用==实现,可重写

1. hashCode

  一般用hashCode判断两个对象是不是同一个对象,如果hashCode不相等,则肯定不是一个对象,如果hashCode相等,则一定是同一个对象

public class ObjectClass {
    public static void main(String[] args) {
        Person p = new Person();
        Person p1 = new Person();
        System.out.println(p.hashCode()); //804564176
        System.out.println(p1.hashCode()); // 1421795058
    }
}
class Person{
    String name;
}

可见对象p和对象p1不是同一个对象(注释为得到的hashCode值)

 

2. getClass:

其余代码同上

Class clazz = p.getClass(); // 获取p的字节码对象  Person类的字节码对象
System.out.println(clazz); // class com._51doit.javase.day11.Person
System.out.println(clazz.getSimpleName()); // Person
System.out.println(clazz.getName());  // com._51doit.javase.day11.Person
System.out.println(clazz.getPackage()); // package com._51doit.javase.day11

3. toString:

System.out.println(p.toString()); //com._51doit.javase.day11.Person@2ff4acd0 全类名+@+hashcode值的16进制(hashcode值是10进制)
System.out.println(p); //com._51doit.javase.day11.Person@2ff4acd0  

println()内部实现是toString,toString源码如下,由此可理解打印的结果

4. equals

格式:对象1.equals(对象2)

 (1)equals和  ==  

  equals:判断两个对象是否是同一个对象(默认是==实现的,可重写)

  ==:连接基本数据类型(比较的是值)

    连接引用数据类型(比较的是地址值)

 (2)equals和hashCode的用法

  一般我们在比较对象是否是同一个对象的时候,是同时使用hashCode和equals

   

a. 先用hashCode 作比较:
  如果hashCode 不同: 一定不是同一个对象
  如果hashCode 相同: 不一定,继续比较equals:( 这样比较的原因:hashCode方法的实现是C语言,效率高)
    equals:
      true 说明是同一个对象
      false: 不是同一个对象

 

b. 为了保证equals 和hashCode 结果的一致性
  我们在重写equals 方法的同时,也要重写hashCode,约定俗称(即当equals定义相等的条件改变时,hashCode也要改变)

自动重写:右键-->source-->generate hashCode and equals

 

 练习  

 定义一个Teacher类,并创建2个对象,如果两个对象的属性值相同,就认定为同一个对象,打印对象:System.out.println(t),打印的格式为(姓名:张三,年龄:18,工资:20000)

public class Exer1 {
    public static void main(String[] args) {
        Teacher t1 = new Teacher();
        Teacher t2 = new Teacher();
        System.out.println(t1);
        if(t1.hashCode() == t2.hashCode()) {
            if(t1.equals(t2)) {
                System.out.println("true");
            }else {
                System.out.println("false");
            }
        }else {
        System.out.println("false");
        }
    }
}

class Teacher{
    String name="张三";
    int age = 18;
    double salary = 20000;
    public String toString() {
        return "姓名:"+name+",年龄:"+age+",工资:"+salary;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        long temp;
        temp = Double.doubleToLongBits(salary);
        result = prime * result + (int) (temp ^ (temp >>> 32));
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Teacher other = (Teacher) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (Double.doubleToLongBits(salary) != Double.doubleToLongBits(other.salary))
            return false;
        return true;
    }
    
}
View Code

 

$flag 上一页 下一页