多态和Object类
多态
定义:某一类事物的多种存在形态
例子:学生中有学生A和学生B
学生A这个对象对应的类型是学生A类型:StudentA studentA = new StudentA();
同时我们的学生A也是学生的一种,也可以把学生A称为学生。
Student student = new StudentA();
学生Student是学生A和其他学生事务中抽取出来的父类;父类的引用指向了子类对象。
1、多态的体现
父类的引用指向了自己的子类对象。
父类的引用也可以接收自己的子类对象。
2、多态的前提
必须是类与类之间有关系,要么继承,要么实现。通常还有一个前提,存在覆盖。
3、多态的好处
多态的出现提高了程序的扩展性。
4、多态的弊端
只能使用父类的引用访问父类中的成员。
练习:通过练习体会多态
有动物Animal类,动物有猫、狗、猪,他们都有一个共同的特点吃东西,然后它们都有各自的特性;封装一个方法,调用与其对应的吃的方法。main方法中调用。
转型
Animal a = new Cat();//类型提升,也称为向上转型,把猫转换成动物类型
a.eat();
//如果想调用猫的特有方法?
//Cat c = new Cat();//此处new了一个新的猫,所以这不匹配;
//此时将父类的引用转成子类类型。
Cat c = (Cat)a;
//错误演示
/*
Animal a = new Animal();
Cat c = (Cat)a;
不能把父类对象转换为子类类型。我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。多态自始至终都是子类对象做着变化。
我们在判断此对象是不是某个类型的时候用关键字instanceof
*/
多态成员的特点
class Fu{
int num = 5;
void run1(){
System.out.println("Fu run1");
}
void run2(){
System.out.println("Fu run2");
}
}
class Zi extends Fu{
int num = 8;
void run1(){
System.out.println("Zi run1");
}
void run3(){
System.out.println("Zi run3");
}
}
class Test{
public static void main(String[] args){
Zi zi = new Zi();
zi.run1();
zi.run2();
zi.run3();
zi.num;
//打印结果?
Fu zi = new Zi();
zi.num;
zi.run1();
zi.run2();
zi.run3();//报错,因为父类的对象里面没有run3()方法
}
}
多态成员函数的特点:在编译时期:参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,没有,编译失败。在运行时期:参阅对象所属的类中是否有调用的方法。
总结:成员函数在多态调用时,编译看左边,运行看右边。
在多态中,成员变量的特点:无论编译与运行,都参考的左边。
在多态中,静态成员函数的特点:
无论编译和运行,都参考左边。
Object类
它是所有对象的间接父类;该类中定义的所有对象都具备的功能。
equals()方法:
java认为所有的对象都具备比较性,都能比较大小。
示例:
class Test{
public static void main(String[] args){
Test t1 = new Test();
Test t2 = new Test();
System.out.println(t1.equals(t2));//其实equals就是用的我们==来比较的。
}
}
注意:我们在重写equals()方法的时候我们必须要先进行多态转型。
toString()方法:
class Test{
public static void main(String[] args){
Demo d = new Demo();
System.out.println(d.toString);//打印结果?
System.out.println(Integer.toHexString(d.hashCode()))
}
class Demo{
}