Java中的多态

文章介绍了Java编程语言中的多态性概念,包括方法的重写和重载(方法多态),对象的多态性(父类引用指向子类对象),以及多态转型(向上和向下)。通过示例展示了如何利用多态简化代码,提高程序的扩展性。此外,还提到了instanceof关键字用于判断对象是否为特定类的实例。
摘要由CSDN通过智能技术生成

多态

概念:多种形态,在Java中同一种行为,不同的对象有不同的表现形式

例如
	对于eat(){};这个行为来说
		对象狗:吃大骨头
		对象猫:吃小鱼干
		
1 方法的多态

方法的重写和重载就叫方法的多态

class Person{
	public void eat(){
		sout("吃饭");
	}
	public void eat(String name){	
		sout(name+"吃饭");
	}
}
class Man extends Person{
	@Override	//重写
	public void eat(){		//同一个eat行为有不同的表现形式
		sout("吃鸡腿");
	}
}

public class Test{
	main(){
		
	}
}
2 对象的多态

父类的引用指向子类的对象,也可以说 子类对象赋值给父类的引用

	Animal ani = new Dog();
	父类	父类引用 =new 子类对象;

对象多态的必要条件

  • 必须有继承
  • 必须有重写
  • 父类引用只能调用子类重写的方法,不能调用子类独有的方法
class Animal{
	public void eat(){
		sout("吃饭");
	}
	
	public void play(){
		sout("玩");
	}
}
class Man extends Dog{
	@Override	//重写
	public void eat(){		
		sout("吃鸡腿");
	}
	
	public void sleep(){	//子类独有的方法
		sout("小狗卧着睡觉");
	}
}

public class Test{
	main(){
		Animal animal=new Dog();//父类引用指向子类对象
		//虽然是把Dog赋值给了Animal引用,但实际上传的只是Dog中重写Animal的部分,Dog的独有方法是Animal是不能使用的
		animal.eat();	//调用的是子类重写方法
		
		//animal.sleep();父类调用不了子类独有的方法
		animal.play();//父类可以正常使用自己的方法
		
		//父类的指向能调用的只有子类重写的方法,和自身原本的方法        
	}
}
2.1实际应用

人喂狗吃大骨头

人喂猫吃小鱼干

class Person{
//	public void feed(Dog dog){
//		dog.eat();
//	}
//	public void feed(Cat cat){
//		cat.eat();
//	}
    	//如果不用多态就要分别调用不同对象的eat方法
    	//对象种类多的话就会出现代码重复冗余的情况
    	//使用多态使程序更简洁,更具有扩展性
	public void feed(Animal animal){
        aniaml.eat();
    }
	
}

class Animal{
	public void eat(){
		
	}
}

public Dog extends Animal{
	@Override
	public void eat(){
		sout("狗吃大骨头");
	}
}
public Cat extends Animal{
	@Override
	public void eat(){
		sout("猫吃小鱼干");
	}
}

public class Test{
	main(){
        Person person=new Person();
		
        Animal animal1=new Dog();	//animal1指向Dog对象
        person.feed(animal1);
        
        animal animal2=new Cat();	//animal2指向Cat对象
        persion.feed(animal2);
	}
}
3 多态的转型
3.1 多态的向上转型

向上转型就是父类的引用指向子类的对象

	Animal ani = new Dog();
	父类	父类引用 =new 子类对象;

向上转型是 小范围转大范围 可以自动转

父类的引用可以调用父类所有方法,以及子类重写方法

Animal
	eat方法;
	sleep方法;
	play方法;
Dog extends Animal
	eat方法;		//重写
	sleep方法;	//重写
	skill方法;	//独有	
	
	Animal animal=new Dog();
	此时animal可以调用eat;sleep;play;方法
	不能调用skill方法
3.1 多态的向下转型

语法格式

	Animal animal = new Dog();
	Dog dog=(Dog) animal;
	父类	父类引用 =new 子类对象;
	子类  子类引用 = (子类) 父类引用;   强制类型转换
	Animal animal = new Dog();
	Dog dog=(Dog) animal;
//	Cat cat=(Cat) animal;	
	//此时animal是值的Dog对象,向下转型的时候必须转回原来的类
	//而不能转为Cat类
	//进去出什么,出来是什么

注:向下转型必须先向上转型

4 instanceof关键字

在Java中instanceof是一个二元运算符

判断左边对象是否是右边的实例

返回值是true或false

A instanceof B
注:A是对象	B是类

左边的辈分小于或者等于右边的备份的话就返回true

class Animal {
	
}
class Dog extends Animal {

}
public class Demo1 {
	public static void main(String[] args) {
		
		//instanceof  语法格式   A  instanceof B
		//左边放的是对象   右边放到是类
		//判断左边的对象是否是右边的类的实例(子类也算是实例)
		//左边辈分小或者平辈  右边的类 才是true
		Animal animal = new Animal();
		
		System.out.println(animal instanceof Animal);//true
		Dog dog = new Dog();
		System.out.println(dog instanceof Animal);//true
		
		Animal animal2 = new Dog();
		System.out.println(animal2 instanceof Animal);//true
		
		System.out.println(animal instanceof Dog);//false
		System.out.println(animal2 instanceof Dog);//true
        
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值