Java polymorphism
1. Polymorphism
2. Features of polymorphic call members
package a01polymorphismdemo01;
public class test {
public static void main(String[] args) {
//创建对象(多态方式)
//Fu fu = new zi()
Animal a = new Dog();
//调用成员变量:编译看左边,运行也看左边
//编译看左边:javac编译代码时,会看左边的父类中有没有这个变量;如果有,编译成功,如果没有编译失败
//运行也看左边:java运行代码的时候,实际获取的就是左边父类中的成员变量的值
System.out.println(a.name);//动物
//调用成员方法:编译看左边,运行看右边
//编译看左边:javac编译代码时,会看左边的父类中有没有这个方法;如果有编译成功,如果没有编译失败
//运行看右边:java运行代码的时候,实际运行的是之类中的方法
a.show(); //Dog ---- show方法
//理解:
// Animal a = new Dog();
//现在用a去调用变量和方法
//a是Animal 类型的,所以默认都会从Animal这个类去找
//成员变量:在子类的对象中,会把父类的成员变量也继承下来。父: name,子 :name
//成员方法:如果子类对方法进行了重写,那么在虚方法表中是会把父类的方法进行覆盖的
}
}
class Animal{
String name = "动物";
public void show(){
System.out.println("Animal ---- show方法");
}
}class Dog extends Animal{
String name = "狗";
@Override
public void show(){
System.out.println("Dog ---- show方法");
}
}class Cast extends Animal{
String name = "猫";
@Override
public void show(){
System.out.println("猫 ---- show方法");
}
}
3. Advantages and disadvantages of polymorphism
package a01polymorphismdemo01;
public class test {
public static void main(String[] args) {
//创建对象(多态方式)
//Fu fu = new zi()
Animal a = new Dog();
//调用成员变量:编译看左边,运行也看左边
//编译看左边:javac编译代码时,会看左边的父类中有没有这个变量;如果有,编译成功,如果没有编译失败
//运行也看左边:java运行代码的时候,实际获取的就是左边父类中的成员变量的值
System.out.println(a.name);//动物
//调用成员方法:编译看左边,运行看右边
//编译看左边:javac编译代码时,会看左边的父类中有没有这个方法;如果有编译成功,如果没有编译失败
//运行看右边:java运行代码的时候,实际运行的是之类中的方法
a.show(); //Dog ---- show方法
//不能调用子类的特有功能
//报错原因?
//当调用成员方法的时候,编译看左边,运行看右边
//那么在编译的时候会先检查左边父类中有没有这个方法,如果没有直接报错
//a.lookHome();
//解决方法:
//变回子类的类型就可以
//细节:转换的时候不能瞎转换,如果转换成其他类型,就会报错
// Cat c = (Cat) a;
//c.catchMouse();
if(a instanceof Dog){
Dog d = (Dog) a;
d.lookHome();
}else if (a instanceof Cat){
Cat c = (Cat) a;
c.catchMouse();
}else {
System.out.println("没有这个类型");
}
//新特性
//先判断a是否为Dog类型,如果是,则强制转成Dog,并且转换之后的变量名为d
//如果不是,则不强转,结果直接是false
if(a instanceof Dog d){
//Dog d = (Dog) a;
d.lookHome();
}else if (a instanceof Cat c){
//Cat c = (Cat) a;
c.catchMouse();
}else {
System.out.println("没有这个类型");
}
}
}
class Animal{
String name = "动物";
public void show(){
System.out.println("Animal ---- show方法");
}
}class Dog extends Animal{
String name = "狗";
@Override
public void show(){
System.out.println("Dog ---- show方法");
}
public void lookHome(){
System.out.println("狗在看家");
}
}class Cat extends Animal{
String name = "猫";
@Override
public void show(){
System.out.println("猫 ---- show方法");
}
public void catchMouse(){
System.out.println("猫在抓老鼠");
}
}
4. Polymorphism exercise
package a02polymorphismodemo02;
public class Animal {
/*1.属性:
年龄,颜色
2.行为:
eat(String something)(something 表示吃的东西)
* */
private int age;
private String color;
public Animal() {
}
public Animal(int age, String color) {
this.age = age;
this.color = color;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public void eat(String something){
System.out.println("动物在吃"+ something);
}
}
package a02polymorphismodemo02;
public class Dog extends Animal{
//空参构造
public Dog() {
}
//带全部参数的构造
public Dog(int age, String color) {
super(age, color);
}
@Override
public void eat(String something) {
System.out.println(getAge()+"岁的"+getColor()+"颜色的狗两只前腿死死的抱住"+something+"猛吃");
}
public void lookHome(){
System.out.println("狗在看家");
}
}
package a02polymorphismodemo02;
public class Cat extends Animal{
public Cat() {
}
public Cat(int age, String color) {
super(age, color);
}
@Override
public void eat(String something) {
System.out.println(getAge()+"岁的"+getColor()+"颜色的猫眯着眼侧着头吃"+something);
}
public void catchMouse(){
System.out.println("猫抓老鼠");
}
}
package a02polymorphismodemo02;
public class Person {
private int age;
private String name;
public Person() {
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/* public void keepPet(Dog dog,String something){
System.out.println("年龄为"+age+"岁的" +name+"养了一只"+dog.getColor()+"颜色的"+dog.getAge()+"岁的狗");
dog.eat(something);
}
public void keepPet(Cat cat,String something){
System.out.println("年龄为"+age+"岁的" +name+"养了一只"+cat.getColor()+"颜色的"+cat.getAge()+"岁的猫");
cat.eat(something);
}*/
//想要一个方法能接收所有的动物,包括狗,猫
//方法的形参:写成这些类的父类 (多态的应用)
public void keepPet(Animal animal, String something) {
if (animal instanceof Dog dog) {
System.out.println("年龄为" + age + "岁的" + name + "养了一只" + dog.getColor() + "颜色的" + dog.getAge() + "岁的狗");
animal.eat(something);
}else if(animal instanceof Cat cat){
System.out.println("年龄为" + age + "岁的" + name + "养了一只" + cat.getColor() + "颜色的" + cat.getAge() + "岁的猫");
animal.eat(something);
}else {
System.out.println("没有这种动物");
}
}
}
package a02polymorphismodemo02;
public class test {
public static void main(String[] args) {
/* Person p1 = new Person(30,"老王");
Dog dog = new Dog(2,"黑色");
p1.keepPet(dog,"骨头");
Person p2 = new Person(32,"老李");
Cat cat = new Cat(3,"灰色");
p2.keepPet(cat,"鱼");*/
Person p = new Person(30,"老王");
Dog dog = new Dog(2,"黑色");
Cat cat = new Cat(3,"灰色");
p.keepPet(dog,"骨头");
p.keepPet(cat,"鱼");
}
}