2021-09-18 新手上路java:多态

目录

多态概念

多态的前提和体现

多态中成员的访问特点

        为什么成员变量个成员方法的访问不一样呢?

多态的好处和弊端

多态中的转型

向上转型

向下转型 

案例:猫和狗


多态概念

同一个对象,在不同时刻表现出的不同形态。

多态的前提和体现

  • 有继承/实现关系
  • 有方法重写
  • 有父类(动物)引用指向子类对象(猫())

如:猫

猫 cat = new 猫();

动物 animal = new 猫();

//父类
public class Animal {

    public int age = 40;    

    public void eat(){
        System.out.println("动物吃东西");
    }
}

//子类
public class Cat extends Animal{

    public int age = 29;
    public int weight = 10;

    //重写
    @Override
    public void eat(){
        System.ouut.println("猫吃鱼");    
    }
    
    public void playGame(){
        System.out.println("猫捉迷藏");
    }

}

//测试类
public class AnimalDemo{
    public static void main(String[] args){
        //有父类引用指向子类对象
        Animal a = new Cat();

        System.out.println(a.age);
//结果为40.访问到的是父类中的
//        System.out.println(a.weight);    //a.weight会报错

        a.eat();
//结果为猫吃鱼,访问到的是子类重写后的方法中的内容
//        a.playGame(); //报错
    }
}

多态中成员的访问特点

  • 成员变量:编译看左边,执行看左边;
  • 成员方法:编译看左边。执行看右边;

        为什么成员变量个成员方法的访问不一样呢?

                因为成员方法有重写,成员变量没有

多态的好处和弊端

多态中的转型

  • 向上转型

    •  从子到父
    •  父类引用指向子类对象
  • 向下转型 

    • 从父到子
    • 父类引用转为子类对象   
    • 解决了不能访问子类特有功能这一弊端

//父类
public class Animal {
    public void eat(){
        System.out.println("动物吃东西");
    }
}

//子类
public class Cat extends Animal{
    @Override
    public void eat(){
        System.ouut.println("猫吃鱼");    
    }
    
    public void playGame(){
        System.out.println("猫捉迷藏");
    }

}

//测试类
public class AnimalDemo{
    public static void main(String[] args){
        //多态 向上转型
        Animal a = new Cat();
        a.eat();
        //输出:猫吃鱼
        a.playGame(); //报错


        //向下转型
        Cat c = (Cat)a;
        c.eat();
        c.playGame(); //可用


    }
}

案例:猫和狗

public class Animal {
	private String name;
	private int age;
	
	public Animal() {
		//super();
		// TODO Auto-generated constructor stub
	}
	public Animal(String name, int age) {
		//super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	public void eat() {
		System.out.println("动物吃东西");
	}

}

public class Cat extends Animal{

	public Cat() {
		//super();
		// TODO Auto-generated constructor stub
	}

	public Cat(String name, int age) {
		super(name, age);
		// TODO Auto-generated constructor stub
	}
	
	@Override
	public void eat() {
		System.out.println("猫吃鱼");
	}
}

public class AnimalDemo {
	public static void main(String[] args) {
		//创建猫类对象进行测试
		Animal a = new Cat();
		a.setName("加菲");
		a.setAge(5);
		System.out.println(a.getName()+","+a.getAge());
		a.eat();
		
		a = new Cat("加菲",5);
		System.out.println(a.getName()+","+a.getAge());
		a.eat();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值