从昨天的组合和继承开始,我在分析二者的区别,到后面的向上转型,再到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; }