黑马程序员技术交流社区

标题: 【手机发帖,求谅解】关于多态中静态的问题 [打印本页]

作者: 陈宇鹏    时间: 2013-3-11 01:12
标题: 【手机发帖,求谅解】关于多态中静态的问题
本帖最后由 陈宇鹏 于 2013-3-11 12:23 编辑

父类和子类有同名的变量,无论静态或非静态,好像都是只看左边。因为静态是直接绑定在所属类中的。
那么。我想问下。是不是静态和非静态情况下。其最终结果,最后都是一样的?
作者: 施家雄    时间: 2013-3-11 01:26
首先是成员函数在多态中调用时,编译看左边,运行看右边。其结果不是一样的。例如: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
作者: 陈宇鹏    时间: 2013-3-11 01:28
施家雄 发表于 2013-3-11 01:26
首先是成员函数在多态中调用时,编译看左边,运行看右边。其结果不是一样的。例如:class Fu
{
    stati ...

大哥,函数的我懂,我是说成员变量,你没看题吧,哈哈
作者: 李阳    时间: 2013-3-11 01:52
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");
        }
       
}
多态中成员变量的特点:
    无论是否重名,静态, 无论编译还是运行,都参阅左边。即引用型变量所属的类的成员变量。
注意:必须保证子类的调用的成员是父类有的。如果声明了多态,又调用子类特有的成员会导致编译失败。
作者: amen0205    时间: 2013-3-11 04:33
是看左边  你说对了  记住就好  
作者: scott0610    时间: 2013-3-11 08:44
你们说指看左边这个没什么事实依据好,
其原理是这样的:
因为子类其实是一种特殊的父类,因为Java允许把一个子类对象直接赋给一个父类引用变量,无须任何类型转换,或者被称为向上转型,向上转型是由系统自动完成的。
Java引用变量有两个类型,一个是编译时的类型,一个是运行时的类型。
编译时的类型是由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。
如果编译时类型和运行时类型不一致,就会出现所谓的多态。
通过引用变量来访问其包含的实列属性和类变量时,
系统总是试图访问它编译时类所定义的属性和类变量,而不是它运行时类所定义的属性和类变量。


希望对你有所帮助,能更好的理解子类和父类出现同名的属性的知识点。
作者: 陈宇鹏    时间: 2013-3-11 12:23
感谢各位~~~~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2