多态性,是面向对象中最重要的概念,在Java中的体现:
对象的多态性:父类的引用指向子类的对象
》可以直接应用在抽象类和接口上
Java引用变量有两个类型:编译时类型和运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。简称:编译时,看左边:运行时,看右边。
》若编译时类型和运行时类型不一致,就出现了对象的多态性(Polymorphism)
》多态情况下,“看左边”:看的是父类的引用(父类中不具备子类特有的方法)
“看右边”:看的是子类的对象(实际运行的是子类重写父类的方法)
package mk.bigdata.java4;
public class Person {
String name;
int age;
public void eat(){
System.out.println("人:吃饭");
}
public void walk(){
System.out.println("人:走路");
}
}
package mk.bigdata.java4;
public class Man extends Person{
boolean isSmoking;
public void earnMoney(){
System.out.println("男人负责挣钱养家");
}
@Override
public void eat(){
System.out.println("男人多吃肉,长肌肉");
}
@Override
public void walk(){
System.out.println("男人霸气的走路");
}
}
package mk.bigdata.java4;
public class Woman extends Person{
boolean isBeauty;
public void goShopping(){
System.out.println("女人喜欢购物");
}
@Override
public void eat(){
System.out.println("女人少吃,为了减肥");
}
@Override
public void walk(){
System.out.println("女人窈窕的走路");
}
}
package mk.bigdata.java4;
/*
* 面向对象特征之三:多态性
*
*
*1. 理解多态性:可以理解为一个事物的多种形态。
*2. 何为多态性:
* 对象的多态性:父类的引用指向子类的对象
*
*3. 多态的使用:虚拟方法调用
* 有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是
* 子类重写父类的方法。
* 总结:编译,看左边;运行,看右边。
*
*
*4.多态性的使用前提:① 类的继承关系 ② 要有方法的重写
*
* */
public class PersonTest {
public static void main(String[] args) {
Person p1 = new Person();
p1.eat();
Man man = new Man();
man.eat();
man.age = 25;
man.earnMoney();
//*****************************************
//对象的多态性:父类的引用指向子类的对象
Person p2 = new Man();
System.out.println("***************************");
//多态的使用:当调用子父类 同名同参数的方法时,实际执行的是子类重写父类的方法--虚拟方法调用
p2.eat();
p2.walk();
// p2.earnMoney();
// Person p3 = new Woman();
}
}
//***********************************************************
测试
package mk.bigdata.java4;
import java.sql.Connection;
/*
* 多态性的使用举例一:
*
*
* */
public class AnimalTest {
public static void main(String[] args) {
AnimalTest test = new AnimalTest();
test.func(new Dog());
test.func(new Cat());
}
public void func(Animal animal){// Animal animal = new Dog();
animal.eat();
animal.shout();
}
// public void func(Dog dog){
// dog.eat();
// dog.shout();
// }
//
//
// public void func(Cat cat){
// cat.eat();
// cat.shout();
// }
}
class Animal{
public void eat(){
System.out.println("动物:进食");
}
public void shout(){
System.out.println("动物:叫");
}
}
class Dog extends Animal{
public void eat(){
System.out.println("狗吃骨头");
}
public void shout(){
System.out.println("汪汪汪");
}
}
class Cat extends Animal{
public void eat(){
System.out.println("猫吃鱼");
}
public void shout(){
System.out.println("喵!喵喵");
}
}
//举例二:
class Order{
public void method(Object obj){
}
}
//举例三:
class Driver{
public void doData(Connection conn){//conn = new MySQLConnection() //con = new Oracle()
//规范的步骤去操作数据
conn.method1();
conn.method2();
conn.method3();
}
}