A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 陈宇鹏 于 2013-3-11 12:23 编辑

父类和子类有同名的变量,无论静态或非静态,好像都是只看左边。因为静态是直接绑定在所属类中的。
那么。我想问下。是不是静态和非静态情况下。其最终结果,最后都是一样的?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 鼓励鼓励

查看全部评分

6 个回复

倒序浏览
首先是成员函数在多态中调用时,编译看左边,运行看右边。其结果不是一样的。例如:class Fu
{
    static String age()
    {
       return " I am a old man";
    }

  String name()
    {
       return "LaoZi";
     }
  }

class Zi extends Fu
{
     static String age()
    {
      return "I am a young man";
  }

  String name()
     {
     return "ErZi";
    }
}

class Test
{
    public static void main(String[] args)
   {
       Zi s = new Zi();   //(1)
       Fu s=new Zi();   //(2)
        System.out.println(s.age() + ", " + s.name());
     }
}
//(1)输出结果为 I am a young man       ErZi
//(2)  输出结果为  I am a old man     Erzi

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 鼓励鼓励

查看全部评分

回复 使用道具 举报
陈宇鹏 来自手机 中级黑马 2013-3-11 01:28:30
藤椅
施家雄 发表于 2013-3-11 01:26
首先是成员函数在多态中调用时,编译看左边,运行看右边。其结果不是一样的。例如:class Fu
{
    stati ...

大哥,函数的我懂,我是说成员变量,你没看题吧,哈哈
回复 使用道具 举报
class DuoTaiDemo1
{
        public static void main(String[] args)
        {
                Student s ;
                s = new BaseStudent();
                s.sleep();//调用的是父类的方法
                System.out.println(s.age);//显示的是父类age
                System.out.println(s.num);//显示的是父类num
        }
}
class Student
{
        int age =1;
        static int num =1;
        public  void study()
    {
                System.out.println("挑灯夜战");
        }
        public static void sleep()
        {
                System.out.println("dangzheshui");
        }
       
}
class BaseStudent extends Student
{
        int age = 12;
        static int num =12;
        public void study()
        {
                System.out.println("javaee");
        }
        public static void sleep()
        {
                System.out.println("zuozheshui");
        }
       
}
多态中成员变量的特点:
    无论是否重名,静态, 无论编译还是运行,都参阅左边。即引用型变量所属的类的成员变量。
注意:必须保证子类的调用的成员是父类有的。如果声明了多态,又调用子类特有的成员会导致编译失败。

评分

参与人数 1黑马币 +9 收起 理由
黄玉昆 + 9 赞一个!

查看全部评分

回复 使用道具 举报
是看左边  你说对了  记住就好  
回复 使用道具 举报
你们说指看左边这个没什么事实依据好,
其原理是这样的:
因为子类其实是一种特殊的父类,因为Java允许把一个子类对象直接赋给一个父类引用变量,无须任何类型转换,或者被称为向上转型,向上转型是由系统自动完成的。
Java引用变量有两个类型,一个是编译时的类型,一个是运行时的类型。
编译时的类型是由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。
如果编译时类型和运行时类型不一致,就会出现所谓的多态。
通过引用变量来访问其包含的实列属性和类变量时,
系统总是试图访问它编译时类所定义的属性和类变量,而不是它运行时类所定义的属性和类变量。


希望对你有所帮助,能更好的理解子类和父类出现同名的属性的知识点。
回复 使用道具 举报
感谢各位~~~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马