------- android培训、java培训、期待与您交流! ----------
Object几个常用方法总结
Object::
是所有类的根类。
是不断抽取而来,具备着所有对象都具备的共性内容。
class Fu // extends Object在这里被省略了。
{
Fu()
{
super();
}
}
class Zi extends Fu
{
Zi()
{
super();
}
}
jdk1.5中,描述了该类中的11个方法
其中equals、hashCode、getClass、toString比较常用,主要讲解这4个方法,其他的到后面也会讲到
1.equals方法
public boolean equals(Object obj);
某个其他对象是否与此对象“相等”。
参数:
obj - 要与之比较的引用对象。
返回:
如果此对象与 obj 参数相同,则返回 true;否则返回 false。
特点
自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么
x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象
上 equals 比较中所用的信息没有被修改。
注意:对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
例子一:判断用法与==是否相等
<pre name="code" class="html">class Person extends Object
{
int age;
Person(int age)
{
this.age = age;
}
}
public class Objecttttt {
public static void main(String[] args)
{
Person p1 = new Person(60);
Person p2 = new Person(60);
System.out.println(p1==p2);
System.out.println(p1.equals(p2));
}
}
打印结果是false 所以==与Object中equals效果一样
false
例子二:覆盖equals方法
public class Objecttttt {
public static void main(String[] args)
{
Person p1 = new Person(60);
Person p2 = new Person(60);
System.out.println(p1==p2);
System.out.println(p1.equals(p2));
}
}
/*
一般都会覆盖Object中的equals方法,根据对象的特有内容,建立判断对象是否相同的依据。
*/
class Person extends Object
{
int age;
Person(int age)
{
this.age = age;
}
public boolean equals(Object obj)//Object obj = p2;
{
if(!(obj instanceof Person))
{
throw new ClassCastException("类型错误");
}
Person p = (Person)obj;
return this.age == p.age;
}
}
打印结果是fault
true
2.hashCode
public int hashCode()
返回该对象的哈希码值。
例子一:直接打印出哈希值
public class Objecttt {
public static void main(String[] args) {
Person11 p1 = new Person11(60);
System.out.println(p1);
System.out.println(p1.hashCode());
}
}
class Person11 extends Object
{
private int age;
Person11(int age)
{
this.age = age;
}
}
打印结果:com.Myfly.Person11@15db9742 //@前面是类型,@后面是十六进制表现形式的哈希值
366712642 //直接打印出十进制的哈希值
例子二:覆盖hashCode方法
public class Objecttt {
public static void main(String[] args) {
Person11 p1 = new Person11(60);
System.out.println(p1);
System.out.println(p1.hashCode());
}
}
class Person11 extends Object
{
private int age;
Person11(int age)
{
this.age = age;
}
public int hashCode()
{
return age;
}
}
打印结果是:com.Myfly.Person11@3c
60 //被赋予了特定的哈希值
3.getClass
这个方法是用来获取对象的字节码文件。
.java文件编译后就会生成.class文件(即字节码文件),然后编译器加载这个字节码文件,类加载器按类名加载文件中的类,执行入口main方法。
下面是原理图:
例子
public class Objecttttttt {
public static void main(String[] args) {
Person111 p1 = new Person111(60);
Person111 p2 = new Person111(20);
Class clazz1 = p1.getClass();
Class clazz2 = p2.getClass();
System.out.println(clazz1==clazz2);
System.out.println(clazz1.getName());
}
}
class Person111 extends Object
{
private int age;
Person111(int age)
{
this.age = age;
}
}
打印结果:true //因为是用的同一个类创建的对象所以字节码文件是同一个。
com.Myfly.Person111 //通过getName方法获取了字节码文件的类名
4.toString
例子
public class Objecttttttt {
public static void main(String[] args) {
Person1111 p1 = new Person1111(60);
System.out.println(p1.toString());
System.out.println(p1.getClass().getName()+"@"+Integer.toHexString(p1.hashCode()));
}
}
class Person1111 extends Object
{
private int age;
Person1111(int age)
{
this.age = age;
}
}
打印结果:com.Myfly.Person1111@15db9742
com.Myfly.Person1111@15db9742
//打印结果一样证明了<span style="font-family: Arial, Helvetica, sans-serif;">toString与</span><span style="font-family: Arial, Helvetica, sans-serif;">getClass().getName()+"@"+Integer.toHexString(p1.hashCode())等效</span>
包
简述在java中包相当于文件夹。包里通常存放的是类文件,因为我们在编写程序的时候,难免会有类名相同的情况,在不同包中可以有相同的类名,调用的时候连同包名一起就行。
包也是一种封装形式。
作用
1、为避免多个类重名的情况。
2、对类文件进行分类管理。
3、给类提供多层命名空间。
4、包的出现可以将java的类文件和源文件相分离。
特点
1、包必须写在程序的第一行。因为要先有包,才知道类文件的存放地方。
2、类的全称:包名.类名。
3、编译定义了包的程序文件时,在编译时要指定包的存储目录。
4、要访问其他包中的类,需要定义类的全称:包名.类名。
5、包如果不在当前路径,需要使用classpath设定环境变量。
6、被访问的包中的类权限必须是public的。
7、类中的成员权限:public或者protected。protected是为其他包中的子类提供的一种权限。
8、不同包中的子类可以直接访问父类中被protected权限修饰的成员。
包的导入——import应用
import packa.DemoA;//导入了packa包中的DemoA类。
import packa.*;//导入了packa包中所有的类。
//导包的原则:用到哪个类,就导入哪个类。
//import 干嘛用的啊?为了简化类名书写。
class PackageDemo
{
public static void main(String[] args)
{
DemoA d = new DemoA();
DemoAbc d = new DemoA();
d.show();
packb.DemoB b = new packb.DemoB();//没有导包就要写全类名
b.method();
System.out.println("Hello Package!");
}
}
下面介绍一下导包常见的异常处理
异常1
PackageDemo.java:8: 找不到符号
符号: 类 DemoA
位置: 类 mypack.PackageDemo
DemoA d = new DemoA();
^
PackageDemo.java:8: 找不到符号
符号: 类 DemoA
位置: 类 mypack.PackageDemo
DemoA d = new DemoA();
^
原因:类名写错。因为DemoA类已经有包的所属,所以必须要明确其报名。
记住:DemoA这个名词错的。 正确名称是报名.类名 packa.DemoA
异常2
PackageDemo.java:8: 软件包 packa 不存在
packa.DemoA d = new packa.DemoA();
^
PackageDemo.java:8: 软件包 packa 不存在
packa.DemoA d = new packa.DemoA();
^
原因是在当前目录下没找到,因为packa存放在其他目录下,
应该配置一个classpath。
异常3
PackageDemo.java:8: packa.DemoA 在 packa 中不是公共的;无法从外部软件包中对其进
行访问
packa.DemoA d = new packa.DemoA();
^
PackageDemo.java:8: packa.DemoA 在 packa 中不是公共的;无法从外部软件包中对其进
行访问
packa.DemoA d = new packa.DemoA();
原因:包与包之间的类进行访问,被访问的包中的类必须是public的,被访问的包中的类的方法也必须是public的。