Java学习 - 黑马(第二部分) - 随堂笔记 - 03_多态
1. 多态
1.1 多态概述
同一个对象,在不同时刻表现出来的不同形态
举例:猫
我们可以说猫是猫:猫 cat = new 猫();
我们也可以说猫是动物:动物 animal = new 猫();
这里猫在不同的时刻表现出来了不同的形态,这就是多态
多态的前提和体现
1.2 多态中成药访问特点
- 成员变量:编译看左边,执行看左边
- 成员方法:编译看左边,执行看右边
为什么成员变量和成员方法的访问不一样呢?
package com.itheima_01;
public class Animal {
public int age = 4;
public void eat(){
System.out.println("动物吃东西。");
}
}
package com.itheima_01;
public class Cat extends Animal{
public int age = 2;
public int weight = 10;
@Override
public void eat() {
System.out.println("猫吃鱼。");
}
public void playGame(){
System.out.println("猫捉迷藏。");
}
}
package com.itheima_01;
public class AnimalDemo {
public static void main(String[] args) {
//有父类引用指向子类对象
Animal a = new Cat();
System.out.println(a.age);
//System.out.println(a.weight);//报错
a.eat();
//a.playGame;//报错
}
}
1.3 多态的好处和弊端
- 多态的好处:提高了程序的扩展性
- 具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作
- 多态的弊端:不能使用子类的特有功能
package com.itheima_02;
public class Animal {
public void eat(){
System.out.println("动物吃东西。");
}
}
package com.itheima_02;
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头。");
}
public void lookDoor(){
System.out.println("狗看门。");
}
}
package com.itheima_02;
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼。");
}
}
package com.itheima_02;
public class Pig extends Animal{
@Override
public void eat() {
System.out.println("猪吃白菜。");
}
}
package com.itheima_02;
//动物操作类
public class AnimalOperator {
/*
public void useAnimal(Cat c){//Cat c = new Cat();
c.eat();
}
public void useAnimal(Dog d){//Dog d = new Dog();
d.eat();
}
*/
public void useAnimal(Animal a){
//Animal a = new Cat();
//Animal a = new Dog();
a.eat();
//a.lookDoor;//报错
}
}
package com.itheima_02;
public class AnimalDemo {
public static void main(String[] args) {
//创建动物操作类对象,调用方法
AnimalOperator ao = new AnimalOperator();
Cat c = new Cat();
ao.useAnimal(c);
Dog d = new Dog();
ao.useAnimal(d);
Pig pig = new Pig();
ao.useAnimal(pig);
}
}
1.4 多态中的转型
package com.itheima_03;
public class Animal {
public void eat(){
System.out.println("动物吃东西。");
}
}
package com.itheima_03;
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼。");
}
public void playGame(){
System.out.println("猫捉迷藏。");
}
}
package com.itheima_03;
import com.itheima_01.Animal;
import com.itheima_01.Cat;
public class AnimalDemo {
public static void main(String[] args) {
//父类引用指向子类对象-向上转型
Animal a = new Cat();
a.eat();
//a.playGame;//报错
//创建Cat类的对象
// Cat cat = new Cat();
// cat.eat();
// cat.playGame();
//向下转向
Cat c = (Cat)a;
c.eat();
c.playGame();
}
}
1.5 多台转型内存图解
案例:猫和狗
需求:请采用多态的思想实现猫和狗的案例,并在测试类中进行测试
思路:
- 定义动物类(Animal)
- 成员变量:姓名,年龄
- 构造方法:无参,带参
- 成员方法:get/set方法,吃饭()
- 定义猫类(Cat),继承动物类
- 构造方法:无参,带参
- 成员方法:重写吃饭()
- 定义狗类(Dog),继承动物类
- 构造方法:无参,带参
- 成员方法:重写吃饭()
- 定义测试类(AnimalDemo),写代码测试
package com.itheima_04;
public class Animal {
private String name;
private int age;
public Animal() {
}
public Animal(String name, int age) {
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("动物吃东西。");
}
}
package com.itheima_04;
public class Cat extends Animal{
public Cat() {
}
public Cat(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("猫吃鱼。");
}
}
package com.itheima_04;
public class Dog extends Animal {
public Dog() {
}
public Dog(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("狗吃骨头.");
}
}
package com.itheima_04;
public class AnimalDemo {
public static void main(String[] args) {
//创建猫类对象,并进行测试
Animal c1 = new Cat();
c1.setName("加菲猫");
c1.setAge(5);
System.out.println(c1.getName() + "," + c1.getAge());
c1.eat();
System.out.println("-------------");
c1 = new Cat("噬元兽", 100);
System.out.println(c1.getName() + "," + c1.getAge());
c1.eat();
System.out.println("==================");
//创建狗类对象,并进行测试
Animal d1 = new Dog();
d1.setName("高飞");
d1.setAge(2);
System.out.println(d1.getName() + "," + d1.getAge());
d1.eat();
System.out.println("---------------");
d1 = new Dog("八公",12);
System.out.println(d1.getName() + "," + d1.getAge());
d1.eat();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)