java多态中的就近原则介绍

直接上题:

题目补充:

class A {
    int m;                     //-10
    int getM() {
        return m;
    }
    int seeM() {
        return m;
    }
}
class B extends A {
    int m ;                      //10
    int getM() {
       // System.out.println(this.m+"............"+super.m);
        return m+10;
    }
}
public class Test {
    public static void main(String args[]) {
        B b = new B();                               //先找B,B没有再找A,找A的时候,就要注意:就近原则了
        b.m = 10;
        //此刻,A类的m为0,B类的m为10
        System.out.println("b.seeM():"+b.seeM());
        System.out.println("b.getM():"+b.getM());//20

        A a = b;                                  //把b符给a这样创建对象的方法,还是先找B,B没有再找A,找A的时候,就要注意:就近原则了
        //此刻,A类的m仍为0,B类的m仍为10
        System.out.println("...................................");
        System.out.println("a.seeM():"+a.seeM());
        System.out.println("a.getM():"+a.getM());
        System.out.println("...................................");

        a.m = -10;//A只能改自己的m,不能改B的m,所以
        //此刻,A类的m为-10,B类的仍m为10

        System.out.println("b.getM():"+b.getM());//20   b始终调用重写后的getM()方法
        System.out.println("a.getM():"+a.getM());//b.getM()是20,后来把b赋给a,a也成了20     20
        //b调用的getM()方法是重写之后的getM()方法,所以是10+10

        System.out.println("a.seeM():"+a.seeM());
        System.out.println("b.seeM():"+b.seeM());//此时不管是a的m还是b的m都是-10            -10
        System.out.println("a.m:"+a.m+"   b.m:"+b.m);
        System.out.println("a.getM():"+a.getM());
        //因为b自己没有seeM方法,所以b在使用seeM方法时,是用的父类A的seeM方法,根据就近原则,b在调用seeM方法时是使用的A.m的-10
        //所以,b通过seeM()方法看到的是m是a的m
    }
}

判断成员变量的方法\技巧其实很简单:

只需要:

确定当前这个类 调用的成员方法 是先找谁?

=>如果先找父类,找就完事了

=>如果先在子类,子类找到了要用的方法,那就用;

如果没找到,还要去父类里面去找要用到的方法,注意,这时就要使用就近原则

所以,关键有二:

一,确定先找谁?先找父类还是先在子类

eg:以上面的题为例:

B b = new B();//子类B, 子类 方法找完还 没找到 时,还要父类 里面找

A a = b;//注意这种 : 还是 子类B, 子类 方法找完还 没找到 时,还要父类 里面找

A a = new A();//这个时候,父类A,但 父类 方法找完还没找到时,不会再找 子类 了!

二,当从子类B找到父类A时,注意:要用到就近原则

到此这篇关于java多态中的就近原则介绍的文章就介绍到这了,更多相关java多态就近原则内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅谈Java封装、继承、多态特性

    目录 1.封装 2.继承 3.多态 4.上代码,效果运行放在最后 1.封装 什么是封装,谈谈自己对封装的理解,封装就是将类的信息(比如说类的属性)隐藏在类的内部,不允许外部程序直接访问.此时就要提到一个关键字private,他是一个权限修饰符,可以用来修饰成员(变量和方法),保护成员不被其他别的类来使用,如果需要被其他类来使用,那么需要提供对应的操作:a.提供get变量名()方法,用于获取成员变量的值 b.提供set变量名(参数),用于设置成员变量的值,同样也和get方法一样,都是用public

  • Java之理解多态详解

    目录 一.多态的概念 二.多态的特点 三.instanceof操作符 四.多态的转型 1.向上转型 2.向下转型 五.方法重写 六.小结 一.多态的概念        继承关系使一个子类能继承父类的特征,并且附加一些新特征.子类是它的父类的特殊化,每个子类的实例都是其父类的实例,但是反过来不成立.例如:每个圆都是一个几何对象,但并非每个几何对象都是圆.因此,总可以将子类的实例传给需要父类型的参数.参考案例如下: public class PolymorphismDemo{ /** Main me

  • java多态注意项小结

    展示多态现象 package test; //父类引用,指向(不同子类)的实例,对同一个实例方法名调用,调用的程序不 //一样.继承是多态得以实现的基础. public interface test1 { void shout(); } package test; public class test2 implements test1 { public void shout() { System.out.println("1111"); } } package test; public

  • Java编程 多态

    目录 一.向上转型 二.转机 1.绑定 2.扩展性 3.缺陷 三.构造器与多态 1.构造器的调用顺序 2.构造器内部的多态方法的行为 四.协变返回类型 五.继承进行设计 前言: 封装,是合并属性和行为创建一种新的数据类型,继承是建立数据类型之间的某种关系(is-a),而多态就是这种关系在实际场景的运用. 多态就是把做什么和怎么做分开了:其中,做什么是指调用的哪个方法[play 乐器],怎么做是指实现方案[使用A乐器 使用B乐器],''分开了''指两件事不在同一时间确定. 一.向上转型 对象既可以

  • Java面向对象之多态

    目录 一.前言 二.什么是多态? 三.多态的实现条件 四.多态的访问特点 1.我们建一个service包放Animal类 2.再servic包下建一个impl包,包下放Cat类 3.我们在建一个controller包,在里面建一个动物测试类 4.弄完之后我们程序一运行 4.1为什么两个有区别呢? 五.多态的优点和缺点? 六.为什么要分开建包 一.前言 前面我们了解和学习了继承的使用,现在我们来学习三大面向对象之一的多态. 多态使java面向对象丰富起来,所以学好多态十分重要. 二.什么是多态?

  • java多态中的就近原则介绍

    直接上题: 题目补充: class A { int m; //-10 int getM() { return m; } int seeM() { return m; } } class B extends A { int m ; //10 int getM() { // System.out.println(this.m+"............"+super.m); return m+10; } } public class Test { public static void ma

  • Java多态中动态绑定原理解析

    这篇文章主要介绍了Java多态中动态绑定原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 多态是面向对象程序设计非常重要的特性,它让程序拥有 更好的可读性和可扩展性. 发生在继承关系中. 需要子类重写父类的方法. 父类类型的引用指向子类类型的对象. 自始至终,多态都是对于方法而言,对于类中的成员变量,没有多态的说法. 一个基类的引用变量接收不同子类的对象将会调用子类对应的方法,这其实就是动态绑定的过程.在理解动态绑定之前,先补充一些概念.

  • Java 多态中继承的转型详解与用法分析

    目录 一.前言 二.转型 向上转型 向下转型 三.instanceof运算符 instanceof的用处 instanceof的使用格式: 一.前言 前面我们学习了多态的概述和使用,现在我们来学习前面剩下的转型问题. 二.转型

  • Java设计模式中的七大原则详细讲解

    目录 1.开闭原则(软件设计第一原则) 2.依赖倒置原则 3.里氏替换原则 4.合成复用原则 5.接口隔离原则 6.迪米特法则 7.单一职责原则 设计模式要进行共性与可变性的分析,对共性进行抽象,同时对可变性进行封装,没有完美的设计模式,作为一名开发者要懂得取舍,触类旁通,开发出高内聚.低耦合.灵活性更高的软件产品 1.开闭原则(软件设计第一原则) 定义:一个软件实体应该对扩展开放,对修改关闭,即在不修改源代码的基础上扩展软件功能 本质思想: 以抽象来固定不变的东西(把固定不变的抽出来) 使用具

  • Java编程中的构造函数详细介绍

    本文主要是为新手.对java语言感兴趣的人和那些没有系统学习过java基础知识的人进行一个总结,在文章中对构造函数进行了较为详细的说明和讨论,也包含了我个人对于java面向对象中构造函数的一些看法.希望走在java学习道路上的同行者可以有一个较为清晰的认知和理解.当然仅为个人观点,水平有限,不足之处,还请大家多多指出,互相交流学习. 1.构造函数的概念 很多java新手谈到构造函数就会犯晕,我们先来看看什么是构造函数. 首先,构造函数是函数的一种特殊形式,特殊在哪里?构造函数中不需要定义返回类型

  • java ArrayList中的remove方法介绍

    先看一段代码,看看自定义的ArrayList中的remove设计是否有问题. public class MyArrayList { private Object[] mData = new Object[0]; private int mSize = 0; // 删除第i个元素 public void remove(int i) { if (i < 0 || i >= mSize) return; for (int index = i; index < mSize - 1; index+

  • Java 8中的Collectors API介绍

    目录 Stream.Collect() 方法 Collectors Collectors.ToList() Collectors.ToUnmodifiableList() Collectors.ToSet() Collectors.ToUnmodifiableSet() Collectors.ToCollection() Collectors.ToMap() Collectors.ToUnmodifiableMap() Collectors.CollectingAndThen() Collect

  • JAVA 多态 由浅及深介绍

    什么是多态? 多态分两种: (1)   编译时多态(设计时多态):方法重载. (2)   运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态.(我们平时说得多的事运行时多态,所以多态主要也是指运行时多态) 运行时多态存在的三个必要条件:一.要有继承(包括接口的实现):二.要有重写:三.父类引用指向子类对象. ------------------------------------------------------------------------

  • Java 8 中 Function 接口使用方法介绍

    目录 Java 8 中 Function 接口的介绍 Function 接口的用法 Function 接口的实例 Java 8 中 Function 接口的介绍 Java 8 中提供了一个函数式接口 Function,这个接口表示对一个参数做一些操作然后返回操作之后的值.这个接口的有一个抽象方法 apply,这个方法就是表明对参数做的操作. // Java Function 接口的定义 @FunctionalInterface public interface Function<T, R> {

  • 通过实例分析java多态

    这篇文章主要介绍了通过实例分析java多态,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 首先来看这样的一段代码,其中对于类的定义如下: class Parent{ public int myValue=100; public void printValue() { System.out.println("Parent.printValue(),myValue="+myValue); } } class Child extends P

随机推荐