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

来源:互联网 发布:软件使用许可证模板 编辑:程序博客网 时间:2024/05/29 17:34

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