java.lang.Object(数组收集对象&重新定义)

标签: Java
86人阅读 评论(0) 收藏 举报
分类:

在Java中,子类只能继承一个父类,如果定义类时没有使用 extends关键字指定继承任何类,那一定是继承java.lang. object也就是说,如果这样定义类:

public class Some{
...
}

那就相当于撰写:

public class Some extends Object{
}

因此在Java中,任何类追溯至最上层父类一定就是java.lang. Object,也就是Java中所有对象,一定“是一种” object,所以这样撰写程序是合法的:

Object o1="李白"Object o2=new Date();

String是一种 object,Date是一种 object,任何类型的对象,都可以使用 oblect声明的名称来参考。这有什么好处?如果有个需求是使用数组收集各种对象,那该声明 object[]。例如:

Object[] objs= {"李白",new Date(),new SwordsMan()};
    String name=(String) objs[0];
    Date date=(Date) objs[1];
    ...

因为数组长度有限,使用数组来收集对象不是那么方便,以下定义的 Arraylist类,可以不限长度地收集对象:

package hello;

import java.util.Arrays;

public class ArrayList {
    private Object[] list;
    private int next;

    public ArrayList(int capacity) {
        list=new Object[capacity];
    }
    public ArrayList() {
        this(3);
    }
    public void add(Object o) {
        if(next==list.length) {
            list=Arrays.copyOf(list, list.length*2);
        }
        list[next++]=o;
    }
    public Object get(int index) {
        return list[index];
    }
    public int size() {
        return next;
    }
}

自定义的 Arraylist类,内部使用 Object数组来收集对象0,每一次收集的对象会放在next指定的索引处,在创建 Arraylist实例时,可以指定内部数组初始容量,如果使用无参数构造函数,则默认容量为3。如果要收集对象,可通过add()方法,注意参数的类型为 Object,可以接收任何对象如果内部数组原长度不够,就使用 Arrays. copyof()方法自动建立原长度两倍的数组并复制元素⊙。如果想取得收集的对象,可以使用get()指定索引取得。如果想知道己收集的对象个数,则通过size()方法得知。
以下使用自定义的 Arraylist类,可收集访客名称,并将名单转为大写后显示:

package hello;

import java.util.*;
import static java.lang.System.*;

public class Guest {
    public static void main(String[] args) {
        ArrayList datas=new ArrayList();
        collectDataTo(datas);
        out.println("访客名单:");
        printUpperCase(datas);
    }

    private static void collectDataTo(ArrayList datas) {
        Scanner scan=new Scanner(System.in);
        while(true) {
            out.println("访客名单");
            String data=scan.nextLine();
            if(data.equals("*")) {
                break;
            }
            datas.add(data);
        }
    }

    private static void printUpperCase(ArrayList datas) {
        for(int i=0;i<datas.size();i++) {
            String data =(String) datas.get(i);
            out.println(data.toUpperCase());
        }
    }
}

java.lang.Object是所有类的顶层父类,Object上的方法只要不是被定义为final,都可以重新定义。
1、toString()
object的toString()默认定义为:

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

返回的字符串包括类名称以及十六进制哈希码,许多方法如果传入对象,默认都会调用toString()。如System.out.print()方法就会调用toString()以取得字符串描述来显示:

System.out.println(swordsMan.toString);
//就是
System.out.println(swordsMan);

2.重新定义 equals()
在Java中要比较两个对象的实质相等性,并不是使用=,而是通过 quals方法,在后续你看过 Integer等打包,以及字符串相等性比较时,都是使用 equals()方法。实际上 equals()方法是 Object类有定义的方法,其程序代码是:

public boolean equals(object obj){
    return (this==obj);
}

如果没有重新定义 equals(),使用 equals0方法时,作用等同于=,所以要比较实质相等性,必须自行重新定义。如:

package hello;

public class Cat {
    //......

    public boolean equals(Object other){
        if(this==other) {//如果other参考的就是这个对象肯定是同一对象。
            return true;
        }
        //如果other参考的对象不是Cat创建出来的就是flase
        if(!(other instanceof Cat)) {
            return false;
        }else if(!getName().equals(cat.getName())){
            return false;//名字是否相同
        }else if(!getBirthDay().equals(cat.getBirthDay())){
            return false;//生日是否相同
        }

        return true;
    }
}

这个程序片段示范了 equals()操作的基本概念。这里也看到了 instanceof运算符,它可以用来判断对象是否由某个类创建,左操作数是对象右操作数是类,在使用 instanceof时,编译程序还会来帮点忙,会检查左操作数类型是否在右操作数类型的继承架构中(或界面操作架构中)
执行时期,并非只有左操作数对象为右操数类直接实例化才返回true,只要左操作数类型是右操作数类型的子类型, instanceof也是返回true
这里仅示范了 equals()操作的基本概念,实际上操作equals()并非这么简单。操作 equals()时通常也会操作 hashcode()。

查看评论

java.lang解析Object类

Object类: public class Object 类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。 构造方法摘要 ...
  • u013017215
  • u013017215
  • 2016-10-14 10:19:20
  • 302

java.lang.Object的equals()和hashCode()方法小结

一、equals()和hashCode()的关系约定为:     equals()返回true,则hashCode()一定相等;反之不然 二、object的默认实现为equals为:x ==...
  • beifengdelei
  • beifengdelei
  • 2012-01-04 16:33:23
  • 1240

javascript 随记

@在 JavaScript 中, 对象 使用 名字作为索引。如果你使用名字作为索引,当访问数组时,JavaScript 会把数组重新定义为标准对象。执行这样操作后,数组的方法及属性将不能再使用,否则...
  • strangedbly
  • strangedbly
  • 2016-06-15 17:03:21
  • 871

VBA二维数组重定义

  • 2010年01月22日 22:17
  • 11.65MB
  • 下载

java.lang.Object 对象中 hashCode 和 equals 方法详解及其延伸

什么是hashcode hashcode在Java中的相关引用 equals方法 hashcode于equals两者关系比较
  • qq_21163061
  • qq_21163061
  • 2017-06-22 16:21:53
  • 745

java技术及其应用第5章 收集与数据结构应用

  • 2013年11月30日 14:46
  • 354KB
  • 下载

7.2作业

(1)数组的概念:                      数组是一个变量,存储相同数据类型的一组数据的集合          (2)特点:               数组一旦定义好就不可...
  • czt0112
  • czt0112
  • 2017-07-02 20:43:22
  • 39

jquery和JavaScipt 定义全局变量(很有用)!

window["a1"]="abc";window["b1"]=5;
  • dxnn520
  • dxnn520
  • 2012-08-28 19:26:21
  • 2324

Redim的应用,VB6.0源代码,重定义数组.

  • 2009年06月09日 15:04
  • 405KB
  • 下载

java 实现重定义数组类似于VB的ReDim

码农一个,直接上代码:   //param objArr   the expanded object of Array.          //param  newLength  the leng...
  • lcawen
  • lcawen
  • 2013-04-01 12:25:14
  • 1348
    个人资料
    持之以恒
    等级:
    访问量: 1334
    积分: 336
    排名: 23万+
    文章分类
    文章存档
    最新评论