快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

成员变量和方式的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;
  }
}




返回类别: 教程
上一教程: Stream Tokenizing(分解字符串)
下一教程: "package中的javac,java用法" && "制作可执行jar文件"

您可以阅读与"成员变量和方式的override的详解"相关的教程:
· 用SERVLETS实现WEB方法的文件下传
· Java变量的缺省(默认)值--只有类的instance变量和static变量才有
· JSP三种页面跳转方法的比较
· java编写TCP方法的通信程序
· 详解如何利用iText在JSP中生成PDF报表
    微笑服务 优质保证 索取样品