public static void function(Animal a){
a.eat();
}
}
二、多态的转型
class Animal{
abstract void eat();
}
class Cat extends Animal{
public void eat(){
system.out.prinln("吃鱼");
}
public void catchMouse(){
system.out.prinln("抓老鼠");
}
}
class Dog extends Animal{
public void eat(){
system.out.prinln("吃骨头");
}
public void kanJia(){
system.out.prinln("看门");
}
}
class Pig extends Animal{
public void eat(){
system.out.prinln("饲料");
}
public void gongDi(){
system.out.prinln("gongDi");
}
}
class DuoTaiDemo{
public static void main(String[] args){
Animal a = new Cat();//类型提升,向上转型。
a.eat();
//如果想要调用猫的特有方法时,如何操作?
//强制将父类的引用,转成子类类型,向下转型。
Cat c = (Cat)a;
c.catchMouse();
//千万不要出现这样的操作,就是将父类对象转成子类类型。
//我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以
//被强制转换
//Animal a = new Animal(); //这种写法就不对了,不能强制把动物转成猫
//Cat c=(Cat)a;
}
public static void function(Animal a){
a.eat();
}
}
三、多态示例
基础班学生:
学习,睡觉。
高级班学生:
学习,睡觉。
可以将这两类事物进行抽取
abstract class Student{
public abstract void study();
public void sleep(){
System.out.println("躺着睡");
}
}
class BaseStudent extends Student{
public void study(){
System.out.println("study");
}
public void sleep(){
System.out.println("裸睡");
}
}
class AdvStudent extends Student{
public void study(){
System.out.println("adv study");
}
}
class DoStudent{
public void doSomething(Student stu){
stu.study();
stu.sleep();
}
}
class DuoTaiDemo3{
public static void main(String[] args){
DoStudent ds = new DoStudent();
ds.doSomething(new BaseStudent());
ds.doSomething(new AdvStudent());
//BaseStudent ba = new BaseStudent();
//ba.study();
//ba.sleep();
//AvdStudent as = new AvdStudent();
//as.study();
//as.sleep();
}
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结:成员函数在多态调用时,编译看左边,运行看右边。
编译看左边:因为f这个引用型变量中有method1和method2,但没有method3,编译失败
运行看右边:Zi类中有method1,method2从Fu中继承了过来,所以运行结果为:
zi method_1
fu method_2
3.多态中成员变量的特点:
(1)
class Fu{
int num = 5;
void method1(){
System.out.println("fu method_1");
}
void method2(){
System.out.println("fu method_2");
}
static void method4(){
System.out.println("fu method_4");
}
}
class Zi extends Fu{
int num = 8;
void method1(){
System.out.println("zi method_1");
}
void method3(){
System.out.println("zi method_3");
}
static void method4(){
System.out.println("zi method_4");
}
}
class Test{
public static void main(String[] args) {
Fu f = new Zi();
f.method4();
}