20-面向对象编程-多态

马铃薯1 / 2023-08-18 / 原文

面向对象编程有三大特征:封装、继承和多态

 

访问修饰符可以控制属性的访问范围

public:表示公共访问级别,可以被任何类访问。

protected:表示受保护访问级别,可以被类本身、子类和同一包中的类访问。

default(缺省):表示默认访问级别,即如果没有使用访问修饰符,默认是此级别,可以被同一包中的类访问。

private:表示私有访问级别,只能在类内部访问。

修饰符
子类
其他包
public
protected
×
default
×
×
private
×
×
×

 

多态介绍

方法或对象具有多种形态,多态是建立在封装和继承基础之上的。

换句话说,多态可以理解为事物的多种形态,同一个行为具有不同的表现形式或形态的能力。

 

例如:打印机分为黑白打印机和彩色打印机,在黑白打印机情况下打出来为黑白,在彩色打印机情况下打印出来为彩色

 

1. 方法的多态(方法的重载和重写)

public class PolyMethod {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();

        //1.方法的重载体现多态
        //这里我们传入不同的参数,就会调用不同的sum方法
        System.out.println(b.sum(10,20));  //30
        System.out.println(b.sum(10,20,30));  //60

        //2.方法的重写体现多态
        a.say();  //父类A的say方法被调用
        b.say();  //子类B的say方法被调用
    }
}

class A {
    public void say(){
        System.out.println("父类A的say方法被调用");
    }
}

class B extends A {
    //方法重载
    public int sum(int n1, int n2){
        return n1 + n2;
    }
    public int sum(int n1, int n2, int n3){
        return n1 + n2 + n3;
    }
    //方法重写
    public void say(){
        System.out.println("子类B的say方法被调用");
    }
}

2. 对象的多态

1) 一个对象的编译类型和运行类型可以不一致

2) 编译类型在定义对象时,就确定了,不能改变

3) 运行类型是可以变化的

4) 编译类型是看定义时 “=” 等号的左边,运行类型是看 “=” 等号的右边

public class PolyMethod {
    public static void main(String[] args) {
        //对象的多态
        //1.animal的编译类型是 Animal,animal的运行类型是 Dog
        Animal animal = new Dog();
        //当代码执行到当前行时,animal的运行类型时Dog,所以cry方法是Dog类cry方法
        animal.cry();  //Dog  cry   小狗汪汪叫...

        //2.此时,animal的运行类型是 Cat,但编译类型仍然是 Animal
        animal = new Cat();
        //当代码执行到当前行时,animal的运行类型时Cat,所以cry方法是Cat类cry方法
        animal.cry();  //Cat   cry   小猫喵喵叫...
    }
}

class Animal{
    public void cry(){
        System.out.println("Animal   cry   一直在叫...");
    }
}
class Cat extends Animal{
    @Override
    public void cry(){
        System.out.println("Cat   cry   小猫喵喵叫...");
    }
}
class Dog extends Animal{
    @Override
    public void cry(){
        System.out.println("Dog  cry   小狗汪汪叫...");
    }
}