Fork me on GitHub

Java-9 面向对象(多态)

7.多态

  • 要实现多态三个前提:
1. 有继承关系。
2. 父类的引用指向子类的对象。
3. 方法的重写
  • 四种调用
同名的成员变量:用的是父类的
同名的静态方法:用的是父类的
同名成员方法: 用的是子类
无法调用子类中独有的属性和方法。
同名的静态变量:调用的是父类的
父类中独有的:用的是父类的
  • 两种转型
向上转型: Person p = new Teacher();强制类型转型。
向下转型:  Teacher t = (Teacher)p; 父类的引用指向子类的对象
  • 示例代码:
package com.xjk;

public class TestDemo {
	public static void main(String[] args) {
		Animal am = new Cat();
		am.eat();// 猫咪吃东西
		am.sleep();// 动物睡觉了
		am.run();// 动物跑了
		System.out.println(am.num);//10
		System.out.println(am.age);// 20
		am.catchMouse();// 报错 因为子类独有
		System.out.println(am.name);// 报错 因为子类独有
		Cat ct = (Cat)am; // 向下转型
		ct.sleep();// 猫在睡觉
		ct.run();// 动物跑了
		
	}
}

class Animal{
	int num = 10;
	static int age = 20;
	public void eat() {
		System.out.println("动物吃东西");
	}
	public static void sleep() {
		System.out.println("动物睡觉了");
	}
	public void run() {
		System.out.println("动物跑了");
	}
}


class Cat extends Animal{
	int num = 70;
	static int age = 90;
	String name = "Tom Cat";
	public void eat() {
		System.out.println("猫咪吃东西");
	}
	public static void sleep() {
		System.out.println("猫在睡觉");
	}
	public void catchMouse() {
		System.out.println("猫在抓老鼠");
	}
}
  • 多态练习
package com.xjk;

public class DuoTaiDemo {
	public static void main(String[] args) {
		// 用父类的引用指向子类的对象
		HenEgg jd = new HenEgg();
		DuckEgg yd = new DuckEgg();
		Eegg ed = new Eegg();
		Egg[] dan = new Egg[3];
		dan[0] = jd;
		dan[1] = yd;
		dan[2] = ed;
	}
}

// HenEgg,DuckEgg,Eegg都继承Egg
class HenEgg extends Egg{
	
}

class DuckEgg extends Egg {
	
}

class Eegg extends Egg{
	
}

class Egg{
	
}
  • 多态练习2
package com.xjk;


// 在没有多态情况下:
public class DuoTaiDemo2 {
	public static void main(String[] args) {
		// 传入Cats实例后对象
		makeCatCry(new Cats());
		makeDogCry(new Dogs());
	}
	public static void makeCatCry(Cats c) {
		c.cry();
	}
	public static void makeDogCry(Dogs d) {
		d.cry();
	}
}


class Cats{
	public void cry() {
		System.out.println("猫,在叫");
	}
}


class Dogs{
	public void cry() {
		System.out.println("狗,在叫");
	}
}

// 显然上面代码过于繁琐,当有多态情况下:
package com.xjk;

public class DuoTaiDemo2 {
	public static void main(String[] args) {
		makeAnimalCry(new Dogs());
		makeAnimalCry(new Cats());
	}
	public static void makeAnimalCry(Animals a) {
		a.cry();
	}
}

class Animals{
	public void cry() {
		
	}
}

class Dogs extends Animals{
	public void cry() {
		System.out.println("狗,在叫");
	}
}

class Cats extends Animals{
	public void cry() {
		System.out.println("猫,在叫");
	}
}
posted @   是阿凯啊  阅读(130)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示