向下转型与instanceof 关键字,object类(系统类)中的常用方法

第一:向下转型
1.向下转型:
Animal a=new Dog(); Dog d=(Dog)a;这就是向下转型,注意Dog d=(Dog)a中必须是Dog类型的a才行。向下转型以后就不是多肽了

2.instanceof 关键字的引出:
向下转型以后将失去多肽的效果,向下转型指向转变成具体的子类,因此不能统一写的能力了(不能统一写成animal类了,只能把animal分别写成dog,cat,pig)。但是此对象到底是dog、cat、pig中的哪个呢?为了解决这个问题,我们引入了instanceof 关键字,用instanceof 做出判断

3.instanceof 关键字的使用:
if(ani instanceof Dog),这是向下转型的时候用到的。判断ani这个变量是不是dog类型,如果是dog的话,就可以向下转型成dog:Dog d=(Dog)ani

第二:object类:
1.object类的定义
object类是所有类的父类,所有类都实现这个类的方法。一个类间接或者直接的继承了object类。

2.object类的声明
  Object obj=new 任何对象。
注意:object类可以声明成任何类型的对象,因为object类是根类,此时就相当于发生了向上转型了。因为任何类默认情况下就继承了object类

3.object类的常用方法:
1).==:比较的是栈内存的地址
2).equals:默认(object类)比较的也是栈内存的地址,我们可以重写object(父类)中的equals方法,让他比较堆内存的属性值(数据).
3).tostring是输出对象的地址,我们可以重写,重写获得对象属性值(具体值)
4).finalize:垃圾回收器,释放系统资源:当对象的引用消失了就把该对象回收了。也就是栈内存没有了,相应的堆内存数据就是垃圾了。堆内存数据不会立马回收
5).System.gc(),这是启动垃圾回收器,立马回收。如果不写这个方法的话,就由java虚拟机来回收,但是不是立马回收。
当程序结束的时候,该程序在内存中对应的.class文件将消失,当垃圾回收器确定不存在该对象的引用的时候,由垃圾回收器调用object类的finalize方法将此对象回收。释放资源

4.==是比较的地址,那么equals为什么也是比较地址呢?
因为object类中的equals方法是这样写的:
public  boolean equals(Object obj){return (this==obj)},其中this就是调用equals方法的那个对象,所以虽然用了equals,但是最后还是用==进行比较的。

5.obejct类的equals默认比较的是地址,那么子类继承object类之后需要重写equals方法来比较两个对象的具体数据。
//重写父类中的equals方法,比较两个对象的属性值或者内容
public boolean equals(Object obj)
{
if(this==obj)
return true;
if(!(obj instanceof Student))
return false;
Student s =(Student)obj;
if(this.sno==s.sno&&this.age==s.age)
{
return true;
}
return false;
}

6.toString()方法在object类中默认比较的也是栈内存的地址,为了让tostring方法比较具体数据,就需要对tostring进行重写(当打印一个对象的时候,会默认调用toString(),默认获得对象的地址:system.out.print("s="+s)相当于system.out.print("s="+s.toString()))

//重写toString ,返回对象的内容
public String toString()
{
return "学号:"+sno+" 年龄:"+age;
}

7.finalize方法在object类中是这样定义的:
protected void finalize throws Throwable(){},
该方法不是抽象方法,但是方法体中没东西。



你可能感兴趣的:(向下转型与instanceof 关键字,object类(系统类)中的常用方法)