多态详解

多态:一个对象的多种状态。例如,老王可以是老师,儿子,父亲等等身份。

几个知识点:

1、当父类和子类具有相同的非静态成员变量,那么在多态下访问的是父类的非静态成员变量;当父类和子类具有相同的静态成员变量,那么在多态下访问的是父类的静态成员变量。所以:父类和子类具有相同的成员变量,多态下访问的是父类的成员变量。

2、当父类和子类具有相同的非静态方法(就是被子类重写的父类非静态方法),多态下访问的是子类的非静态成员方法。

3、当父类和子类具有相同的静态方法(就是被子类重写的父类静态方法),多态下访问的是父类的静态成员方法。

多态的前提:类与类之间有关系,继承或者实现。

多态的弊端:提高了扩展性,但是只能使用父类引用指向父类成员。

 

案例一:使用父类调用子类特有的方法

在这里需要注意类型转换:子类-->父类:自动转换     父类-->强制转换

父类Father:

public class Father {
	
	void method1(){
		System.out.println("这是父类的方法1");
	}
	
	void method2(){
		System.out.println("这是父类的方法2");
	}
}

子类Son:

public class Son extends Father{
	
	//重载父类的method1()方法
	void method1(){
		System.out.println("这是子类的方法1");
	}
	
	void method3(){
		System.out.println("这是子类的方法3");
	}
}

测试:

	public static void main(String[] args){
		Father f = new Son();
		f.method1();   //这是子类的方法1
		f.method2();   //这是父类的方法2
		//f.method3(); //编译报错
		
		//类型转换  子类-->父类:自动转换       父类-->:强制转换
		Son s = (Son)f;
		s.method3();  //这是子类的方法3
		
	}

运行结果:

案例二:使用多态作为形参,执行该动物下特有的方法

Animal类:

public class Animal {
	String color;
	Animal(){
		
	}
	
	Animal(String color){
		this.color = color;
	}
	
	void run(){
		System.out.println("跑跑");
	}
}

Dog类:

public class Dog extends Animal{
	
    Dog() {
		
	} 
	
    Dog(String color){
		super(color);
	}
	
	void run(){
		System.out.println("狗儿跑跑");
	}
	
	void protectHome(){
		System.out.println("狗儿会看家");
	}
}

Fish类:

public class Fish extends Animal{
	
	Fish() {
		
	}
	
	Fish(String color){
		super(color);
	}

	void run(){
		System.out.println("鱼儿跑");
	}
	
	void swim(){
		System.out.println("鱼儿会游泳");
	}
}

Bird类:

public class Bird extends Animal{
	
	Bird(){
		
	}
	
	Bird(String color){
		super(color);
	}
	
	void run(){
		System.out.println("鸟儿跑");
	}
	
	void fly(){
		System.out.println("鸟儿会飞");
	}
}

测试:

public class AnimalTest {
	
	public static void main(String[] args){
		
		//Animal的多态体现:Dog  Fish  Bird
		doSomething(new Dog());    //狗儿会看家
		doSomething(new Fish());   //鱼儿会游泳
		doSomething(new Bird());   //鸟儿会飞
	}
	
	//多态作为形式参数   Animal的多态体现:Dog  Fish  Bird
	public static void doSomething(Animal a){
		if(a instanceof Dog){
			//如果是狗类,则将多态形式下的Animal转换Dog
			Dog d = (Dog)a;
			d.protectHome();
		}else if(a instanceof Fish){
			//如果是鱼类,则将多态下的Animal转换为Fish
			Fish f = (Fish)a;
			f.swim();
		}else if(a instanceof Bird){
			//如果是鸟类,则将多态下的Animal转换为Bird
			Bird b = (Bird)a;
			b.fly();
		}else{
			System.out.println("over");
		}
		
	}
}

运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值