面向对象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类和包的内容在基础学习中没有太多的交集,但在开发中会经常用到,要做重点掌握
- 面向对象8__【Object类】【package包】
- Java面向对象——包(package) Object 类
- 黑马程序员 Java面向对象——包(package) Object 类
- 黑马程序员-day10-面向对象(包package)
- 面向对象——package包
- 黑马程序员--面向对象(接口,内部类,包,Object类)
- 黑马程序员——面向对象-Object类和包
- 面向对象-Object类
- 面向对象--Object类
- 909422229__面向对象
- 浅谈Scala 2.8的包对象(package object)
- 浅谈Scala 2.8的包对象(package object)
- 黑马程序员_面向对象3_(异常Exception、包package、String类、StringBuffer类)
- 黑马程序员_面向对象三(异常Exception,包package,String类,StringBuffer)
- 【Java重新学习】Java面向对象-包Package
- 黑马程序员 Java面向对象——包(package)
- JavaSE入门学习17:Java面向对象之package(包)
- Java面向对象--Object类
- NYOJ-113-字符串替换-2013年10月12日15:00:03
- 关于Oracle的卸载和解锁问题【注册表】
- vim配置
- unity自带寻路Navmesh入门教程(二)
- 黑马
- 面向对象8__【Object类】【package包】
- .src.rpm文件安装
- Android触摸事件分发机制
- OC之【@property的用法】
- 清空DNS缓存
- 使用单例模式实现mysql类
- javascript延迟加载方式
- NYOJ-168-房间安排-2013年10月12日16:17:14
- du命令