java中的多态分为两种

1方法的多态(严格意义上这不算,但为了帮助新手理解多态,此处归为多态)

方法的多态体现为,同一个类中有同名的方法,但是方法的参数类型,或参数个数不同,在实际调用的时候,会根据参数类型或参数个数找到对应的方法,这其实就是java方法的重载。

2引用多态

(1)多态的前提

        A 要有继承关系

        B要有方法重写

        C要有父类引用指向子类

      多态的代码体现


class Fu{
public int age = 35;
public void show(){
System.out.println('fu');
}

public static void run(){
System.out.println('我跑的快');
}

}

class Zi extends Fu{ // 继承
public int age = 10;
public void show(){ // 方法重写
System.out.println('zi');
}

public static void run(){
System.out.println('我跑的慢')
}
}

Fu f = new Zi(); // 父类引用指向子类




小插曲:

虽然Fu类的静态方法  run()  只能被Zi类的静态方法 run() 重写,但这实际上根本不叫重写,子类的静态方法,不会覆盖父类的静态方法,因为静态方法是属于类的,而不是属于对象的。

 

(2) 多态中的成员访问特点

编写一个测试demo

class testDemo{
public static void main(String[] args){
Fu f = new Zi();
System.out.println(f.age);
System.out.println(f.show());
System.out.println(f.run());
}
}





以上代码运行之后依次会输出  35   zi   我跑的快

如果用指向父类的引用  f  访问了 Fu 类中没有的 成员变量  成员方法  静态方法  在编译阶段 都将报错

而我们发现,父类的成员方法在被子类重写之后,虽然  f 是指向 Fu 类的引用,但是访问的却是 Zi 类

中对应的 show() 方法,所以总结如下:


Fu f        =    new Zi(); 
//左(Fu) 右(Zi)



 成员变量:

 编译看左边,访问看左边

 构造方法:

 创建子类对象的时候,会访问父类的构造方法,对父类的数据进行初始化

 成员方法:

 编译看左边,访问看右边(若子类对父类的方法进行重写,则会把父类中对应的方法覆盖,会访问到子类的方法)

 静态方法:

 编译看左边,访问看左边