一、什么是多态
Java中面向对象的三大特征:封装, 继承, 多态
多态,通俗来讲就是多种形态。在Java中完成某一个行为,不同的对象去完成会有不同的效果。
二、方法的多态
方法的重写和重载就叫方法的多态,举个例子:
package yanshi_01;
class Person{
public void eat() {
System.out.println("吃饭");
}
public void eat(int i) {//eat()方法的重载
System.out.println("一天吃"+i+"顿饭");
}
}
class Man{
public void eat() {//eat()方法的重写
System.out.println("菜肉蛋营养均衡");
}
}
public class Test01 {
public static void main(String[] args) {
}
}
三、对象的多态
父类的引用指向子类的对象,或者说是,子类的对象赋值给了父类的引用
Animal animal = new Dog();
1.必须有继承关系
2.必须重写父类的方法
3.父类的引用就可以调用子类中重写的方法,但不能调用子类中独有的方法
举个例子:
package yanshi_01;
class Animal{
public void eat() {
System.out.println("吃东西");
}
public void work() {
System.out.println("工作");
}
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃大骨头");
}
public void sleep() {
System.out.println("卧着睡");
}
}
public class Test01 {
public static void main(String[] args) {
Animal animal = new Dog();
animal.eat();//狗吃大骨头,是子类中重写的方法
animal.work();//工作
//animal.sleep();//报错:The method sleep() is undefined for the type Animal
//父类的引用调用不了子类独有的方法
}
}
四、多态在开发中的应用
举一个例子:
人喂狗 狗吃大骨头
人喂猫 猫吃鱼
package yanshi_01;
class Person{
// public void feed(Dog dog) {
// dog.eat();
// }
// public void feed(Cat cat) {
// cat.eat();
// }
public void feed(Animal animal) {
//方法的参数是父类的引用 实际的参数是Dog和Cat 子类的真实对象
animal.eat();
}
}
class Animal{
public void eat() {
System.out.println("吃饭");
}
}
class Dog extends Animal{
public void eat() {
System.out.println("狗吃大骨头");
}
}
class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
public class Test01 {
public static void main(String[] args) {
Person person = new Person();
Animal animal = new Dog();
person.feed(animal);//狗吃大骨头
Animal animal2 = new Cat();
person.feed(animal2);//猫吃鱼
}
}
接口也可以实现多态
package yanshi_01;
class Person{
// public void feed(Dog dog) {
// dog.eat();
// }
// public void feed(Cat cat) {
// cat.eat();
// }
public void feed(Animal animal) {
//方法的参数是父类的引用 实际的参数是Dog 和Cat 真实的对象
animal.eat();
animal.drink();
}
}
interface Animal{//接口
public void eat();
public void drink();
}
class Dog implements Animal{
public void eat() {
System.out.println("狗吃大骨头");
}
public void drink() {
System.out.println("狗喝啤酒");
}
}
class Cat implements Animal{
public void eat() {
System.out.println("猫吃鱼");
}
public void drink() {
System.out.println("猫喝牛奶");
}
}
public class Test01 {
public static void main(String[] args) {
Person person = new Person();
Animal animal = new Dog();
person.feed(animal);
Animal animal2 = new Cat();
person.feed(animal2);
}
}
五、多态的转型【重点】
1.向上转型
就是父类的引用指向子类的对象(就是前面第三点,对象的多态情况)
语法格式:‘
父类 父类的引用 = new 子类();
向上转型是自动转的 小范围(子类)转为大范围(父类)是可以自动转的
父类的引用可以调用父类所有的方法,但是不能调用子类中独有的方法,最终的调用结果看的是子类中重写的方法
举个例子:
package yanshi_01;
class Person{
public void eat() {
System.out.println("吃饭");
}
}
class Student extends Person{
@Override
public void eat() {
System.out.println("吃营养餐");
}
}
public class Tester {
public static void main(String[] args) {
Person person = new Student();//向上转型 父类的引用指向子类的对象
person.eat();
}
}
2.向下转型
多态的向下转型(很少用)
语法格式:
父类 父类的引用 = new 子类();
子类 子类的引用 = (子类)父类的引用; //强制类型转换
想用 向下转型 的话,必须先 向上转型
举个例子:
package yanshi_01;
class Animal{
public void eat() {
System.out.println("吃东西");
}
}
class Dog extends Animal{
public void eat() {
System.out.println("狗吃香肠");
}
public void sleep() {
System.out.println("狗卧着睡");
}
}
class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃老鼠");
}
public void play() {
System.out.println("猫玩线球");
}
}
public class Tester {
public static void main(String[] args) {
Animal animal = new Dog();//父类 父类的引用 = new 子类();向上转型
//向下转型 子类 子类的引用 = (子类)父类的引用;
Dog dog = (Dog)animal;//强转 在强转时一定先向上转 然后再向下转才不会报错
dog.eat();
dog.sleep();//可以调用子类独有的sleep();
// Animal animal2 = new Animal();
// Dog dog2 = (Dog)animal2;
/**以上是错误的代码
Exception in thread "main" java.lang.ClassCastException: yanshi_01.Animal cannot be cast to yanshi_01.Dog
at yanshi_01.Tester.main(Tester.java:34)
*/
}
}
完结,撒花~