Java学习第十七课(Object及其部分方法的应用)

Object :所有类的根类

Object是不断抽取而来的,具备着所有对象都具备的关系内容

方法摘要:

clone():创建并返回一个此对象的副本
equals(Object obj):指示其他对象是否与此对象“相等”
finalize():当垃圾回收器确定不存在对该对象更多的引用时,由对象的垃圾回收器调用此方法
getClass():返回Objext的运行时类
hashCode():返回该对象的哈希码值
notify():唤醒在此对象监视器上等待的单个线程
notifyAll():唤醒在此对象监视器上等待的所有线程
toString():返回该对象的字符串表示
wait():在其他线程调用此对象的notify()或notifyAll()方法前,导致当前线程等待
wait(long timeout):在其他线程调用此对象的notify()或notifyAll()方法,或者超过指定的时间量前,导致当前线程等待
wait(long timeout,int nanos):在其他线程调用此对象的notify()或notifyAll()方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待

一、equals():(重点掌握)

class Man
{
	private int age = 3;
	Man(int age)
	{
		this.age = age;
	}
}
class Son
{

}
public class Main
{
	public static void main(String[] args)
	{
		Man BLF = new Man(20);
		Man BLF1 = new Man(20);
		Man BLF2 = BLF1;
		System.out.println(BLF==BLF1);//false
		System.out.println(BLF.equals(BLF1));//flase
		//为什么是false?
		//一旦一个Man(20)传递年龄,另一个MAN(“xxx”)传递姓名,这两个肯定不一样
		System.out.println(BLF1.equals(BLF2));//true
		Son BLF5 = new Son();
		System.out.print(BLF2.equals(BLF5));//不一样的类定义的对象也可以比较
	}
}

当然很多时候,equals只判断地址是不够用的,可以复写

一般都会覆盖此方法,根据对象的特有内容,建立判断对象是否相等的依据

import java.net.InterfaceAddress;

import javax.management.RuntimeErrorException;

class Man extends Object
{
	private int age = 3;
	Man(int age)
	{
		this.age = age;
	}
	//比较是否同龄
	public boolean cmp(Man b)
	{
		return this.age==b.age;
	}//但是Man继承于Objext,Objext有equals方法,就没必要写cmp这个重复的方法
	//复写父类的equals
	public boolean equals(Object b)//多态,向上转型
	{
		if(!(b instanceof Man))
		{
			//return false;
			//或者警告类型错误
			throw new RuntimeException("不要故意找茬,只判断人");
		}
		Man c = (Man)b;//向下转型
		return this.age==c.age;
	}
}
class animol
{

}
public class Main
{
	public static void main(String[] args)
	{
		Man BLF = new Man(20);
		Man BLF2 = new Man(20);
		System.out.println(BLF.cmp(BLF2));
		animol BLF3 = new animol();

		System.out.println(BLF.equals(BLF3));

	}
}

二、hashCode()//哈希,集合框架中会重要应用

import java.net.InterfaceAddress;
import javax.management.RuntimeErrorException;

class Man extends Object
{
	private int age = 3;
	Man(int age)
	{
		this.age = age;
	}
}
class animol
{

}
public class Main
{
	public static void main(String[] args)
	{
		Man BLF = new Man(20);
		Man BLF2 = new Man(20);
		System.out.println(BLF);
		System.out.println(BLF.hashCode());//十进制
		System.out.println(Integer.toHexString(BLF.hashCode()));
	}
}

在实际开发中,可能想要自己定义对象的哈希值,那么hashCode就需要复写

import java.net.InterfaceAddress;
import javax.management.RuntimeErrorException;

class Man extends Object
{
	private int age = 3;
	Man(int age)
	{
		this.age = age;
	}
	public int hashCode()
	{
		return age;
	}
}

public class Main
{
	public static void main(String[] args)
	{
		Man BLF = new Man(20);
		Man BLF2 = new Man(20);
		System.out.println(BLF);
		System.out.println(BLF.hashCode());//十进制,20的十六进制为14
		System.out.println(Integer.toHexString(BLF.hashCode()));
	}
}

三、getClass方法

在创建对象的时候,先在内存加载 Man.class字节码文件对象,然后new Man();每个对象都有自己的所属的字节码文件对象

import java.net.InterfaceAddress;
import javax.management.RuntimeErrorException;

class Man
{
	private int age = 3;
	Man(int age)
	{
		this.age = age;
	}
	public int hashCode()
	{
		return age;
	}
}

public class Main
{
	public static void main(String[] args)
	{
		Man BLF = new Man(20);
		Man BLF2 = new Man(20);
		Class c = BLF.getClass();
		Class d = BLF2.getClass();
		System.out.println(c);
		System.out.println(c==d);//true,两个对象的字节码文件对象是相同的
		//Class中有getName方法得到的当前运行时的类名
		System.out.println(c.getName());//Man
	}
}

四、toString方法:

import java.net.InterfaceAddress;
import javax.management.RuntimeErrorException;

class Man
{
	private int age = 3;
	Man(int age)
	{
		this.age = age;
	}

}

public class Main
{
	public static void main(String[] args)
	{
		Man BLF = new Man(20);
		Man BLF2 = new Man(20);

		System.out.println(BLF);//[email protected],@以前是getName,@以后是hashCode得到
			System.out.println(BLF.toString());//实际上上面BLF后面就是省略的.toString()
		System.out.println(BLF.getClass().getName()+"----"+Integer.toHexString(BLF.hashCode()));
	}
}

建议所有子类都重写该方法

import java.net.InterfaceAddress;
import javax.management.RuntimeErrorException;

class Man
{
	private int age = 3;
	Man(int age)
	{
		this.age = age;
	}
	public String toString()
	{
		return "Man"+age;
	}
}
public class Main
{
	public static void main(String[] args)
	{
		Man BLF = new Man(20);
		Man BLF2 = new Man(20);

		System.out.println(BLF);//Man20
	}
}

PS:还有一些方法,等到渣渣学到多线程是再补全

时间: 2024-10-22 17:31:57

Java学习第十七课(Object及其部分方法的应用)的相关文章

java 学习之List 的 add 与set方法区别

/** * 在List集合中众多方法中,add(int index,Object obj)方法与set(int index,Object e)方法不易区分 * ,通过下面实例,可以看出两个方法中的区别 */ package gao; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class CollectionDemo { public static void main(

Java学习之道:ArrayList的使用方法

1.什么是ArrayList     ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和IList接口 灵活的设置数组的大小 2.如何使用ArrayList     最简单的例子: ArrayList List = new ArrayList(); for( int i=0;i<10;i++ ) //给数组增加10个Int元素 List.Add(i); //..程序做一些处理 List

Java学习(API及Object类、String类、StringBuffer字符串缓冲区)

一.JAVA的API及Object类 1.API 概念: Java 的API(API: Application(应用) Programming(程序) Interface(接口)) Java API就是JDK中提供给我们使用的类,这些类将底层的代码实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可. 在JDK安装目录下有个src.zip文件,这个文件解压缩后里面的内容是所有Java类的源文件.可以在其中查看相对应的类的源码. 我们在每次查看类中的方法时,都打开源代码进

JAVA学习第二十一课(多线程(一)初步了解)

放假在家,歇了好几天了,也没学习,今天学习一下多线程,找找感觉,后天就要回学校了,sad... PS:包 没有什么技术含量,会用即可,日后开发就必须要会用啦,所以打算先放一放,先来多线程 一.多线程概述 什么是进程? 通俗的说,可以理解为正在进行中的程序,进程实际上是对应的一个应用程序在内存中所属空间. 进程不直接执行的,进程只是分配该应用程序需要的内存空间,线程来负责执行,线程负责进程中内容执行的一个控制单元,也称之为执行路径,也称之为执行情景 什么是线程? 线程就是进程中一个负责程序执行的控

JAVA学习第十一课(继承)

继承:(extends) 很多类,但是有一些成员,都是重复的,所以为提供复用性,把重复的代码抽取出来,就应用了继承 1.提高了代码的复用性 2.让类与类之间产生了关系,继承给多态提供了前提,没继承就没多态 class MAN { String name; int age; } class student extends MAN //MAN是student的基类,student是MAN的子类 { void study() { System.out.println(name+"正在学习"+

JAVA学习第二十课(异常的应用和注意事项(三))

十.异常的应用 import java.util.Random; import javax.rmi.CORBA.Stub; /* *老师用电脑上课 *用面向对象思考问题 *问题设计两个对象 *老师,电脑 * *可能发生的问题: *电脑蓝屏.电脑冒烟 */ class Lan extends Exception//蓝屏 { Lan(String problem) { super(problem); } } class Fir extends Exception//冒烟 { Fir(String p

我的java学习笔记(9)关于Object:所有类的超类

1.Object类是java所有类的始祖,java中的每一个类都是由它扩展而来的. 2.如果没有明确的指出超类,Object就被认为是这个类的超类. class a extends Object class a //可以缺省 3.可以使用Object类型变量引用任何类型的对象. Object e = new Employee("w1",100,1988,1,1); 4.在java中,只有基本类型不是对象,数组类型,不管是对象数组还是基本而类型的数组都可扩展于Object类. int[]

java 学习第11课,android 实现拨打电话的功能

1. 先布局界面,界面采用线性垂直方式来布局 在layout 界面文件中 activity_main.xml 中 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation=&

JAVA学习第四课(数组)

数组: 同一类型数据的集合,即一种容器. 定义方式: int[] atrr = new int[5];//int 型数组 数组名arr ,new动态开辟  int[5],数组大小为5,只能存放5个元素, 下标0-4 数组定义后在内存中的基本分布: 内存的划分: 1.寄存器 -> CPU 2.本地方法区,与所在系统相关 3.方法区 4.栈内存: 存储的都是局部变量,且变量所属的作用域一旦结束,当前变量就会自动释放,所以 栈内存更新速度很快,因为栈内变量的生命周期都很短(结束就释放). 例如:局部代