Java多态

1.问题提出

在这里插入图片描述

abstract class Animals {
	public abstract void eat();
}

class Cat extends Animals {
	public void eat() {
		System.out.println("cat eat");
	}
}

class Dog extends Animals {
	public void eat() {
		System.out.println("Dog eat");
	}
}

class FeedPerson {
	public void Feed(Dog g) {
		g.eat();
	}

	public void Feed(Cat c) {
		c.eat();
	}
}

public class EatDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		FeedPerson fb = new FeedPerson();
		Cat c = new Cat();
		Dog g = new Dog();
		fb.Feed(c);
		fb.Feed(g);
	}

}


常规做法,我们先创建一个抽象类动物类,再让猫狗类继承动物类,实现动物类中的抽象方法

但是,问题来了!
如果我们有很多种动物,猪狗兔子狮子,我们是不是要在工具类FeedPerson中添加那么多的Feed方法呢?

这时,我们本场的主角出场了多态

abstract class Animals {
	public abstract void eat();
}

class Cat extends Animals {
	public void eat() {
		System.out.println("cat eat");
	}
}

class Dog extends Animals {
	public void eat() {
		System.out.println("Dog eat");
	}
}

class FeedPerson {
	/*public void Feed(Dog g) {
		g.eat();
	}

	public void Feed(Cat c) {
		c.eat();
	}*/
	public void Feed(Animals a) {
		a.eat();
	}
}

public class EatDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		FeedPerson fb = new FeedPerson();
//		Cat c = new Cat();
//		Dog g = new Dog();
		
		Animals c = new Cat();
		Animals g = new Dog();
		fb.Feed(c);
		fb.Feed(g);
	}

}

2.多态的体现

  1. 有继承关系
  2. 有方法重写
  3. 有父类指向子类对象

3. 成员访问特点

  • 成员变量

    编译看左边,运行看左边

  • 成员方法

    编译看左边,运行看右边

  • 静态方法

    编译看左边,运行看左边
    所以说静态方法不能算方法的重写

看左边看右边???什么意思??看代码


class Fu
{	
	int age = 44;
	public void show()
	{
		System.out.println("fu show");
	}
	public void method()
	{
		System.out.println("fu method");
	}
}

class Zi extends Fu
{	
	int age = 18;
	public void show()
	{
		System.out.println("zi show");
	}

	public void method()
	{
		System.out.println("zi method");
	}
}
class Test
{
	public static void main(String[] args)
	{
		Fu f = new Zi();	
		/*
		成员方法
		*/
		//f.method();	//编译看有左边,由于Fu中没有mechod()方法所有抱错
		f.show();		//运行看右边,输出Zi类的show方法
		/*
		成员变量
		*/
		System.out.println(f.age);	//运行看有左边,执行看左边,输出44
		
	}
}

OutPut:
	zi show
	44

  • 向上转型

从子到父
父类引用指向子类对象
Animal a = new Cat();

  • 向下转型

从父到子
父类引用转为子类对象
Cat c = (Cat)a; //(Cat)Animal a

  • 如何判断转型是否正确

从右往左读,看是否通顺
class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}
Animal p0 = new Animal();
Dog p1 = new Dog ();
Cat p2 = new Cat ();
Animal p3 = new Dog ();
Animal p4 = new Cat ();

p0 = p1; //Animal p0 = Dog p1 🐖猪是动物 true
p1=p0 // Dog p1 = Animal p0 动物是🐖 猪false
p1 = p2; //Dog p1 = Cat p2 🐱猫是🐕狗 false
p1 = (Dog)p3; //Animal向下转型true
p2 = (Cat)p4; //Animal向下转型true

4.执行顺序

执行顺序例子:

```java
class A {
	public void show() {
		show2();
	}
	public void show2() {
		System.out.println("我");
	}
}
class B extends A {
	/*
	public void show() {
		show2();
	}
	*/

	public void show2() {
		System.out.println("爱");
	}
}
class C extends B {
	public void show() {
		super.show();
	}
	public void show2() {
		System.out.println("你");
	}
}
public class DuoTaiTest4 {
	public static void main(String[] args) {
		A a = new B();
		a.show();	
		//B的show方法->没有
		//->找父类A的show方法->找B的show2方法(而不是找A的,优先找自己的)->爱
		
		B b = new C();
		b.show();
		//同理C的show方法->找父类A的show方法->C的show2方法

	}
}
/*
输出:
爱
你
*/

拓展

静态代码块,构造代码块,成员方法代码块,优先级执行顺序如何?

package Duotai;
/*
 * 静态代码块
 * 构造代码块
 * 构造方法
 * 执行顺序*/
class AA{
	static {
		System.out.println("static block");
	}
	
	{
		System.out.println("construct block");
	}
	public AA(){
		System.out.println("AA");
	}
}
class BB extends AA{
	static {
		System.out.println("static block");
	}
	
	{
		System.out.println("construct block");
	}
	public BB(){
		System.out.println("BB");
	}
}
public class Fellow {
	public  static  void main(String[] args) {
		BB b = new BB();
	}
}
/*
Astatic block
Bstatic block
Aconstruct block
AA
Bconstruct block
BB
*/

可见静态代码块优先于所有代码块,且父类优先于子类,构造代码块其次
,构造方法最后

5.小结

多态提高了程序的扩展性,但是父类不能调用子类特有的功能

Java多态指的是同一个方法名可以根据不同的对象调用出不同的行为。具体来说,多态是一种面向对象编程的特性,实现多态的方式主要有两种:方法重载和方法覆盖。方法重载指的是在一个类中定义多个同名方法,但这些方法有不同的参数列表,编译器会根据参数列表的不同选择合适的方法进行调用。方法覆盖指的是子类重写父类的方法,使得在使用父类对象调用该方法时,实际调用的是子类中的方法。 多态的好处在于,它可以提高代码的灵活性和可扩展性。通过多态,我们可以为不同的对象提供不同的行为,从而使得程序更加具有扩展性。此外,多态还可以让程序的调用更加简洁、清晰,提高了代码的可读性和可维护性。 下面是一个简单的Java多态的例子: ```Java class Animal { public void makeSound() { System.out.println("动物发出声音"); } } class Cat extends Animal { public void makeSound() { System.out.println("猫发出“喵喵”的声音"); } } class Dog extends Animal { public void makeSound() { System.out.println("狗发出“汪汪”的声音"); } } public class PolymorphismExample { public static void main(String[] args) { Animal animal1 = new Animal(); Animal animal2 = new Cat(); Animal animal3 = new Dog(); animal1.makeSound(); // 动物发出声音 animal2.makeSound(); // 猫发出“喵喵”的声音 animal3.makeSound(); // 狗发出“汪汪”的声音 } } ``` 在上面的例子中,Animal是一个父类,Cat和Dog是Animal的子类。Animal类中定义了一个makeSound()方法,Cat和Dog类分别重写了这个方法。在main()方法中,我们创建了三个Animal类型的对象,并分别调用它们的makeSound()方法。由于animal2和animal3都是Animal类型的对象,但实际上它们分别是Cat和Dog类型的对象,因此在调用它们的makeSound()方法时,实际上是调用了它们各自的实现,也就是Cat类和Dog类中重写的makeSound()方法。这就是Java多态的表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值