唠唠SE的面向对象-10——多态

本文详细介绍了Java中的多态概念,包括多态的原理、特点及其实现方式。通过具体示例解释了成员变量、静态成员函数等在多态中的表现,并讨论了类型转换和instanceof关键字的使用。

10. 多态

我们先看一个例子:动物类实例化出人和猪

abstract class Animal {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

class Person extends Animal {
    
}

class Pig extends Animal {
    
}

public class Test1 {
    public static void main(String[] args) {
        Animal person = new Person();
        Animal pig = new Pig();
    }
}

难道人和猪都是一个祖师爷??????(黑人问号.jpg)

这就是所谓的多态。。。。。。

 

多态的原理:

1:当父类和子类具有相同的非静态成员变量,那么在多态下访问的是父类的成员变量

class Animal {
    public String name = "animal";
}

class Person extends Animal {
    public String name = "person";
}

public class Test1 {
    public static void main(String[] args) {
        Animal person = new Person();
        System.out.println(person.name); // animal
    }
}

2:当父类和子类具有相同的静态成员变量,那么在多态下访问的是父类的静态成员变量

        所以:父类和子类有相同的成员变量,多态下访问的是父类的成员变量。

class Animal {
    public static String name = "animal";
}

class Person extends Animal {
    public static String name = "person";
}

public class Test1 {
    public static void main(String[] args) {
        System.out.println(Animal.name); // animal
        System.out.println(Person.name); // person
        Animal person = new Person();
        System.out.println(person.name); // animal
    }
}

3:当父类和子类具有相同的非静态方法(就是子类重写父类方法),多态下访问的是子类的成员方法。

class Animal {
    public void say() {
        System.out.println("animal。。。");
    }
}

class Person extends Animal {
    public void say() {
        System.out.println("person。。。");
    }
}

public class Test1 {
    public static void main(String[] args) {
        Animal person = new Person();
        person.say(); // person
    }
}

4:当父类和子类具有相同的静态方法(就是子类重写父类静态方法),多态下访问的是父类的静态方法。

class Animal {
    public static void say() {
        System.out.println("animal。。。");
    }
}

class Person extends Animal {
    public static void say() {
        System.out.println("person。。。");
    }
}

public class Test1 {
    public static void main(String[] args) {
        Animal person = new Person();
        person.say(); // animal
    }
}

 

多态的特点:

1:编译时期,参考引用型变量所属的类是否有调用的方法,如果有,则编译通过,没有则编译失败

2:运行时期,参考对象所属类中是否有调用的方法。

3:总之,成员非静态方法在多态调用时,编译看左边,运行看右边

在多态中,成员变量的特点,无论编译和运行参考左边(引用型变量所属的类)。

在多态中,静态成员函数特点,无论编译和运行都参考左边

多态可以作为参数传入,可以作为返回值传出。(这部分在集合中体现的更为清晰,建议同集合部分一起食用,效果更佳 ̄へ ̄)

 

 

 

多态可以实现隐式与显式的类型转换。向上转型为父类/接口,访问范围变小;向下转型为子类,访问范围变大,但需要强转。

Animal animal = new Person();
Person person = (Person) animal;

instanceof关键字:判断对象是否属于某个类

1:属于比较运算符:

2:instanceof关键字:该关键字用来判断一个对象是否是指定类的对象。

3:用法:对象 instanceof 类;

public class Test1 {
    public static void main(String[] args) {
        Animal animal = new Person();
        System.out.println(animal instanceof Person); // true
    }
}

该表达式是一个比较运算符,返回的结果是boolean类型 true|false

注意:使用instanceof关键字做判断时,两个类之间必须有关系,否则会在编译期报错。

 

class Person extends Animal {
    public static void say() {
        System.out.println("person。。。");
    }
}

class Pig {
    public static void say() {
        System.out.println("噜噜噜。。。");
    }
}

public class Test1 {
    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person instanceof Pig); // 编译报错
    }
}

205704_dpff_3041734.png

 

 

转载于:https://my.oschina.net/LinkedBear/blog/1615176

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值