多态,是面向对象中的一大特点.其,在继承的基础上产生,就是使java世界中的实物具有多种存在形态.
多态定义:某一类事物的多种存在形态
体现(表现形式):父类的引用指向了自己的子类对象;或者也可以说父类的引用也可以接受自己的子类对象.
前提:必须是类与类之间有关系,要么继承,要么实现.通常还要存在覆盖.
好处:多态的出现大大提高了程序的扩展性
弊端,虽然提高了扩展性,但是也只能使用父类的引用访问父类中的成员而已
例子: 动物:猫 , 狗 ,
abstract class Animal{
abstract void eat();
}
class cat extends Animal{
public void eat(){
System.out.println("吃鱼");
}
public void catchMouse(){
System.out.println("抓老鼠");
}
}
class Dog extends Animal{
public void eat(){
System.out.println("吃骨头");
}
public void defend(){
System.out.println("守家");
}
}
public class DuoTaiDemo {
public static void main(String[] args) {
Animal a=new cat();//类型提升,向上转型
a.eat();//打印出"吃鱼"
//如果想要调用猫的特有方法,可以强制将父类的引用,转成子类类型.向下转型
cat c=(cat)a;//向下转型
c.catchMouse();
}
}
(重)在多态中,成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法.如果有,编译通过,如果没有编译失败.
在运行时期:参阅对象所属的类中是否有调用的方法.
在多态中,成员变量的特点:
当父类,子类出现重名变量时,无论编译还是运行,都参考左边(引用型变量所属的类)
在多态中,静态成员函数,变量特点:
无论编译和运行,都参考左边(只参考引用所属,与类静态绑定)
class Fu{
int num=5;
void method1(){
System.out.println("fu_1");
}void method2(){
System.out.println("fu_2");
}static void method4(){
System.out.println("fu_4");
}
}
class Zi extends Fu{
int num=8;
void method1(){
System.out.println("zi_1");
}void method3(){
System.out.println("zi_3");
}static void method4(){
System.out.println("zi_4");
}
}
public class DuoTaiDemo{
public static void main(String[] args) {
Fu f=new Zi();
f.method1();
f.method2();
//f.method3();父类中没有,必须向下转型才可以调到
System.out.println(f.num);//打印出5,是父类中的num
Zi z=new Zi();
z.method1();//打印出zi_1
z.method2();//打印出fu_2,继承父类的,直接用
z.method3();//打印出zi_3
System.out.println(z.num);//打印出8,是子类中的num
f.method4();//result:fu_4
z.method4();//result:zi_4
}
}
Object 类,是类层次结构的根类.每个类都使用Object作为超类(包括数组)都实现这个类的方法.[所有对象的直接或间接父类,就是上帝,该类中定义的是所有对象都具备的功能]
常见的有equals----Object类中提供的.
对,对象是否相同的比较方法.[如果自定义类中也有比较相同的功能,此时没必要重新定义,只要沿袭父类中的功能即可,建立自己特有的比较内容]
class Demo{//extends Object
private int num;
Demo(int num){
this.num=num;
}
public boolean equals(Object obj){//Object obj=new Demo();
if(!(obj instanceof Demo))//判断obj是否为demo类的对象
return false;
Demo d=(Demo)obj;//向下转型
return this.num==d.num;
}
}
public class Test{
public static void main(String[] args) {
Demo d1=new Demo(4);
Demo d1=new Demo(4);
System.out.println(d1.equals(d2));//使用复写后的equals,结果为true
//假设有一个person类
person p=new person(4);
System.out.println(d1.equals(p));//因为p不是demo类的对象,不能调用demo类中的equals方法,用的还是Object中的,所以结果是false
}
}