美文网首页
java中的多态在子父类中的成员上的体现的特点

java中的多态在子父类中的成员上的体现的特点

作者: 咸鱼Jay | 来源:发表于2017-07-14 10:06 被阅读12次

1,成员变量:

在多态中,子父类成员变量同名。

  • 在编译时期:参考的是引用型变量所属的类中是否有调用的成员。(编译时不产生对象,只检查语法错误)
  • 运行时期:也是参考引用型变量所属的类中是否有调用的成员。
  • 简单一句话:无论编译和运行,成员变量参考的都是引用变量所属的类中的成员变量。
  • 再说的更容易记忆一些:成员变量 --- 编译运行都看 = 左边。

2,成员函数。

  • 编译时期:参考引用型变量所属的类中是否有调用的方法。
  • 运行时期:参考的是对象所属的类中是否有调用的方法。
    为什么是这样的呢?因为在子父类中,对于一模一样的成员函数,有一个特性:覆盖。
  • 简单一句:成员函数,编译看引用型变量所属的类,运行看对象所属的类。
  • 更简单:成员函数 --- 编译看 = 左边,运行看 = 右边。

3,静态函数。

  • 编译时期:参考的是引用型变量所属的类中是否有调用的成员。
  • 运行时期:也是参考引用型变量所属的类中是否有调用的成员。
    为什么是这样的呢?因为静态方法,其实不所属于对象,而是所属于该方法所在的类。
    调用静态的方法引用是哪个类的引用调用的就是哪个类中的静态方法。
  • 简单说:静态函数 --- 编译运行都看 = 左边.

看下面代码:


public class PrivateOverride {
    public int i = 10;//成员变量
    private void f() {//私有成员函数
        System.out.println("private f()");
    }
    
    public void g() {//成员函数
        System.out.println("PrivateOverride g()");
    }
  
    public static void s() {//静态函数
        System.out.println("PrivateOverride s()");
    }
    public static void main(String[] args) {
        PrivateOverride po = new Derived();
        po.f();
        po.g();
        po.s();
        System.out.println("i="+po.i);
        ((Derived)po).e();
    }   
}

class Derived extends PrivateOverride{
    public int i = 20;
    public void f() {
        System.out.println("Derived f()");
    }
    
    public void g() {
        System.out.println("Derived g()");
    }
    
    public void e() {
        System.out.println("Derived e()");
    }
    
    public static void s() {
        System.out.println("Derived s()");
    }
}

运行结果:

private f()
Derived g()
PrivateOverride s()
i=10
Derived e()

上面有个f()方法基类是私有方法,子类也有个公有的f()方法,执行po.f();后,结果是基类的f()方法调用,这是由于private方法被自动认为是final方法,而对于子类是屏蔽的,因此,在这种情况下,Derived类中的f()方法就是一个全新的方法,既然基类中的f()方法在子类Derived中不可见,因此甚至也不能被重载。
   结论就是:只有非private方法才可以被覆盖,但是还需要密切注意覆盖private方法的现象,这时虽然编译器不会报错,但是也不会按照我们所期望的来执行。确切地说,在基类中,对于基类中private方法,最好采用不同的名字。

相关文章

  • 技术问 - 多态的实现机制是什么

    多态前提和体现: 有多态时的子父类间的成员变量、成员方法、构造方法之间的特点: 多态中 成员变量的访问特点:编译...

  • java中的多态在子父类中的成员上的体现的特点

    1,成员变量: 在多态中,子父类成员变量同名。 在编译时期:参考的是引用型变量所属的类中是否有调用的成员。(编译时...

  • 多态,向上下转型

    实现的多态前提 多态情况下要注意的细节 子父类中存在同名的成员变量时(包括静态变量),访问的是父类的成员变量。 子...

  • 03.继承中成员变量的特点

    继承中成员变量的特点 A:子类只能获取父类非私有成员子父类中成员变量的名字不一样直接获取父类的成员变量子父类中成员...

  • 11.多态成员的特点

    多态成员的特点 A:多态成员变量当子父类中出现同名的成员变量时,多态调用该变量时:编译时期:参考的是引用型变量所属...

  • JAVA基础-多态

    JAVA基础-多态 结论: 1、当子父类中出现同名的成员变量时,多态调用该变量时,如果父类没有该变量,则编译失败。...

  • java基础问题

    在多态中,父类指向子类时候,不能调用父类没用,子类有的方法。 java中普通类可以继承普通类的。

  • 深入理解 Python 类和对象(1) - 鸭子类型和多态

    什么是鸭子类型? Java 中实现多态,需要继承父类,并覆盖父类中的方法。 Python 中实现多态,不需要继承任...

  • 多态在java中的体现

    1.它们都调用的是子类的方法。如 抽象类和接口它们不可能实例出对象 所以如果要调用方法就一定调用子类方法。 2.多...

  • JAVA7:面向对象-多态及转型问题

    关于面向对象中的多态: 多态存在的前提:1 存在类之间的继承关系;2 在子类中的成员方法存在重写;3 父类引用指向...

网友评论

      本文标题:java中的多态在子父类中的成员上的体现的特点

      本文链接:https://www.haomeiwen.com/subject/ycdnhxtx.html