多态:    

          类与类之间相互转型分为:向上转型和向下转型,其转型类型必须是继承关系;

                  1)向上转型(自动转换):子类对象转为父类,父类可以是接口。公式:

                        Father f = new Son();Father是父类或接口,son是子类。

                        父类的引用指向了子类的对象时:只能调用父类的属性和方法以及只能调用子类重写父类的方法

                       利弊:丢失子类独有的方法,提高代码的简洁性即避免重复性的代码

 

                   2)向下转型(强制转换):父类对象转为子类。公式:Son s = (Son)f;

                        注释:1)只有先经过向上转型的对象才能继续向下转型

                                   2)直接向下转型,编译不会出错,运行时会出现异常  :   java.lang.ClassCastException

                                   3)向下转型的利弊:拾回子类独有的方法,程序易出异常

 

class Pet {
	// 方法
	public void eat() {
		System.out.println("宠物正在吃东西。。。。。。");
	}
}

class Dog extends Pet {
	public void eat() {
		System.out.println("狗正在啃骨头......");
	}

	public void play() {
		System.out.println("狗正在玩飞盘。。。。。");
	}
}

class Cat extends Pet {
	public void eat() {
		System.out.println("猫正在吃鱼。。。。。");
	}

	public void catching() {
		System.out.println("猫正在抓老鼠......");
	}
}

class Cow extends Pet {
	public void eat() {
		System.out.println("牛正在吃草。。。。。");
	}
}

 /*//方法1: 
class Master { 
	// 方法:喂养狗 
	public void feed(Dog dog) {
		dog.eat();
	}
  
 // 方法:喂养猫
	public void feed(Cat cat) {
		cat.eat();
	}
	public void feed(Cow cow) {
		cow.eat();
	}
}*/

// 方法2:
class Master {
	public void feed(Pet pet) {
		pet.eat();
	}
}

 /* 1)方法2比方法1代码简洁,运行其结果一样 
    2)程序运行走向先跳转到父类eat方法,若子类重写了父类的eat方法,则子类覆盖父类方法
    3) 这里的代码简洁和向上转型所说的简洁性没有任何关系,向上转型所说的简洁性指的是父类的引用类型 
           变量指向了子类的实例对象,父类方法可以被子类多次重复性使用.
*/
 


  /*//测试1
public class Test {
	public static void main(String[] args) {
		Master m =new Master(); 
		Dog d = new Dog();// 创建狗对象
		
		// 主人喂养宠物
		m.feed(d);
		m.feed(new Cat());
		m.feed(new Cow()); 
	}
}*/


// 测试2
public class Test {
	public static void main(String[] args) {
		Pet p = new Dog(); // 向上转型
		// p.play(); //出现编译错误,父类类型不能访问子类独有属性或方法

		Dog d = (Dog) p;
		d.play();// 此时就可以使用引用名称d访问狗中的play方法

		 //Cat c=(Cat)p;//直接向下转型抛出:java.lang.ClassCastException: c.catching();
		 
		 //在进行向下转移之前必须要进行向上转移,再进行向下转移

		p = new Cat();

		if (p instanceof Cat) {
			Cat cat = (Cat) p;
			cat.catching();
		}
		   //instanceof判断一个引用类型变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例
		      //在已经进行了向上转移并代码编译不报错时,无需instanceof判断
	}
}

 

基本数据类型转换:

                             int a =3;
                             long b =a;向上转型
                             short c=(short)a;向下转型

         int数据类型a赋值给范围大的long类型,小的范围数据赋值给范围大的数据这叫向上转型,即自动转换!

         int数据类型a赋值给范围小的short类型,大的范围数据赋值给范围小的数据这叫向下转型,即强制转换!