1. 多态(Polymorphism):

    我们说子类就是父类,因此多态的意思就是:父类型的引用可以指向子类的对象

public class PolyTest {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Flower rose = new Rose();//多态,  子类就是父类,父类型的引用可以指向子类的实例,或者对象
		rose.sing();
	}

}
class Flower {
	public void sing(){
		System.out.println("flower is sing");
	}
}
class Rose extends Flower{
	
}

方法重写可以决定多态,方法重载不能决定多态

2.父类型的引用可以指向子类型的引用,当父类调用子类的方法时候,必须保证子类型中有当前是用的方法

Parent p = new Child();当使用多态的方法时,首先检查父类中是否有sing()方法,如果没有则变异错误,如果有,再去调用子类的sing()方法

下面错误类型

public class PolyTest {
		public static void main(String[] args) {
//			Parent parent = new Parent();
//			parent.sing();
			
//			Child child = new Child();
//			child.sing();
			
			Parent p = new Child();
			p.sing();
			
		}
}
class Parent{
	/*public void sing(){
		System.out.println("parent is running");
	}*/
}
class Child extends Parent{
	public void sing(){
		System.out.println("child is running");
	}
}

3.向下的类型的转换

public class PolyTest2 {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Animal a = new Dog();
		Dog dog = (Dog)a;
		dog.sing();
	}

}
class Animal{
	public void sing(){
		System.out.println("animal is sing");
	}
}
class Dog extends Animal {
	public void sing(){
		System.out.println("dog is sing");
	}
}

多态是运行期的行为,而不是编译是的行为

3.一共有两种类型的强制类型转换:

  1.向上类型转换(upcast):比如说将Cat类型转换成Animal类型,即将子类型转换为父类型。向上的类型转换不需要显式制定

  2.向下类型转换(downcast):比如将animal类型转换为Cat类型。即将父类型转换为子类型。对于向下类型转换,必须要显式指定(必须要使用强制类型)

package com.yuanzijian01;

public class PolyTest2 {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
	/*	Animal a = new Dog();
		Dog dog = (Dog)a;
		dog.sing();
		
		Animal b = new Cat();
		Cat c = (Cat)b;
		c.sing();
		*/
		
	/*
		Animal animal1= new Cat();
		Animal animal2= new Animal();
		
		animal2 = animal1;
		animal2.sing();
    */
	/*
		Animal animal1= new Cat();
		Animal animal2= new Animal();
		
		animal1 = animal2;
		animal1.sing();
	*/
	/*
		Cat cat = new Cat();
		Animal animal = cat;
		animal.sing();
	*/
	/*
		Animal animal = new Animal();
		Cat cat = (Cat)animal;
		错误的指向,指向谁,才能够转化谁
	*/  
		//向上的类型转换
	    Cat	cat = new Cat();
		Animal animal = (Animal)cat;
		animal.sing();
		
		//向下类型转换
		Animal a = new Cat();
		Cat c = (Cat)a;
		c.sing();
		
	}

}
class Animal{
	public void sing(){
		System.out.println("animal is sing");
	}
}
class Dog extends Animal {
	public void sing(){
		System.out.println("dog is sing");
	}
}
class Cat extends Animal{
	public void sing(){
		System.out.println("cat is sing");
	}
}