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