抱歉,你查看的文章不存在

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

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); // 编译报错
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

LinkedBear的个人空间

0 篇文章14 人订阅

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-08(02)总结帮助文档,代码块,继承

(9)两个面试题: A:Override和Overload的区别?Overload是否可以改变返回值类型? B:this和super的区别和各自的作用? ...

35570
来自专栏海天一树

小朋友学Java(8):重写与重载

一、重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写! 重写的好处在于子类可以根...

28790
来自专栏和蔼的张星的图像处理专栏

C++面向对象编程一些拾遗

虽然说是拾遗,但是这里有一大部分是我以前没有看过的,简书的markdown不支持生成目录,可能需要手动来一个了。

18820
来自专栏desperate633

深入理解javascript中的原型原型的概念使用原型给对象添加方法和属性使用原型对象的属性和方法原型的陷阱小结

原型prototype是javascript中极其重要的概念之一,但也是比较容易引起混淆的地方。我们需要花费一些时间和精力好好理解原型的概念,这对于我们学习ja...

9020
来自专栏java学习

Java每日一练(2017/6/20)

题目要求 本期题目: (单选题) 1、若有定义:byte[]x={11,22,33,﹣66};其中0≤k≤3,则对x数组元素错误的引用是() A x[5-3...

397100
来自专栏好好学java的技术栈

Java基础提升篇:equals()与hashCode()方法详解

13020
来自专栏好好学java的技术栈

java基础提升篇:Static关键字

12720
来自专栏黑泽君的专栏

Java中this和super的区别和应用

20110
来自专栏DT乱“码”

java父类,子类静态块和构造方法的执行顺序

一个面试笔试题中没什么什么卵用但经常出的题,父类,子类静态块和构造方法的执行顺序 package com.gulf.test; public class Fa...

237100
来自专栏无题

谈谈Java中equals和==的区别和使用场景

讨论一下Java中equals和==的区别,这个问题看似浅显,还是有不少情况需要注意。阅览了网上一些文章,都比较片面。在此做一下详细的整理。 先直接上结论::...

39650

扫码关注云+社区

领取腾讯云代金券