Java在重载中使用Object的问题

目录
  • 在重载中使用Object
    • 在开发中遇到了两个方法
    • 不是说先匹配类型相同的吗?
    • 解决办法
  • Object的使用:重载equals、hashCode及实现compareTo
    • 下面是一个简单的例子

在重载中使用Object

JAVA中调用重载方法都是先匹配同类型参数的方法,如没有才会向上转型去匹配参数。

例:

public void remove(int i) {
    ...
}
public void remove(Object object) {
    ...
}
    int i = 0;
    Integer it = 0;
    remove(i); //调用了 remove(int i) 方法
    remove(it); //调用了 remove(Object object) 方法

在开发中遇到了两个方法

public boolean lSet(List<Object> value) {
    ...
}
public boolean lSet(Object) {
    ...
}

调用时:

    List<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(2);
    lSet(list);  //调用了lSet(Object)

调用了lSet(Object) 而不是lSet(List<Object> value)

不是说先匹配类型相同的吗?

注意重载方法中的参数List<Object> value List指定了泛型Object,但调用时传入的是List<Integer>此时并不算同一种类型。

解决办法

//使用?通配符 或 直接不指定泛型
public boolean lSet(List<?> value) {
    ...
}

Object的使用:重载equals、hashCode及实现compareTo

这里主要介绍Java中使用Hashtable、Arrays.sort时候如果键值涉及到对象、类时候的处理办法:

1.重载equals():java中默认的对象的equals是当指向同一内存地址时才为true;如果你现在需要利用对象里面的值来判断是否相等,则重载equal方法。

2.重载hashCode():只有当类需要放在HashTable、HashMap、HashSet等等hash结构的集合时才会重载hashCode,原因:就HashMap来说,好比HashMap就是一个大内存块,里面有很多小内存块,小内存块里面是一系列的对象,可以利用hashCode来查找小内存块hashCode%size(小内存块数量),所以当equal相等时,hashCode必须相等,而且如果是object对象,必须重载hashCode和equal方法。

3.实现接口Comparable:当需要调用sort()之类的函数要用到对象的比较的基本操作时候,就需要对Object的compareTo(Object arg0)进行实现。

4.binarySearch使用注意:由于Arrays.binarySearch(Object array[],Object key)中没有给定查找数组的范围,据我估计可能是0到length-1,因而数组最好是都能填满对象,如果部分为空(数组开的过大)则会出错。而且搜索前要调用sort函数排序一下。因为数组长度和对象个数相同,所以sort(Object [])也不用给定范围而全部排序。

下面是一个简单的例子

public class TermPOS implements Comparable{
    public String term;
    public String pos;
    public TermPOS(String a,String b)
    {
        term = a;
        pos = b;
    }
    //用于调用Arrays.sort(Object[])时的自定义大小,此时类后加上implements Comparable
    public int compareTo(Object arg0) {
        // TODO 自动生成方法存根
        if(this.term.compareTo(((TermPOS)arg0).term) != 0)
            return this.term.compareTo(((TermPOS)arg0).term);
        return this.pos.compareTo(((TermPOS)arg0).pos);
    }
    
    //当类需要放在HashTable、HashMap、HashSet等等hash结构的集合时才会重载hashCode
    public int hashCode()
    {
        return term.hashCode()*pos.hashCode();
    }
    //如果你现在需要利用对象里面的值来判断是否相等,则重载equal方法
    public boolean equals(Object obj)
    {
        if(term.compareTo(((TermPOS)obj).term) != 0)return false;
        if(pos.compareTo(((TermPOS)obj).pos) != 0)return false;
        return true;
    }
    public static void testHashtable()
    {
        Hashtable<TermPOS,Integer> t = new Hashtable<TermPOS,Integer>();
        TermPOS x = new TermPOS("a","b");
        t.put(new TermPOS("a","b"), 2);
        if(t.get(x) == null)System.out.println("wrong!"); //当去掉hashCode的重写后就输出这个
        else System.out.println(t.get(x));
        System.out.println(x.equals(new TermPOS("a","b")));
    } 
    public static void testSort()
    {
        TermPOS tp[] = new TermPOS[3];
        tp[0] = new TermPOS("b","c");
        tp[1] = new TermPOS("a","c");
        tp[2] = new TermPOS("a","b");
        Arrays.sort(tp,0,3);
        for(int i = 0;i < 3;i ++)
            System.out.println(tp[i].term+"\t"+tp[i].pos);
    }
    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        // TODO 自动生成方法存根
        testHashtable();
        testSort();
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java方法重载示例

    什么是方法的重载? 方法重载是以统一的方式处理不同数据类型的一种手段. 怎样构成方法的重载? 方法名相同, 形参不同.而形参的不同又表示在:  1). 形参的个数不同  2). 形参的类型不同 3). 形参的顺序不同 注意事项 1. 如果两个方法的返回值不同, 而其他都相同. 这个时候并不构成方法的重载. 在编译的时候会报错: 示例代码(错误):Test.java 复制代码 代码如下: /*返回值的不同并不能构成方法的重载*/public class Test {    public stati

  • 浅谈java中的对象、类、与方法的重载

    对象: 一切皆为对象. 对象包括两部分内容:属性(名词形容词),行为(动词). 对象和对象之间是有关系的: 派生,关联,依赖. 类: 对同一类别的众多对象的一种抽象. 类,还是用来生成对象的一种模板,对象是类的一种具体化的表现. 面向对象的三大特性:封装,继承,多态. class 类名{ 访问修饰符 成员变量的定义; 访问修饰符 成员函数(方法)的定义; } 访问修改符:默认不写,private,public. private,私有.只能被当前class 类名{}中的代码访问到.出了这个类的{}

  • java中的方法重载知识点总结

    什么是方法的重载? 方法重载是以统一的方式处理不同数据类型的一种手段. 怎样构成方法的重载? 方法名相同, 形参不同.而形参的不同又表示在: 1). 形参的个数不同 2). 形参的类型不同 3). 形参的顺序不同方法的重载主要是结局同一个方法,但参数不同的问题 举一个例子,比较两个整数的大小 和比较两个浮点数的大小 public class Testmax { /** 主方法 */ public static void main(String[] args) { int i = 5; int j

  • 浅谈java实现重载的方法

    重载(重新载选方法): java允许在一个类中,存在多个方法拥有相同的名字,但在名字相同的同时,必须有不同的参数,这就是重载,编译器会根据实际情况挑选出正确的方法,如果编译器找不到匹配的参数或者找出多个可能的匹配就会产生编译时错误,这个过程被称为重载的解析. 重载包括:普通方法的重载和构造方法的重载 方法:即函数(文中我们统称之为"方法"),是一个固定的一个程序段,或称其为一个子程序,它在可以实现固定运算功能.而且,同时还带有一个入口和一个出口,所谓的入口,就是函数所带的各个参数,我们

  • Java在重载中使用Object的问题

    目录 在重载中使用Object 在开发中遇到了两个方法 不是说先匹配类型相同的吗? 解决办法 Object的使用:重载equals.hashCode及实现compareTo 下面是一个简单的例子 在重载中使用Object JAVA中调用重载方法都是先匹配同类型参数的方法,如没有才会向上转型去匹配参数. 例: public void remove(int i) {     ... } public void remove(Object object) {     ... }     int i =

  • 深入理解JAVA基础类库中对象Object类

    引言 Object类是所有类.数组的父类,位于java.lang 包下也就是说,Java允许把所有任何类型的对象赋给Object类型的变量.当定义一个类时没有使用extends关键字为它显式指定父类,则该类默认继承Object父类. 例如: public class Dog{ ...... } 等价于: public class Dog extends Object { ...... } Object常用方法 Object 类属于java.lang包,此包下的所有类在使用时无需手动导入,系统会在

  • 简介Java编程中的Object类

    Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: public class Demo{ // ... } 实际上是下面代码的简写形式: public class Demo extends Object{ // ... } 在Java中,只有基本类型不是对象,例如数值.字符和布尔型的值都不是对象,所有的数组类型,不管是对象数组还是基本类型数组都是继承自

  • 详谈Java中的Object、T(泛型)、?区别

    因为最近重新看了泛型,又看了些反射,导致我对Object.T(以下代指泛型).?产生了疑惑. 我们先来试着理解一下Object类,学习Java的应该都知道Object是所有类的父类,注意:那么这就意味着它的范围非常广!首先记住这点,如果你的参数类型时Object,那么的参数类型将非常广! <Thinking in Java>中说很多原因促成了泛型的出现,最引人注目的一个原因就是为了创造容器类.这个要怎么来理解呢?我的理解是,可以抛开这个为了创造容器类这个,而是回到泛型的目的是限定某种类型上来.

  • Java中父类Object的常用方法总结

    简介 Object类: 这个类java.lang.java是所有类默认继承的父类 Object类中常用的三个方法:toString() , equal() , hashCode() 一.toString()方法 对象的自我描述,对象的自我介绍 在对象的自我描述过程中,由于使用get()方法打印实例变量比较麻烦,为了简便,使用toString() . Public String toString(){ Return "学好" + getNo() + "姓名" + ge

  • 面试官:Java中new Object()到底占用几个字节

    前言 我们来分析一下堆内布局以及Java对象在内存中的布局吧. 对象的指向 先来看一段代码: package com.zwx.jvm; public class HeapMemory { private Object obj1 = new Object(); public static void main(String[] args) { Object obj2 = new Object(); } } 上面的代码中,obj1 和obj2在内存中有什么区别? 我们先来回忆一下JVM系列1的文章中有

  • 你了解Java中的Object类吗

    任何一个类默认继承Object类,就算没有直接继承,最终也会间接继承. Object类,有两种方式找到: 第一种:在源码当中找到 第二种:查阅java类库的帮助文档 Object类中两个重要的方法: boolean equals (Object obj) //判断两个对象是否相等 String toString () //将对象转换成字符串形式 equals方法: 源代码: public boolean equals(Object obj) { return (this == obj); } 作

  • Java中的Object.getClass()方法解析

    目录 Java Object.getClass()方法 具体见下面的例子 Java Object.getClass()源码分析 1.栈 2.堆 3.老生代 Person类型元数据 反射机制 Java Object.getClass()方法 Object.getClass()方法,这个方法的返回值是Class类型,Class c = obj.getClass(); 通过对象c,我们可以获取该对象的所有成员方法,每个成员方法都是一个Method对象:我们也可以获取该对象的所有成员变量,每个成员变量都

  • java中的Object类的toSpring()方法

    Object是类层次结构的根,每个类都可以将Object作为超类.所有类都直接或者间接的继承自该类 构造方法:public Object() 回想面向对象中,为什么说子类的构造方法默认访问的是父类的无参构造方法? 因为它们的顶级父类只有无参构造方法 package com.itheima_56; public class Student extends Object{ private String name; private int age; public Student(){ } public

  • 一文带你了解Java中的Object类及类中方法

    目录 1. Object类介绍 2. 重写toString方法打印对象 3. 对象比较equals方法 4. hashCode方法 1. Object类介绍 Object是Java默认提供的一个类.Java里面除了Object类,所有的类都是存在继承关系的.默认会继承Object父 类.即所有类的对象都可以使用Object的引用进行接收. 范例:使用Object接收所有类的对象 class Person{} class Student{} public class Test { public s

随机推荐