java中6个常用方法_写出java.lang.Object类的六个常用方法

java是面向对象的语言,而Object类是java中所有类的顶级父类(根类)。

每个类都使用Object类作为超类,所有对象(包括数组)都实现这个类的方法,即使一个类没有用extends明确指出继承于某个类,那么它都默认继承Object类。

Object类中提供了很多方法,这里只取其中比较常用的方法做下简述。

1)public String toString()  >>> 获取对象信息的方法

这个方法在打印对象时被调用,将对象的信息变为字符串返回,默认输出对象地址。

举个例子:

/**

* 定义一个类 并重写toString()方法

*/

public classPerson {privateString name;private intage;private chargender;

@OverridepublicString toString() {return "Person{" +

"name='" + name + '\'' +

", age=" + age +

", gender=" + gender +

'}';

}publicPerson() {

}public Person(String name, int age, chargender) {this.name =name;this.age =age;this.gender =gender;

}

/*** 测试类*/

public classTest {public static voidmain(String[] args) {

Person p1= new Person("张三",22,'男');

Person p2= new Person("李思",23,'女');

System.out.println(p1.toString());

System.out.println(p2.toString());

}

}

运行结果:与重写的toString()结果结构一致。

27e974f97abdd2835a841d6fe875451d.png

2)public boolean equals(Object obj)>>>对象相等判断方法

该方法用于比较对象是否相等,而且此方法必须被重写。

举个例子:

/*** 定义一个类 并重写equals方法*/

public classPerson {privateString name;private intage;private chargender;publicPerson() {

}public Person(String name, int age, chargender) {this.name =name;this.age =age;this.gender =gender;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}public chargetGender() {returngender;

}public void setGender(chargender) {this.gender =gender;

}/***重写equals方法*/

public booleanequals(Person p) {return super.equals(p);

}

}

/*** 测试类*/

public classTest {public static voidmain(String[] args) {

Person p1= new Person("张三",22,'男');

Person p2= new Person("张三",23,'男');

Person p3= new Person("张三",22,'男');

Integer a= 10;

Integer b= 10;boolean flag1 =p1.equals(p2);boolean flag2 =p1.equals(p3);boolean flag3 =p1.getName().equals(p2.getName());boolean flag4 =a.equals(b);

System.out.println(flag1);

System.out.println(flag2);

System.out.println(flag3);

System.out.println(flag4);

}

}

运行结果:equals比较的是地址,即使p1和p3的各个属性一样,但是通过创建对象两者在堆中的地址值是不一样的,因此结果为false。

需要注意的是基本数据类型是没有equals方法的。上述事例中Integer换成int会报错,p1.getGender().equals(p2.getGender())也是不对的。

9b185890f79a4a48710d9b3cbc950456.png

3)public native int hashCode()>>> 对象签名

该方法用来返回其所在对象的物理地址(哈希码值),常会和equals方法同时重写,确保两个相等的对象拥有相等的.hashCode。

/*** 重写hashCode方法*/@Overridepublic inthashCode() {return super.hashCode();

}

/*** 测试类*/

public classTest {public static voidmain(String[] args) {

Person p1= new Person("张三",22,'男');

Person p2= new Person("张三",22,'男');int i1 =p1.getName().hashCode();int i2 =p2.getName().hashCode();int i3 =p1.hashCode();int i4 =p2.hashCode();

System.out.println(i1);

System.out.println(i2);

System.out.println(i3);

System.out.println(i4);

}

}

运行结果:

9684e3037ee89267a063adc66ab3377a.png

由此可见通过new的对象即使属性赋值一致,对象的hashCode也是不一样的。

4)public final native Class> getClass()>>>返回此Object的运行时类

注意:此方法不可重写,要调用的话一般和getName()联合使用,如getClass().getName()

该方法在反射中有大用!

5)线程中常用的方法(此处合在一起说明)

public final void wait()>>>多线程中等待功能

public final native void notify()>>>多线程中唤醒功能

public final native void notifyAll()>>>多线程中唤醒所有等待线程的功能

其中wait()方法还有另外两个带不同功能的方法:

public final native void wait(long timeout) >>> 要等待的最长时间,单位毫秒

public final void wait(long timeout, int nanos) >>> nanos额外时间,单位纳秒

6)protected native Object clone() >>> protected修饰的方法,功能是完成对象的浅复制(创建并返回此对象的一个副本----“副本”的准确含义可能依赖于对象的类)

只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException。

Java中除了8种基本类型传参数是值传递,其他的类对象传参数都是引用传递,我们有时候不希望在方法里将参数改变,这时就需要在类中复写clone方法(实现深复制)。

7)protected void finalize() >>> 垃圾回收(释放资源的方法)

该方法即使被调用也不知道什么时候执行,所以一般很少主动使用。

finalize()方法的用途:

无论对象是如何创建的,垃圾回收器都会负责释放对象占据的所有内存。这就将对finalize()的需求限制到一种特殊情况,即通过某种创建对象的方式以外的方式为对象分配了存储空间。这种情况一般发生在使用“本地方法”的情况下,本地方法是一种在Java中调用非Java代码的方式。

*>>Java的一大特点就是垃圾回收机制。关于垃圾回收需要注意以下几点:

1)对象可能不被垃圾回收。

只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总也得不到释放。

2)垃圾回收并不等于“析构”。

3)垃圾回收只与内存有关。

使用垃圾回收的唯一原因就是为了回收程序不再使用的内存。

综上所述,Object类常用的六种方法是toString()、equals()、hashCode()、wait()、notify()、notifyAll()。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2023年5月29日 学习要点 理解继承的概念,超和子的关系,掌握它们在继承的应用; 掌握有关private成员的访问控制方法; 理解方法重载和方法重写的区别和使用方法; 第1页/共41页 java期末复习第讲面向对象程序设计全文共41页,当前为第1页。 2023年5月29日 4.1 包 包是由.class文件组成的一个集合 第2页/共41页 java期末复习第讲面向对象程序设计全文共41页,当前为第2页。 2023年5月29日 4.1.1 定义包 构建包语句的语法是: package pkg1[.pkg2[.pkg3…]]; 例如:package com.javaworld; package语句作为Java源文件的第一条语句。如果没有package语句,则为缺省无名包。 则该语句的前面只能有注释或空行。而且一个文件最多有一条package语句。 包名有层次关系,全部用小写字母,各层之间用点分割. 第3页/共41页 java期末复习第讲面向对象程序设计全文共41页,当前为第3页。 2023年5月29日 包是的容器,用于分割名空间。 如果不指定,默认就存在当前文件夹里面。 当使用包说明时,程序不需要再引入同一个包或者该包的任何元素。 如果包声明是: package com.sun.java; 则此文件必须存放在Windows的com\sun\java目录下。 第4页/共41页 java期末复习第讲面向对象程序设计全文共41页,当前为第4页。 2023年5月29日 包名必须唯一 主要是为了交流,和便于大家的协同合作。 一个使用较多的办法是反转域名,如 com.sun.util; 包名的解释 Java解释器的执行顺序是:首先找到环境变量classpath,利用classpath包含的一个或者多个目录,把他们作为一种特殊的"根"使用,从这里开始搜索,搜索时会把"."替换成"\"(Windows)。 第5页/共41页 java期末复习第讲面向对象程序设计全文共41页,当前为第5页。 2023年5月29日 4.1.2 导入包 import的语法是: import pkg1[.pkg2[.pkg3…]].(名" * ); 例如:import java.awt.*; 引入整个包时,可以方便的访问包的每个。 但是引入所有的包会占用过多的内存。因此,我们建议只引入需要的。 程序不一定有引入语句。当需要引用某个与当前存储在一个物理目录下的时候,就可以直接使用,而不需要引入。 第6页/共41页 java期末复习第讲面向对象程序设计全文共41页,当前为第6页。 2023年5月29日 4.1.3 路径(CLASSPATH) 编译时:javac –d CLASSPATH路径 Myclass.java 例如:javac –d d:\Myjava myclass.java 则直接在d:\Myjava下创建在myclass.java指明的包目录,并把myclass.class拷到该目录下。 运行:java 包名.名    如  java   pk1.pk2.名A 示例 CircleDemo2.java 第7页/共41页 java期末复习第讲面向对象程序设计全文共41页,当前为第7页。 2023年5月29日 jdk常用的包 java.lang----包含一些Java语言的核心,如String、Math、Integer、System和Thread,提供常用功能。 java.awt----包含了构成抽象窗口工具集(abstract window toolkits)的多个,这些被用来构建和管理应用程序的图形用户界面(GUI)。 java.applet----包含applet运行所需的一些java.net----包含执行与网络相关的操作的java.io----包含能提供多种输入/输出功能的java.util----包含一些实用工具,如定义系统特性、使用与日期日历相关的函数。 第8页/共41页 java期末复习第讲面向对象程序设计全文共41页,当前为第8页。 2023年5月29日 4.1.4 访问控制 第9页/共41页 java期末复习第讲面向对象程序设计全文共41页,当前为第9页。 2023年5月29日 4.2 继承 面向对象的编程允许从现有派生出新,这称为继承。 使用继承,程序员可以创建一个定义了多个相关项目共有特性的通用,然后,其它较为具体的可以继承该,同时再添加自己的独有特性。 在Java定义的每一种都是从现有派生来的,或者是显式或者是隐式(如从Object派生) 第10页/共41页 java期末复习第讲面向对象程序设计全文共41页,当前为第10页。 2023年5月29日 11 4.
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值