黑马程序员技术交流社区

标题: 一个关于super的问题? [打印本页]

作者: 李平    时间: 2012-4-14 20:16
标题: 一个关于super的问题?
class Person
{
        String name;
        int age;
        public Person(String name, int age) {
                this.name = name;
                this.age = age;
        }
        public void show(int a)
        {
                System.out.println(a);
        }   
}
class Student extends Person
{
        String name;
        int age;
        public Student(String name, int age)
        {
                super(name, age);
        }
        public void show(int a)
        {
                super.show(a);

        }
        
        
}
class PersonDemo
{
        public static void main(String[] args)
        {
                Student s = new Student("lisi",3);
                s.show(1);
        }
}

在Student类中:
super(name, age);    为什么这不能写成super.Person(name,age);
super.show(a);     为什么这不能写成super(a);
为什么这两个地方的调用方式不一样?

作者: 邓斌    时间: 2012-4-14 20:26
super是父类的引用。
super(name, age);    这就是调用构造函数。(里面可以传参数。不传也行。)
super.show(a);  调用的是父类方法
为什么这不能写成super.Person
为什么这不能写成super(a);
可以这样理解。super()==person()  子类本身就隐藏了一个父类的构造函数调用。super();



作者: 尹博    时间: 2012-4-14 20:26
super代表的是父类对象,super.Person会是什么意思呢,对象中的类?所以不能这么用。既然super指的是父类对象,那么super.show()就是调用对象中的方法,若写成super(),则虚拟机不会认为要调用show方法,而是对象中默认的没有方法名的代码即构造代码块和构造函数。
作者: 马强    时间: 2012-4-14 20:28
“     super(name, age);    为什么这不能写成super.Person(name,age);super.show(a);     为什么这不能写成super(a);
为什么这两个地方的调用方式不一样?   ”

因为super代表父类,而super.XX()代表的父类方法。
super()代表父类的构造方法(用于给类初始化)。
作者: chenwei    时间: 2012-4-14 20:29
Person是构造方法,
super()是就是直接调用父类构造方法,父类里没有有参数的构造方法不能super(a);
show()不是Person的构造方法,
新手见解,楼下补充
作者: 李平    时间: 2012-4-14 20:37
是不是public Person(String name, int age)是Person类必须有的,老师说过会有默认的Person(){},这个是不是把他覆盖了?
这样理解对吧,和类同名的用super(),其他的就是super.
作者: 王永旺    时间: 2012-4-14 20:39
1.super(name, age);    为什么这不能写成super.Person(name,age);
因为super的意思就是代表父类对象,不能理解的话可以吧super替换成person,看是否合理。显然Person.Person(name,age)是不合理的。2.super.show(a);     为什么这不能写成super(a);
同上一问道理一样,super.show(a);肯定不能写成Persen(a);
作者: 邓斌    时间: 2012-4-14 20:44
李平 发表于 2012-4-14 20:37
是不是public Person(String name, int age)是Person类必须有的,老师说过会有默认的Person(){},这个是不是 ...

super 是父类的引用。还没懂吗?  吧这句话理解了。就差不多了。
一个类里面都隐藏了一个构造函数。子类都隐藏了一个父类的构造函数。

作者: 黑马-王建雨    时间: 2012-4-14 21:12
  super是父类的引用,指向父类对象。
在子类调用  super(),表示对父类进行初始化,(就是调用构造函数)。()里面可以传参数,不传也行,但是子类的构造函数前都默认有一条隐式super(),当你在声明时就将默认覆盖了。
super.show(a); 父类对象调用父类方法


希望能解决你的疑惑。我们一起加油。
作者: 黑马-王建雨    时间: 2012-4-14 21:27
class Person
{
        String name;
        private  int age;
         public Person(String name, int age) {
                 this.name = name;
                this.age = age;
         }
         public void show(int a)
         {
                 System.out.println(a);
         }   
}
class Student extends Person
{
        // String name;
        // int age;
         public Student(String name, int age)
        {
                 super(name, age);
         }
       /*  
             public void show(int a)
          {
                 super.show(a);

          }
         
    */     
}
class PersonDemo
{
         public static void main(String[] args)
         {
                 Student s = new Student("lisi",3);
                 s.show(1);
         }
}
作者: 黑马-王建雨    时间: 2012-4-14 21:28
啷个里个郞 发表于 2012-4-14 21:27
class Person
{
        String name;

简单的优化一下。




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