教程集 www.jiaochengji.com
教程集 >  脚本编程  >  java  >  正文 成员变量和方法的override的详解

成员变量和方法的override的详解

发布时间:2019-02-03   编辑:jiaochengji.com
教程集为您提供成员变量和方法的override的详解等资源,欢迎您收藏本站,我们将为您提供最新的成员变量和方法的override的详解资源
原题:
//file: MyMain.class
class Base
{
int a=10;
public void show()
{
  System.out.println(a);
}
}
class Ext extends Base
{
int a=200;
public void show(String s)
{
  System.out.println(s);
}
}
public class MyMain
{
public static void main(String[] argv)
{
  Ext obj=new Ext();
  obj.show();
  obj.show("OK");
}
}
请问,执行上面程序,运行是什么?
========================
关于这道题目,我给出了一个简单的原则,现在有空顺便说
清楚一点这个有趣的现象。
首先要说明,我认为,属性并非不可以override,
成员变量是可以override的,但是成员变量是在编译时解析的
(而方法是在运行时解析的)
这样一来,当子类要引用父类对象的属性时,实际上它会屏蔽
自己的同名属性,只去访问父类对象的属性,所以直接引用
变量名和通过方法来获取变量的效果是不一样的,
这里有个非常好的例子,有时间好好看看,想想
public class Shadow {
  public static void main(String s[]) {
    S1 s1 = new S1();
    S2 s2 = new S2();
    System.out.println(s1.s); // prints S1
    System.out.println(s1.getS()); // prints S1
    System.out.println(s2.s); // prints S2
    System.out.println(s2.getS()); // prints S2
    s1 = s2;
    System.out.println(s1.s); // prints S1, not S2 -
                      // since variable is resolved at compile time
    System.out.println(s1.getS()); // prints S2 -
                     // since method is resolved at run time
  }
}
class S1 {
  public String s = "S1";
  public String getS() {
    return s;
  }
}
class S2 extends S1{
  public String s = "S2";
  public String getS() {
    return s;
  }
}

您可能感兴趣的文章:
成员变量和方法的override的详解
详解PHP的self关键字
python为什么要用class
python是面向对象的语言吗
c# 类与成员的修饰详解
了解PHP中self关键字的相关知识
关于PHP中self关键字的用法详解
解析PHP的self关键字
php final static const成员属性用法
C#简介- 类和对象,选自《C#编程语言详解》,送给新手

[关闭]
~ ~