Java——Object类

2.6 Object类

①java.lang.Object 类,是所有类的根父类!

②如果在类的声明中未使用extends 关键字指明其基类,则默认基类为Object 类

③Object类仅有一个空参的构造器  public Object(){  }

2.5.1 toString方法

SUN在Object类中设计toString方法的目的:返回java对象的字符串表示形式。

在现实的开发过程中,Object里边的toString方法已经不够用了。因为Object的toString方法实现的结果不满意。Object中的toString方法就是要被重写的。

SUN是这样实现toString方法的:


public String toString() {

return getClass().getName() + "@" + Integer.toHexString(hashCode());

}

Object中的toString方法返回:类名@java对象的内存地址经过哈希算法得出的int类型值再转换成十六进制。

这个输出结果可以等同看做java对象在堆中的内存地址。


public class Test01{

public static void main(String[] args){

//创建一个Object类型的对象.

Object o1 = new Object();

//调用toString方法.

String oStr = o1.toString();

System.out.println(oStr); //[email protected]

//创建一个Person类型的对象

Person p1 = new Person("刘德华",50);

//调用toString方法.

String pStr = p1.toString();

System.out.println(pStr); //重写前:[email protected]//后:Person[name=刘德华,age=50]

Person p2 = new Person("巩俐",50);

System.out.println(p2.toString()); //Person[name=巩俐,age=50]

//print方法后面括号中如果是一个引用类型,会默认调用引用类型的toString方法.

System.out.println(p2); //Person[name=巩俐,age=50]

}

}

class Person{

String name;

int age;

Person(String name,int age){

this.name = name;

this.age = age;

}

//重写toString方法.

//根据项目的需求而定。

//需求规定,显示格式:Person[name=刘德华,age=50]

public String toString(){

return "Person[name="+name+",age="+age+"]";

}

}

【eclipse操作】

快速生成重写的toString 方法:Source à Generate toString()…

2.6.2 equals方法

Object中的equals方法:


public boolean equals(Object obj) {

return (this == obj);

}

o1.equals(o2);  o1是this,o2是obj

== 两边如果是引用类型,则比较内存地址,地址相同则是true,反之则false.

Object中的equals方法比较的是两个引用的内存地址。

java对象中的equals方法的设计目的:判断两个对象是否一样。


public class Test01{

public static void main(String[] args){

Object o1 = new Object();

Object o2 = new Object();

boolean b1 = o1.equals(o2);

System.out.println(b1); //false

Star s1 = new Star(100,"黄晓明");

Star s2 = new Star(100,"黄晓明");

Star s3 = new Star(110,"黄晓明");

System.out.println(s1.equals(s2)); //true

System.out.println(s2.equals(s3)); //false

}

}

class Star{

//身份证号

int id;

//姓名

String name;

//Constructor

public Star(int id,String name){

this.id = id;

this.name = name;

}

//Object中的equals方法比较的是内存地址.

//在现实的业务逻辑当中,不应该比较内存地址,应该比较内容。

//所以Object中的equals方法也要重写。

//根据需求规定重写equals方法,

//需求规定:如果身份证号一致,并且名字也一致,则代表是同一个人。

//s1.equals(s2);

public boolean equals(Object obj){

if(this==obj) return true;

if(obj instanceof Star){

Star s = (Star)obj;

if(s.id == id && s.name.equals(name)){

return true;

}

}

return false;

}

}


/*

关于java语言中如何比较两个字符串是否一致.

在java中比较两个字符串是否一致,不能用“==”

只能调用String类的equals方法.

*/

public class Test02{

public static void main(String[] args){

String s1 = new String("ABC");

String s2 = new String("ABC");

System.out.println(s1==s2); //false

//String已经重写了Object中的equals方法,比较的是内容。

System.out.println(s1.equals(s2)); //true

}

}

【eclipse快捷方式】

快速生成重写的equals 方法:

Source àGenerate hashCode() and equals()…

2.6.3 finalize方法

垃圾回收器(Garbage Collection),也叫GC,垃圾回收器主要有以下特点:

①当对象不再被程序使用时,垃圾回收器将会将其回收

②垃圾回收是在后台运行的,我们无法命令垃圾回收器马上回收资源,但是我们可以

告诉他,尽快回收资源(System.gc 和Runtime.getRuntime().gc())

③垃圾回收器在回收某个对象的时候,首先会调用该对象的finalize 方法

④GC 主要针对堆内存

⑤单例模式的缺点

finalize方法什么时候调用?   

①finalize方法每个java对象都有

②finalize方法不需要程序员去调用,由系统自动调用。

③java对象如果没有更多的引用指向它,则该java对象成为垃圾数据,等待垃圾回收器的回收,垃圾回收器在回收这个java对象之前会自动调用该对象的finalize方法。

④finalize方法是该对象马上就要被回收了,例如:需要释放资源,则可以在该方法中释放。


public class Test01{

public static void main(String[] args){

Person p1 = new Person();

p1 = null; //没有引用再指向它.等待回收.

//程序员只能“建议”垃圾回收器回收垃圾.

System.gc();

}

}

class Person{

//重写Object中的finalize方法.

public void finalize() throws Throwable {

System.out.println(this + "马上就要被回收了!");

//让引用再次重新指向该对象,该对象不是垃圾数据,不会被垃圾回收器回收!

//Person p = this;

}

}

2.6.4 hashCode方法


public class Test01{

public static void main(String[] args){

//hashCode方法返回的是该对象的哈希码值

//java对象的内存地址经过哈希算法得出的int类型的数值.

Test01 t = new Test01();

System.out.println(t.hashCode()); //14576877

}

}

当垃圾收集器将要收集某个垃圾对象时将会调用finalize,建议不要使用此方法,因为此方法的运行时间不确定,如果执行此方法出现错误,程序不会报告,仍然继续运行。


public class FinalizeTest01 {

public static void main(String[] args) {

Person person = new Person();

person.id = 1000;

person.name = "张三";

//将person 设置为null 表示,person 不再执行堆中的对象

//那么此时堆中的对象就是垃圾对象

//垃圾收集(GC)就会收集此对象

//GC 不会马上收集,收集时间不确定

//但是我们可以告诉GC,马上来收集垃圾,但也不确定,会马上来,也许不会来

person = null;

System.gc();//通知垃圾收集器,来收集垃圾

/*

try {

Thread.sleep(5000);

}catch(Exception e) {

}

*/

}

}

class Person{

int id;

String name;

//此方法垃圾收集器会调用

public void finalize() throws Throwable {

System.out.println("Person.finalize()");

}

}

注意以下写法


public class FinalizeTest02 {

public static void main(String[] args) {

method1();

}

private static void method1() {

Person person = new Person();

person.id = 1000;

person.name = "张三";

//这种写法没有多大的意义,

//执行完成方法,所有的局部变量的生命周期全部结束

//所以堆区中的对象就变成垃圾了(因为没有引用指向对象了)

//person = null;

}

}

class Person{

int id;

String name;

public void finalize() throws Throwable {

System.out.println("Person.finalize()");

}

}

原文地址:https://www.cnblogs.com/superjishere/p/11819712.html

时间: 2024-10-30 01:06:07

Java——Object类的相关文章

Java Object类学习笔记

看下Api文档的一些说明 public class Object Class Object is the root of the class hierarchy. Every class has Object as a superclass. All objects, including arrays, implement the methods of this class. Since: JDK1.0 从JDK1.0就已经存在的元老类,类结构的根,所有类的父类,所有类都实现了这个类的方法,包含

java Object 类

Object java.lang.Object 所有Java类的父类 类继承关系的根 1) Object o; 引用o中可以储存任何对象 2) Object类中的方法是所有Java对象都具有的方法 getClass() : 返回对象的实际类型 判断a和b两个引用是否存储同类对象 a.getClass()==b.getClass() finalize(): 当垃圾收集器回收垃圾对象时,自动调用 垃圾对象:零引用 垃圾收集时机:内存耗尽 toString(): 返回对象的字符串形式 public S

浅谈Java Object类

Java Object类 Object类是一个通用类,Java所有的类都是从Object类继承出来的.所以可将创建对象的过程理解为 public class Cars extends Object{ // 继承Object } Object类不是一个抽象类,部分方法是可以被覆盖的. Object类中有许多有用的方法 equals() 比较两个类是否相等 getClass() 告诉你对象是从哪里被初始化的 hashCode() 列出此对象的哈希代码 toString() 列出类的名称和一个我们不关

java object类

java.lang.Object java.lang包在使用的时候无需显示导入,编译时由编译器自动导入. Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类. Object类是Java中唯一没有父类的类. 其他所有的类,包括标准容器类,比如数组,都继承了Object类中的方法. Object类中的方法 构造方法:public Object() 文档中的类概览: Java中的每个类都具有定义在Object类中的这些方法. protected Object clone() Cr

四. Java继承和多态10. Java Object类

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

Java Object类及其equals方法

基本概念: Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入: Object类是所有Java类的祖先.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法.可以使用类型为Object的变量指向任意类型的对象 equals()方法:比较两个对象是否同一       如果两个对象具有相同的类型以及相同的属性值,则称这两个对象相等.如果两个引用对象指的是同一个对像,则称这两个变量同一.Object类中定义的equa

Java Object类的equals()方法

所有类都从Object类中继承了equals方法,Object类中equals方法源代码如下: public boolean equals(Object obj)     {         return this == obj;     } Object中的equals方法是直接判断this和obj本身的值是否相等,即用来判断调用equals的对象和形参obj所引用的对象是否是同一对象,所谓同一对象就是指内存中同一块存储单元,如果this和obj指向的是同一块内存对象,则返回true,如果th

Java Object类中的-----------clone()克隆机制

package java_lang_object; public class User implements Cloneable { public Address address; public int age; public String name; public User(int age,String name){ this.age = age; this.name = name; this.address = new Address("广州天河"); } public  User

java Object类源代码详解 及native (转自 http://blog.csdn.net/sjw890821sjw/article/details/8058843)

Java代码  package java.lang; public class Object { /* 一个本地方法,具体是用C(C++)在DLL中实现的,然后通过JNI调用.*/ private static native void registerNatives(); /* 对象初始化时自动调用此方法*/ static { registerNatives(); } /* 返回此 Object 的运行时类.*/ public final native Class<?> getClass();