Java多态性(包含instanceof关键字)

目录

一、何为多态性

二、多态的使用

2.1多态性使用的前提

三、多态的应用举例

四、多态和重载的区别

五、下向下转型和instanceof关键字的使用

5.1向下转型的应用举例 


一、何为多态性

        多态性可以理解为一个事物的多种态性。在Java中指的是对象的多态性:父类的引用指向子类的对象(或子类的对象赋值给父类的引用)。

二、多态的使用

        有了对象多态性后,在编译期间,只调用父类声明的方法,但在执行期实际执行的是子类重写父类的方法。(简称:编译时,看左边,运行时看右边)

在多态的情况下:

①“看左边”:看的是父类引用(父类中不具备子类特有的方法)

②“看右边”:看到是子类的对象(实际运行的是子类重写父类的方法)

需要注意的是:对象的多态性,只适用于方法,不适用于属性

2.1多态性使用的前提

①要有类的继承关系

②要有方法的重写

三、多态的应用举例

        创建一个Animal类作为父类,再创建Dot类、Cat类作为子类。

在Animal类之中定义eat方法和shout方法,并在子类中分别进行重写。

package cn.polymorphism.contact;

class Animal {
	
	public void eat() {
		System.out.println("动物吃东西");
	}
	
	public void shout() {
		System.out.println("动物的叫声");
	}
}

class Dot extends Animal{
	
	public void eat() {
		System.out.println("狗吃骨头");
	}
	
	public void shout() {
		System.out.println("汪!汪!汪!");
	}
	
	public void doing() {
		System.out.println("狗看家");
	}
}

class Cat extends Animal{
	
	public void eat() {
		System.out.println("猫吃鱼");
	}
	
	public void shout() {
		System.out.println("喵!喵!喵!");
	}
	
	public void doing() {
		System.out.println("猫捉老鼠");
	}
}

         创建一个Animal的测试类Animaltest

package cn.polymorphism.contact;

public class Animaltest {
	public static void main(String[] args) {
		
		//对象的多态性,父类的引用指向子类的对象
		Animal animal1 = new Dot();   //这就是多态
		Animal animal2 = new Cat();
		
		//多态的使用,当调用子父类同名同参数方法时,实际调用的是子类重写父类的方法
		
		animal1.eat();
		animal1.shout();
		//animal1.doing();  //无法调用,因为在父类之中并没有定义这个方法(这个方法是Dot类独有的)
		
		animal2.eat();
		animal2.shout();
		//animal2.doing();  //无法调用,因为在父类之中并没有定义这个方法(这个方法是Cat类独有的)
		
	}
}

        还可以这么写 

package cn.polymorphism.contact;

public class Animaltest {
	public static void main(String[] args) {
		
		//对象的多态性,父类的引用指向子类的对象
		Animaltest animal3 = new Animaltest();//这就是多态

		animal3.funs(new Dot());
		animal3.funs(new Cat());
		
	}
	
	//还可以这么写
	public void funs(Animal animal) { 
		animal.eat();
		animal.shout();
	}
}

四、多态和重载的区别

        Java的重载是可以包括父类和子类的,即子类可以重载父类的同名不同参数的方法。对于重载而言,在方法调用之前,编译器就已经确认了所要调用的方法。(这也称之为“早绑定”或“静态绑定”)

        对于多态,只有在方法调用的那一刻,解释运行器才会确定所要调用的具体方法。(这也称之为“晚绑定”或“动态绑定”)

五、下向下转型和instanceof关键字的使用

        Instanceof是Java的保留关键字,测试左边的对象是不是右边类的实例。

例:a instanceof A 判断对象a是否是类A的实例,如果是返回true,不是放回false。

        为避免在向下转型时发生异常,在向下转型时可以配合instanceof使用,一旦放回true,则执行向下转型,放回false,则不执行向下转型。

5.1向下转型的应用举例 

package cn.polymorphism.contact;

public class Animaltest {
	public static void main(String[] args) {
		
		Animal animal4 = new Dot();
		
		//animal4.doing();  //无法调用
		
		Dot animal5 = (Dot)animal4;
		animal5.doing();
		
		//Cat animal6 = (Cat)animal4; //使用强转,可能会出现异常(这里虽然编译过了但,运行后还是报异常了)
		//animal6.doing();
		
		//这里可以使用instanceof进行强转前的判断
		
		if(animal4 instanceof Dot) {
			Dot animal6 = (Dot)animal4;
			animal6.doing();
			System.out.println("************Dot类***************");
		}
		if(animal4 instanceof Cat) {
			Cat animal6 = (Cat)animal4;
			animal6.doing();
			System.out.println("************Cat类***************");
		}
		if(animal4 instanceof Animal) {
			System.out.println("************Animal类************");
		}
		if(animal4 instanceof Object) {
			System.out.println("***********Object类*************");
		}
	}
}

 最后到这里,文章就结束了,如果在内容上有问题,恳请各位大佬指出。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值