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,所以true
System.out.println(c1.getName());//Person
System.out.println(p1);//Person@3a6646fc 此处默认调用p1.toString(),覆盖就调用覆盖后的
System.out.println(Integer.toHexString(p1.hashCode()));//十进制转十六进制3a6646fc
System.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.jar
set classpath=.\haha.jar//设置临时环境变量
java pack.Demo //直接通过包名.类名访问,跟压缩前使用方法相同
总结:
Object类具备所有类的共性,可以利用多态性很方便的应用,同时也要注意数据的类型转换
包是面向对象思想 封装的体现,可以将不同类型的文件隔离,并提供访问控制,只有public和protect权限可以访问不同包中的内容
Object类和包的内容在基础学习中没有太多的交集,但在开发中会经常用到,要做重点掌握