首页 > 技术文章 > 2018.1.7java转型

shijinglu2018 2018-01-07 23:03 原文

        从昨天的组合和继承开始,我在分析二者的区别,到后面的向上转型,再到hashcode和equals还有==的区别,感觉基础还很不好,也许,目前应该从面向对象开始复习,把暂时笔试宝典放一下。

       回忆一下今天学的知识。

 

java转型(向上或向下转型)

类型转换:对象类型转换包括向上转型和向下转型。

 

提问:

何时需要转型呢?为什么要转型?

 

向上转型:子类转型成父类。(子类覆盖父类的功能,或者说子类晋升为父类)

基类:

public class A{

public void a1(){

System.out.println(“Superclass”);

}

}

A的子类B:

public class B extends A{

public void a1(){

System.out.println(“Childrendclass”);

//覆盖父类的方法

}

测试类C:

public class C{

public static void main(String[] args){

A  a=new B();

a.a1();

}

}

//结果:Childrendclass

 

深入理解:父类引用指向子类

 

引用:指对象名称,如d1,被分配于栈内存中,指向被分配于堆内存中的类Dog。

如:Dog d1=new Dog();

 

再如:Animal animal=new Cat();

其中父类为Animal,子类是Cat。

 

Animal animal=new Animal();

//系统将分配1M

Cat cat=new Cat();

//系统分配1.5M内存,因为子类有一个隐藏引用Super会指向父类实例。所以实例化子类前会先实例化一个父类。先执行父类的构造函数。由于包含了父类的实例,所以可以调用父类的方法。

 

 

 

 

 

Object类该类是所有类的父类,如果你不调用,系统会自动调用。

 

通过查看API文档可以得知Object中的有关方法clone():克隆自身

equals():判断相等

finalize():类似于C++中的析构函数,进行内存回收。由于java垃圾回收机制,系统会自动调用此方法。

getClass():获取类方法,后面的反射知识会着重讲到。这个Class要大写,因为它是一个关键字。

hashCode():对象在内存中的位置,并有一个哈希码值,若两者equals,则hashCode相同,反之,却不一定,即内容不同,哈希编码可能相同。

具体原因复习后面的容器相关知识。

 

toString():返回一个代表这个对象的字符串。

 

System.out.println(“info”+person)将自动调用对象类的toString()方法。

字符串与非字符串连接时,后者自动转换成字符串。

public class TestToString{

 public static void main(String[] args){

       Dog d=new Dog();

       System.out.println("d:="+d.toString());

 //其实在这里toString方法可以省略,因为Object类是所有类的基类系统自动调用它下面的toString方法

 }

}

class Dog{

 public String toString(){

 return "I a cool dog";

 }

}

//Dog类继承Object类

 

/*

运行结果:

d:=I a cool dog

如果Dog类方法体为空的话

则运行结果是d:=Dog@757aef(类名加十六进制的哈希编码),即自动调用Object类的toString()方法。

 

public class TestEquals{

 public static void main(String[] args){

 Cat c1=new Cat(1,2,3);

 Cat c2=new Cat(1,2,3);

    String s1=new String(“hello”);

    String s2=new String(“hello”);

    System.out.println(s1==s2);

    //false,因为指向的是引用??不理解

    System.out.println(s1.equals(s2));

     //true,因为在java.lang中已经重写了

 System.out.println(c1==c2);

 System.out.println(c1.equals(c2));

 }

}

class Cat{

 int color;

 int height, weight;

 

 public boolean equals(Object obj){

                         //父类引用指向子类对象

 if(obj==null)

       return false;

       //根据API文档来的

 else{

     if(obj instanceof Cat){

     Cat c=(Cat)obj;

     //强制转换成obj

     if(c.color==this.color && c.height==this.height && c.weight=this.weight)

       return true;

     }

     //instanceof取类型

 }

 }

       return false;

}

 

 

 

 

 

推荐阅读