Java面向对象三大特征之多态

97 阅读3分钟

一、什么是多态

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)
		*/
	}
}

完结,撒花~