Java进阶之路~多态

一.多态:一种事物的多中状态]

多态的规则(前提)

1.类和类之间,必须要有关系(继承关系)

2.必须要有方法的重写(没有重写的话,多态没有意义)

3.(核心)父类的引用(指针)指向子类的对象(子类的空间)

public class Demo01 {
	public static void main(String[] args) {
		//本类的引用(指针)指向 本类的对象(空间)
		Cat cat  = new Cat();
		cat.eat();
		
		//多态的对象创建方式
		//父类指针指向子类空间
		Animal aCat = new Cat();
		aCat.eat();		
	}
}
/*
 * * 需求: 创建 动物类 猫类 狗类
 * 都有一个吃的方法 动物类 动物吃饭
 * 				 猫   猫吃鱼
 * 				 狗   狗吃骨头
 */
class Animal{
	public void eat() {
		System.out.println("动物吃饭");
	}
}
class Cat extends Animal{
	public void eat() {
		System.out.println("猫吃鱼");
	}
}
class  Dog extends Animal{
	public void eat() {
		System.out.println("狗吃骨头");
	}
}

二.多态的使用
多态如何使用成员变量

父类的引用只能访问 子类空间中属于父类的那块空间

编译:编译时,要查看,父类中是否有这个属性,没有就报编译错误

运行:运行时,访问的是父类中这个成员变量

结论:当使用多态形式创建对象的时候,访问成员变量是,编译和运行都是看父类中的属性

多态调用成员的方法

编译:编译时,需要看父类中,是否有该方法,没有就报错,有就编译通过

运行:运行时,调用的是 子类重写父类的方法

结论:编译看父类,运行看子类

public class Demo02 {
	public static void main(String[] args) {
		//多态的创建形式
		Father fSon = new Son();
		fSon.print();
		System.out.println(fSon.num);
	
		Son son = new Son();
		son.print();
		System.out.println(son.num);
		
	}
}
class Father{
	int num = 10;
	public void print() {
		System.out.println(num);
		System.out.println("我是父类的 打印方法");
	}
}
class Son extends Father{
	int num = 20;
	@Override
	public void print() {
		System.out.println(num);
		System.out.println("我是子类的打印方法");
	}
}

三.多态的好处

1.减少代码量 提高工作效率 复用性强

相当于提高了代码的可维护性(指的是继承)

2.(核心)提高方法的扩展性

四.多态的弊端:

当使用多态的方式创建对象时,无法直接调用子类特有的方法

多态调用子类的特有方法时注意:

必须要先有向上转型才能进行向下转型

public class Demo03 {
	public static void main(String[] args) {
		//多态创建对象
		//提升了骗子的逼格
		//提升子类对象类型---向上转型
		Person p = new PianZi();
		p.speak();
		//如何调用子类的特有方法
		//把装成人的骗子打回原形
		//向下转型 --- 强制类型转换
		PianZi pZ = (PianZi)p;
		pZ.hit();
	}
}
class Person{
	public void speak() {
		System.out.println("聊天");
	}
}
class PianZi extends Person{
	@Override
	public void speak() {
		System.out.println("洗脑");
	}
	//特有方法
	public void hit() {
		System.out.println("打人 威胁人");
	}
}

猜你喜欢

转载自blog.csdn.net/T_Kuuga/article/details/80286014