黑马程序员--java基础--Object类中的几个方法、包的概念

                                                          ------- 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的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值