多态性,时面向对象中最重要的概念,在java种体现
- 方法的重载(overload)和重写(overwrite)
- 对象的多态--- 可以直接应用在抽象类和接口上
java 引用变量有两个类型:编译时类型和运行时类型。
编译时类型由声明该变量时使用的类型决定,
运行时类型由实际赋给该变量的对象决定。
如编译时类型和运行时类性不一致,就会出现多态(Polymorphism)
/*测试类:
* 面向对象特征三:三多态性
*
* 1.多态性指什么?多态性,可以理解为一个事物的多种表现
* 1)方法的重载与重写
* 2)子类对象的多态(只适应于方法)
* 2.子类对象多态使用前提:①要有类的继承 ②子类重写父类的方法
*
* 3.成员运行分为编译状态和运行状态
* 对于多态性来说,编译时:"看左边",将此引用变量解释为父类的类型
* 运行时,“看右边”专注于真正对象的实体,子类的对象
*
* 4.子类属性的多态性并不适用于多态性
*
*/
public class TestPerson {
public static void main(String[] args) {
Person p = new Person(); //父类属性id
p.eat();
p.walk();
man m = new man(); //子类属性id
m.eat();
m.walk();
//子类对象的多态:父类的引用指向子类对象 ,(子类对象指向父类引用)
Person p1 = new man(); //向上转型
//虚拟方法的调用,通过父类的引用指向子类实体,调用方法时,实际执行的是子类重写父类的方法
p1.eat();
p1.walk();
System.out.println("子父类属判断性的显示:"+p1.id); //打印出来的是父类属性id
man m1 = (man)p1; //向下转型
// p1.entainment();
m1.entertainment();
//instanceof
if(p1 instanceof man)
{
man m11 = (man)p1;
m11.entertainment();
}
}
public void show (Person p) {
Person p1 = new man();
}
}
public class TestDemo {
public static void main(String[] args) {
TestDemo t = new TestDemo();
t.func(new Animal());
t.func(new Dog());
t.func(new Cat()); //打印的是各自对象的方法
}
public void func (Animal a) { // Animal a = new Dog()/Cat();
a.eat();
a.jump();
}
}
class Animal{
String name;
int age;
public void eat() {
System.out.println("进食");
}
public void jump() {
System.out.println("跳");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("