方法或者对象有多种形态。是建立在封装和继承的基础之上的。
1、通过传入不同的参数,就会调用不同的方法。就体现了多态。
2、方法的重写也体现多态。首先要明白什么是重写的范围,是在子类与父类之间,所以我们可以使用不同的对象来调用方法。此时方法也是一样的,只是调用方法的对象不同罢了。
3、对象的多态
(1)一个对象的编译类型(javac)和运行类型(java)可以不一致。
一个父类的引用既可以指向父类本身,也可以指向子类。
运行结果要看运行类型是哪个类,执行哪个方法重写。
Animal ainimal = new Dog(); 父类引用指向子类对象。
(2)编译类型在定义对象时,就确定了,不能改变。
ainimal = new Cat(); 编译类型依然是animal,而运行类型是Cat()。
【前面已经建立过animal了】
(3)运行类型是可以变化的
(4)编译类型看定义 = 号的左边,运行类型 看 = 号的右边

public class Test {
public static void main(String[] args) {
Master sai = new Master("wangs");
//Cat cat = new Cat("小花猫");
Fish fish = new Fish("鲫鱼",12);
Animal cat = new Cat("小花猫");
sai.feed(cat,fish);
System.out.println("==========");
Pig pig = new Pig("姑娘");
Rice rice = new Rice("香喷喷的米饭");
sai.feed(pig,rice);
}
}
public class Master {
String name;
public Master(String name) {
this.name = name;
}
//编译类型是Animal,可以指向Animal子类的对象。
public void feed(Animal animal,Food food){
System.out.println("主人" + name + "要去喂" + animal.getName() + "吃" + food.getName() );
}
}
public class Food {
private String name;
public Food(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Fish extends Food {
int price;
public Fish(String name, int price) {
super(name);
this.price = price;
}
//为什么要这一步就是因为要调用父类相同的属性完成初始化,减少代码的编写,
//提高代码的运行效率。千万别忘记了继承的本质啊。父类有的属性我子类就不用再次调用。
//父类有的方法我就可以直接引用啦。
//调用父类的属性完成初试化,这一点很好,效率高,要是子类还有特有的属性呢?
//这样的话就会用到super(),用super完成对子类和父类共有的属性进行初始化,同时子类的构造器
//就会引入特有的属性,完成初始化。智能的设备就直接给你赋值好了初始化。
//最后就是你只需要完成对属性的定义和对对象本身初试化别忘记就行。
}
public class Bond extends Food {
public Bond(String name) {
super(name);
}
}
public class Rice extends Food {
public Rice(String name) {
super(name);
}
}
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Cat extends Animal {
public Cat(String name) {
super(name);
}
//为什么animal.getname();是在这里执行,而这里没有getName()方法
//却能够进行执行呢,还是因为继承啊,子类可以使用父类的方法啊。
}
public class Pig extends Animal {
public Pig(String name) {
super(name);
}
}


多态的向上转型:【简单化理解这种名词】
(1)父类的引用指向子类的对象
(2)编译类型看左边,运行类型看右边。你要是理解新建立对象的过程就很好理解了。
(3)可以调用父类中的所有成员 【需要遵守访问权限】,但不能调用子类的特有成员,其实只能调用子类的重写的方法啦,要是想调用子类的特有方法,还需要向下转型。【父类的引用指向子类的对象,虽然是这样但是你还是不能用特有的方法】
(4)最终的运行结果还是要看子类的运行结果。还是从子类开始查找方法。从下往上查找方法。【有点像构造器的初试化】
多态的向下转型:【简单化理解这种名词】
(1)子类类型 引用名 = (子类类型)父类引用
Cat cat = (Cat) animal;
(2)只能强转父类的引用,不能强转父类的对象。【理解对象的创建机制】
(3)要求父类的引用必须指向当前目标类型的对象
(4)向下转型后,可以调用子类类型中的所有成员。
向上转型是为了多态,向下转型是为了调用子类的特有属性和方法。
1、属性没有重写之分。属性的值是看编译类型 和 方法是不同的。【属性是属性,方法是方法,在这里是不一样的】
2、instanceof 比较操作符,用于判断对象的类型是否为XX类型或者XX类型的子类型。是判断对象的。
要注意:加载子类信息的时候,要先加载父类的属性,然后再加载子类的属性。
属性看编译类型,方法看运行类型[实际指向哪一个空间]。
本文探讨Java中的多态性,涉及传参多态、方法重写、对象多态,以及向上转型和向下转型的概念。通过实例解析如何在Master类中实现多态喂食操作,以及编译类型和运行类型的区别。
200

被折叠的 条评论
为什么被折叠?



