JavaSE常用类之Object类
1. hashCode方法
代码:
package NeiBuLei;
public class hashCode {
public static void main(String[] args) {
AA aa = new AA();
AA aa2 = new AA();
AA aa3 = aa;
AA aa4 = aa2;
System.out.println("aa.hashCode()="+ aa.hashCode()); //aa.hashCode()=2129789493
System.out.println("aa2.hashCode()="+ aa2.hashCode()); //aa2.hashCode()=1313922862
System.out.println("aa3.hashCode()="+ aa3.hashCode()); //aa3.hashCode()=2129789493
System.out.println("aa4.hashCode()="+ aa4.hashCode()); //aa4.hashCode()=1313922862
}
}
class AA{}
两个引用,如果指向的是同一个对象,则哈希值肯定一样
两个引用,如果指向的是不同对象,则哈希值是不一样的
哈希值主要根据地址号来!不能将哈希值完全等价于地址
2. toString方法
代码:
package NeiBuLei;
public class toString {
public static void main(String[] args) {
test test = new test(1,2,3);
test.toString();
System.out.println(test.toString());
}
}
class test{
public int name;
public int age;
public int score;
@Override
public String toString() {
return "test{" + "name=" + name + ", age=" + age + ", score=" + score + '}';
}
public test() {
}
public test(int name,int age,int score) {
this.name = name;
this.age = age;
this.score = score;
}
}
3.clone方法
代码:
package NeiBuLei;
//用于创建并返回一个对象的拷贝
// clone 方法是浅拷贝,对象内属性引用的对象只会拷贝引用地址,而不会将引用的对象重新分配内存,相对应的深拷贝则会连引用的对象也重新创建。
public class clone {
public static void main(String[] args) {
Charen p = new Charen(23, "zhang");
Charen p1 = p;
System.out.println(p); //NeiBuLei.Charen@7ef20235
System.out.println(p1); //NeiBuLei.Charen@7ef20235
//打印的地址值是相同的,既然地址都是相同的,那么肯定是同一个对象。p和p1只是引用而已,他们都指向了一个相同的对象
// 可以把这种现象叫做引用的复制
Charen s = new Charen(23, "zhang");
Charen s1 = null;
try { //要捕获
s1 = (Charen)s.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
//两个对象的地址是不同的,也就是说创建了新的对象, 而不是把原对象的地址赋给了一个新的引用变量
System.out.println(s); //NeiBuLei.Charen@27d6c5e0
System.out.println(s1); //NeiBuLei.Charen@4f3f5b24
}
}
class Charen implements Cloneable {
int age;
String name;
public Charen() {
}
public Charen(int age,String name) {
this.age = age;
this.name = name;
}
@Override //重写方法
protected Object clone() throws CloneNotSupportedException {
return (Charen)super.clone();
}
}
深拷贝:深复拷贝象所引用的对象都复制了一遍
浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象
浅复制仅仅复制所考虑的对象,而不复制它所引用的对象
String name 中name是String 引用,所以浅拷贝指向同一个name,深拷贝又复制了一个新的name,指向新复制的name。
4.getClass方法
代码:
package NeiBuLei;
//当垃圾收集确定不再有对该对象的引用时,垃圾收集器在对象上调用该对象
//返回对象的类
public class getClass {
public static void main(String[] args) {
Object o1= new Object();
System.out.println(o1.getClass()); //class java.lang.Object
A a = new A();
System.out.println(a.getClass()); //class NeiBuLei.A
}
}
class A{}
用于返回对象的类
5.equals方法
==是一个比较运算符
- ==: 既可以判断基本类型,又可以判断引用类型
- ==: 如果判断的是基本类型,判断的是值是否相等
//==: 如果判断的是基本类型,判断的是 值 是否相等
int x1 = 10;
int x2 = 10;
double x3 = 10.0;
System.out.println(x1 == x2);//true
System.out.println(x1 == x3);//true
- ==: 如果判断的是引用类型,判断的是地址是否相等,即判断是不是同一个对象
package denghao;
public class Test01 {
public static void main(String[] args) {
//==: 如果判断的是引用类型,判断的是地址是否相等,即判断是不是同一个对象
A a = new A();
A b = a;
A c = b;
System.out.println(a==c);// ? true
System.out.println(b==c);// true
B obj = a;
System.out.println(obj==c);// true
}
}
class B{}
class A extends B{}
eauals:
只能判断引用类型
代码:
package NeiBuLei;
public class ObjectLei {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "zyx";
Person p2 = new Person();
p2.name = "zyx";
//flase //对象不同
System.out.println(p1 == p2);// 引用类型——判断是否为同一个对象(地址)
//true //字符串相同
System.out.println(p1.name.equals(p2.name));// p.name是String类型,重写了equals()方法——判断内容是否一样
//flase //对象不同
System.out.println(p1.equals(p2));//p1,p2属于Person类,该类并没有重写equals()方法(继承父类equals()方法,即判断地址)
String s1 = new String("abc");
String s2 = new String("abc");
//true //字符串相同
System.out.println(s1.equals(s2));
//false //对象不同
System.out.println(s1 == s2);
}
}
class Person{
public String name;
}
6.wait和notify方法
代码:
package NeiBuLei;
//run()和start()方法属于线程类Thread
public class wait{
static Object locate=new Object();
public static class T1 extends Thread{ //T1线程
public void run(){
synchronized (locate){ //同步锁
System.out.println("T1 start");
try {
System.out.println("T1等待locate对象");
locate.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("T1 end");
}
}
}
public static class T2 extends Thread{ //T2线程
public void run(){
synchronized (locate){ //同步锁
System.out.println("T2 被唤起");
locate.notify();
System.out.println("T2 end");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
Thread t1=new T1();
Thread t2=new T2();
t1.start();
t2.start();
}
}
运行结果:
T1 start
T1等待locate对象
T2 被唤起
T2 end
//过几秒
T1 end
(1)对象的wait()方法和notify方法
Object.wait() 线程等待,当调用wait()方法,线程就是停止执行当前任务,转为等待,直到被唤起
Object.notify() 线程唤起,将等待状态下的线程唤起,继续执行任务
(2)线程wait()和notify()的工作原理:
当对象Object调用了wait()方法后,线程进入到Object对象的等待队列,多个线程等待同一个对象
当对象Object调用了wait()方法后,就会从等待队列里面随机选取一个线程并将其唤起,完全随机
(3)注意事项:
notifyALL():唤起所有等待序列的线程
wait()和notify()都必须先获取目标对象的监视器,这样才能进行后续工作
wait方法不能随便使用,必须包含在synchronized中
JavaSE常用类之Object类的更多相关文章
- java 常用类库:Object类和Objects类
1,Object类: Object类是所有的类,数组,枚举的父类,也就是说,JAVA中允许把任何的对象赋值给Object类(包括基础数据类型),当定义一个类的时候,没有使用extends关键字显示指定 ...
- Java基础12:深入理解Class类和Object类
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
- 夯实Java基础系列9:深入理解Class类和Object类
目录 Java中Class类及用法 Class类原理 如何获得一个Class类对象 使用Class类的对象来生成目标类的实例 Object类 类构造器public Object(); register ...
- java class类和object类
Class类 介绍 Java的Class类是java反射机制的基础,通过Class类我们可以获得关于一个类的相关信息 Java.lang.Class是一个比较特殊的类,它用于封装被装入到JVM中的类( ...
- Java基础知识强化26(1):Object类之Object类的概述
1.Object类 类Object是类层次结构的根类,每个类都使用 Object作为超类.所有对象(包括数组)都实现这个类的方法 每个类直接或者间接继承自Object类 2.Object类无参构造 ...
- Java的常用API之Object类简介
Object类 1.toString方法在我们直接使用输出语句输出对象的时候,其实通过该对象调用了其toString()方法. 2.equals方法方法摘要:类默认继承了Object类,所以可以使用O ...
- Java.lang 包 (包装类、String类、Math类、Class类、Object类)
Java 的核心 API(Application Programming Interface)是非常庞大的,这给开发者带来了很大的方便. java.lang 包是 Java 的核心类库,它包含了运行 ...
- Java:面向对象(继承,方法的重写(overide),super,object类及object类中方法的重写,父子类代码块执行顺序)
继承: 1.继承是对某一匹类的抽象,从而实现对现实世界更好的建模. 2.提高代码的复用性. 3.extends(扩展),子类是父类的扩展. 4.子类继承父类可以得到父类的全部属性和方法.(除了父类的构 ...
- Java笔记:与系统交互、系统相关的类,Object类
1.程序与用户交互 (1)运行一个Java程序的时候要给它提供一个main方法入口,这边分析一下这个main方法的签名public static void main(String[] args);pu ...
- 各种异常 及异常类和Object类
Day05 异常 Object类 equals方法,用于比较两个对象是否相同,它其实就是使用两个对象的内存地址在比较.Object类中的equals方法内部使用的就是==比较运算符. 2. 描述人这个 ...
随机推荐
- 如何恢复 iCloud 已删除文件
原文链接 问题 今天在查找之前的 C++ 笔记时,突然发现之前的资料全没了,整个 Cpp 文件夹内就只剩下了三个文件,怎么形容当时的心情呢,应该说是一下就跌倒了谷底,感觉之前的心血全白费了,有种深深的 ...
- 人生苦短,我用JRebel
昨天看到团子推送的一篇关于热部署的文章,其中介绍了自研的Sonic插件在公司内部的应用.同时晒出来一张对比图: 团子表示我们的插件要比同类插件优秀哦.不过我定睛一看,好家伙,第一列的JRebel在图中 ...
- 七天接手react项目 系列
七天接手react项目 背景 假如七天后必须接手一个 react 项目(spug - 一个开源运维平台),而笔者只会 vue,之前没有接触过 react,此刻能做的就是立刻展开一个"7天 r ...
- Kettle错误记录之couldn't open file XXX
业务背景: 简单的TXT文件入库逻辑 组件: 文件文本输入,表输出 具体BUG: 这里报错是无法打开文件,在我尝试了多个思路后,最终发现了问题所在. 因为使用的txt文件的格式是Unix的,而我的文本 ...
- VMware安装win7后,安装VMware Tools时报错安装程序无法继续。本程序需要您将此虚拟机上安装的操作系统更新到SP1
具体报错: 倘若你用的是这样的镜像:cn_windows_7_enterprise_x64_dvd_x15-70741.iso 换镜像源.换镜像源.换镜像源! 换成带sp1的iso镜像:cn_wind ...
- 韦东山 嵌入式linux教程 笔记
@ 目录 资源链接 一.常用命令 二.shell 三.如何更改PATH? 四.路径 五.vi编辑器 六.进阶命令 七.NAT配置网络 (第2篇-P34) 八.开发板挂载 Ubuntu 的 NFS 目录 ...
- NLP 自然语言处理实战
前言 自然语言处理 ( Natural Language Processing, NLP) 是计算机科学领域与人工智能领域中的一个重要方向.它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和 ...
- Ubuntu16.04 搭建samba服务器
1昨天花了一天时间弄了NFS服务器,结果搭建完之后出现各种问题,要么挂载不上,要么就是字符乱码.今天在看到一个关于树莓派的介绍的时候,提到Samba服务器的搭建,我尝试了一下,结果发现很顺利地就能够正 ...
- BIO、NIO、AIO 有什么区别?
BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低.NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 ...
- 使用过 Redis 分布式锁么,它是什么回事?
先拿 setnx 来争抢锁,抢到之后,再用 expire 给锁加一个过期时间防止锁忘记了 释放. 这时候对方会告诉你说你回答得不错,然后接着问如果在 setnx 之后执行 expire 之前进程意外 ...