多态:
类与类之间相互转型分为:向上转型和向下转型,其转型类型必须是继承关系;
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类型,大的范围数据赋值给范围小的数据这叫向下转型,即强制转换!