多态
概念:多种形态,在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
}
}