Java多态

Java多态

Java基础学习多态的笔记。

文章目录

  • Java多态
    • 多态
      • 1,介绍
      • 2, instanceof操作符
      • 3,作用
    • 例子

多态

要实现多态类与类之间必须存在继承关系;
多态就是创建父类引用指向子类对象表现不同身份;
如:

//父类Person
public class Person {
     
    public void eat(){
     
        System.out.println("人都会吃饭!");
    }
}
//Teacher类继承Person类  
public class Teacher extends Person {
     
	public void eat(){
     
        System.out.println("老师吃饭没有准时间!");
    }
    public void teach() {
     
        System.out.println("老师会教课!");
    }
}
//Consumer类继承Person
public class Consumer extends Person {
     
    public void buy() {
     
        System.out.println("买东西做饭!");
    }
}

1,介绍

Person p = new Teacher();(父类引用指向子类对象)
相当于你告诉你的朋友说这个人是老师,但现在不再课堂上,只能执行作为人所有的方法,并不能执行作为老师时特有的方法;要创建老师的环境才能执行作为老师的方法(向下转型);

现在只能调用父类中存在的方法
p.eat();
执行的结果:
老师吃饭没有准时间!
子类重写了父类方法则执行子类;没有重写则执行父类。

Teacher t = (Teacher)p;(创造当老师的条件/向下转型)
可以调用父类和子类中的方法
t.eat();(子类重写了父类方法则执行子类;没有重写则执行父类)
t.teacher();(子类特有的方法)
执行结果:
老师吃饭没有准时间!
老师会教课!

Person p = new Consumer();
现在只能执行父类中存在的方法
p.eat();(子类重写了父类方法则执行子类;没有重写则执行父类)
执行的结果:
人都会吃饭!

Consumer c = (Consumer)p;(向下转型)
可以调用
c.eat();(子类重写了父类方法则执行子类;没有重写则执行父类)
c.buy();
执行的结果:
人都会吃饭!
买东西做饭!

2, instanceof操作符

a instanceof b 是指判断a指向的对象是否是b类的一个实例对象。
如:
Person p = new Teacher();(父类引用指向子类对象)
p instanceof Teacher 判断p指向的对象是否为Teacher类的一个实例对象 (这个老师是个老师);若是输出为真不是输出为假。
p instanceof Consumer (这个老师是个消费者?) 这个为假。Teacher类与Consumer类没有关系。

3,作用

//一个测试类Test
public class Test {
     
	//写一个方法,传入一个父类引用执行不同的效果
    public static void doWhat(Person p){
     
        if(p instanceof Teacher){
     //如果p指向的对象是否为Teacher类的一个实例对象
            Teacher t = (Teacher)p;//向下转型
            t.eat();
            t.teach();
        }
        if(p instanceof Consumer){
     //如果p指向的对象是否为Consumer类的一个实例对象
            Consumer c = (Consumer)p;//向下转型
            c.eat();
            c.buy();
        }
    }

    public static void main(String[] args){
     
        Person p = new Consumer();
        doWhat(p);
        Person p1 = new Teacher();
        doWhat(p1);
    }
}

执行结果:
人都会吃饭!
买东西做饭!
老师吃饭没有准时间!
老师会教课!

例子

人养宠物

//宠物类
public class Pet(){
     
	public void eat(){
     
		System.out.println("宠物吃东西");
	}
}
//宠物猫类继承宠物类
public class Cat extends Pet{
     
	public void eat(){
     
		System.out.println("猫在吃鱼");
	}
}
//宠物狗类继承宠物类
public class Dog extends Pet{
     
	public void eat(){
     
		System.out.println("狗在吃狗粮");
	}
}
//主人类
public class Person{
     
	//主人给宠物喂东西吃
	public void feed(Pet pet){
     
		pet.eat();
	}
}
//测试类
public class Demo{
     
	Person person = new Person();//创建主人类
	Pet pet = new Cat();//父类引用指向子类对象
	person.feed(pet);
	Pet pet1 = new Dog();
	person.feed(pet1);
}

/*执行结果:
猫在吃鱼
狗在吃狗粮
*/

//添加宠物鱼继承宠物类
public class Fish extends Pet{
     
	public void eat(){
     
		System.out.println("鱼吃鱼食");
	}
}

//在测试类主人可以直接养鱼而不改变其它类
public class Demo{
     
	Person person = new Person();//创建主人类
	Pet pet = new Cat();//父类引用指向子类对象
	person.feed(pet);
	Pet pet1 = new Dog();
	person.feed(pet1);
	Fish fish = new Fish();
	person.feed(fish);
}
//Fish fish = new Fish();
//person.feed(fish);
/*执行结果:
猫在吃鱼
狗在吃狗粮
鱼吃鱼食
*/

你可能感兴趣的:(笔记,java)