面向对象8__【Object类】【package包】

来源:互联网 发布:阿里云企业邮箱 删除 编辑:程序博客网 时间:2024/04/28 21:00


Object 

所有类的根类,java中的上帝,具备所有对象的共性内容

equals方法

equals方法默认比较是否是同一个对象的引用;

this==obj用到对象的多态性,以便于和任何对象比较,要注意类型的转换,要想调用子类特有内容必须向下转型

要注意的是转换成子类类型后equals()方法就不能接收非该子类类型的对象了,需要在equals方法中使用instanceof健壮性判断

并抛出异常throw new ClassCastException(“类型错误”);并结束程序

一般都会覆盖此方法,根据对象的特有内容判断对象特定属性是否相同(用于不同对象之间的比较)

hashCode()

返回该对象的十进制哈希值,提高哈希表性能。

equals()方法被重写时通常有必要重写hashCode方法,以维护hashCode方法的常规协定该声明相等对象必须具有相等的哈希值

对象的引用直接打印出来就是对象的十六进制哈希值

十进制转十六进制Integer.toHexString(对象.hashCode());

public int hashCode(){return age;//覆盖后内容相同,哈希码就相同}

在集合框架部分有重要应用

getClass()

返回此对象的运行时类(Class.class

任何类在内存中都有自己所属的字节码文件,Class类正是用于描述这些类

获得类型类

    我们知道在Java中一切都是对象,我们一般所使用的对象都直接或间接继承自Object类。Object类中包含一个方法名叫getClass,利用这个方法就可以获得一个实例的类型类类型类指的是代表一个类型的类,因为一切皆是对象,类型也不例外,在Java使用类型类来表示一个类型。所有的类型类都是Class类的实例

toString()

返回该对象的字符串表示,打印对象时默认调用该方法,

该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成

getClass().getName() + '@' + Integer.toHexString(hashCode())

//p1.toString() 运行时类/类型类.name + @+哈希码

开发中一般都会覆盖此方法


wait() notify() 用于多线程,待续...

Object类的综合应用

代码示例

class Person extends Object{String name;private int age;Person(int age,String name){this.age=age;this.name=name;}public boolean equals(Object obj)//覆盖Object中的equals方法{if (!(obj instanceof Person))//健壮性判断,Demo非Person类{throw new ClassCastException("类型错误");}//return this.age==obj.age;Person p=(Person)obj;//向下转型,转型后只能往equals()方法中传Person类及其子类return this.age==p.age;//p?????}}/*public int hashCode()//复写hashCode()方法{return age;}*/public String toString()//复写toString()方法{return "Person+"+age;}class Demo{}class EqualsDemo {public static void main(String[] args) {Person p1=new Person(20,"a");Person p2=new Person(20,"b");//System.out.println(p1==p);System.out.println("equals: "+p1.equals(p2));//比较a和b是否是同龄人//Demo d = new Demo();//System.out.println(p1.equals(d));这里传Demo类型的对象显然是行不通的,传值时要做健壮性判断Class c1=p1.getClass();Class c2=p1.getClass();System.out.println(c1==c2);//c1和c2都指向p1的类型类Person.class,所以trueSystem.out.println(c1.getName());//PersonSystem.out.println(p1);//Person@3a6646fc此处默认调用p1.toString(),覆盖就调用覆盖后的System.out.println(Integer.toHexString(p1.hashCode()));//十进制转十六进制3a6646fcSystem.out.println(p1.getClass().getName()+"@"+Integer.toHexString(p1.hashCode()));////p1.toString()运行时类/类型类.name + @+哈希码}}

package

对文件进行分类管理,提供多层命名空间,通常写在程序的第一行,包也是一种封装形式,用来管理java中的类并提供访问控制

package 名称(所有字母都小写)

类名的全称是(包名.类名),一定要注意

可以有多层包名,包名.包名.包名.....类名

 

不同的包中类与类之间的访问

javac -d . Demo.java ,在当前目录下创建包,一定要注意加空格

javac -d 目录名 Demo.java在指定目录下创建包


常见注意事项示例

packa.DemoA被访问

package packa;public class DemoA //要想在其他包中访问,类名和方法名都必须是公共的{public void show(){System.out.println("Hello World!");}}

mypack.PackageDemo主类

package mypack;//包名全部小写class PackageDemo {public static void main(String[] args) {packa.DemoA d = new packa.DemoA();//一定要注意全称是 包名.类名,否则编译失败d.show();System.out.println("Hello Package!");}}

常见错误类型

1,访问时直接写类名

PackageDemo.java:7: 错误: 找不到符号         
                DemoA d = new DemoA();                 
                ^
  符号:   类 DemoA
  位置: 类 PackageDemo
PackageDemo.java:7: 错误: 找不到符号
                DemoA d = new DemoA();
                              ^
  符号:   类 DemoA
  位置: 类 PackageDemo
2 个错误


错误原因:类名写错
DemoA类已经有包的所属,必须明确包名。直接写类名是错的 正确名称是:包名.类名

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

2,移动文件后


PackageDemo.java:7: 错误: 程序包packa不存在  
                packa.DemoA d = new packa.DemoA();
否则编译失败
                     ^
PackageDemo.java:7: 错误: 程序包packa不存在
                packa.DemoA d = new packa.DemoA();
否则编译失败
                                         ^
2 个错误



错误原因:当前目录下没找到调用的包。应该配置一个classpath
set classpath=c:\myclass (包所在目录)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

3,权限控制


PackageDemo.java:7: 错误: DemoA在packa中不是公共的; 无法从外部程序包中对其进行访问
                packa.DemoA d = new packa.DemoA();
                     ^
PackageDemo.java:7: 错误: DemoA在packa中不是公共的; 无法从外部程序包中对其进行访问
                packa.DemoA d = new packa.DemoA();
                                         ^
2 个错误


错误原因:权限访问不到


包与包之间访问,被访问的包中的类及其被访问的方法都必须是public

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

4.包之间的继承

protect权限,在不同包之间访问时,public的类任何类都何以访问,受protect保护的类只有其子类可以访问


访问权限

public

protect

default

private

同一个类中

ok

ok

ok

ok

同一个包中

ok

ok

ok

 

子类中

ok

ok

 

 

不同包中

ok

 

 


Jar : java的压缩包

控制台步奏

javac -d . Demo.java//将pack.Demo 打包在当前目录下jar -cf haha.jar pack//将pack包压缩到haha.jarset classpath=.\haha.jar//设置临时环境变量java pack.Demo//直接通过包名.类名访问,跟压缩前使用方法相同



总结

Object类具备所有类的共性,可以利用多态性很方便的应用,同时也要注意数据的类型转换

包是面向对象思想 封装的体现,可以将不同类型的文件隔离,并提供访问控制,只有public和protect权限可以访问不同包中的内容

Object类和包的内容在基础学习中没有太多的交集,但在开发中会经常用到,要做重点掌握