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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

郑瑞

中级黑马

  • 黑马币:0

  • 帖子:27

  • 精华:0

© 郑瑞 中级黑马   /  2013-5-9 18:21  /  2297 人查看  /  21 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郑瑞 于 2013-5-9 19:07 编辑

abstract class Person {
        private String name;
        private int age;
        public Person(String name,int age){
                this.setName(name);
                this.setAge(age);
        }
        public void setName(String name){
                this.name = name;
        }
        public String getName(){
                return name;
        }
        public void setAge(int age){
                this.age = age;
        }
        public int getAge(){
                return age;
        }
}
class Student extends Person{
        private String school;
        public Student(String name,int age,String school){
                super(name,age);
                /*
                this.setName(name);
                this.setAge(age);
                */
                this.setSchool(school);
        }
        public void setSchool(String school){
                this.school = school;
        }
        public String getSchool(){
                return school;
        }
        public String getInfo(){
                return "姓名:  "+super.getName()+",  年龄:  "+super.getAge()+",  学校:  "+this.getSchool();
               
                // return "姓名:  "+this.getName()+",  年龄:  "+this.getAge()+",  学校:  "+this.getSchool();
               
        }
}
class abstractDemo{
        public static void main(String args[]){
                Student stu = new Student("张三",20,"清华");
                System.out.println(stu.getInfo());

        }
}


//第一块:super(name,age);
                /*
                this.setName(name);
                this.setAge(age);
                */
为什么用this会报错。

第二块:return "姓名:  "+super.getName()+",  年龄:  "+super.getAge()+",  学校:  "+this.getSchool();
               
                // return "姓名:  "+this.getName()+",  年龄:  "+this.getAge()+",  学校:  "+this.getSchool();
用this却不会报错呢。
this可用于访问本类中的方法,如果本类中没有此方法,就从父类中继续查找。
可是为什么第二块不报错而第一块却报错呢?

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

21 个回复

倒序浏览
子类继承父类。必须调用父类的构造函数。

评分

参与人数 1黑马币 +8 收起 理由
郑瑞 + 8 赞一个!

查看全部评分

回复 使用道具 举报
你好,你的代码我在研究中。我先回答你this和super的用法。比如:
class Demo1 {
        public static void main(String[] args){
                Zi z = new Zi();
                z.method();
        }
}
class Fu{
        int x = 30 ;
}

class Zi extends Fu{
        int x = 20 ;
        public void method (){
                int x = 10 ;
                System.out.println(x);//调用方法里面的属性直接调用就可以,调用完就自动被弹出内存了
                System.out.println(this.x);//调用本类的所有成员用this,因为this代表着一个对象在堆内存中的所有属性和方法。
                System.out.println(super.x);//调用父用类的所有共有方法和共有属性的时候super,super代表着父类中的所有属性和方法。不包括私有和受保护的
                //总之this和super只有在方法和属性出现同名的时候才需要用到。否则可以不加
        }
}

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
殇_心。 发表于 2013-5-9 18:28
子类继承父类。必须调用父类的构造函数。

  public Student(String name,int age,String school){
                 super();
                 this.setName(name);
                 this.setAge(age);
                 this.setSchool(school);
         }
这个super();加不加不是一样的么
回复 使用道具 举报
殇_心。 发表于 2013-5-9 18:28
子类继承父类。必须调用父类的构造函数。

  public Student(String name,int age,String school){
                 super();
                 this.setName(name);
                 this.setAge(age);
                 this.setSchool(school);
         }
        这个super();加不加不是一样的么
回复 使用道具 举报
郑瑞 发表于 2013-5-9 18:35
public Student(String name,int age,String school){
                 super();
                 th ...

你父类没这个构造函数啊。`````
回复 使用道具 举报
殇_心。 发表于 2013-5-9 18:37
你父类没这个构造函数啊。`````

哎呀,父类忘记定义构造函数了
回复 使用道具 举报
简单说来,this就是本身,super就是父类
回复 使用道具 举报
郑瑞 发表于 2013-5-9 18:41
哎呀,父类忘记定义构造函数了

看错了,父类是有构造函数的,难道this是不能调用父类的构造函数吗?
回复 使用道具 举报
殇_心。 发表于 2013-5-9 18:37
你父类没这个构造函数啊。`````


看错了,父类是有构造函数的,难道this是不能调用父类的构造函数吗?
回复 使用道具 举报
黑马-雷钊 发表于 2013-5-9 18:35
你好,你的代码我在研究中。我先回答你this和super的用法。比如:
class Demo1 {
        public static void main ...

谢谢,略懂了一点,再仔细琢磨琢磨
回复 使用道具 举报
郑瑞 发表于 2013-5-9 18:53
看错了,父类是有构造函数的,难道this是不能调用父类的构造函数吗?

super才是调用父类构造函数啊
回复 使用道具 举报
如果问题未解决,请继续追问,如果问题解决了,请将分类改为“已解决”,谢谢合作
回复 使用道具 举报
殇_心。 发表于 2013-5-9 18:56
super才是调用父类构造函数啊

书上写:this可用于访问本类中的方法,如果本类中没有此方法,就从父类中继续查找。
我晕了。。。。。。
回复 使用道具 举报
郑瑞 发表于 2013-5-9 18:56
谢谢,略懂了一点,再仔细琢磨琢磨

恩。要记住。咱是学java的。以后学的东西会很多。中间肯定有很多不理解或者超常理的东西。完全可以把它当成1+1等于2来做。只要代码写出来了就好。至于优化的技术以后慢慢会成熟的。不要在一个问题上停留太久。因为公司要的是程序员。是开发的,而不是研究java语言的。你说是不?
回复 使用道具 举报
Sword 发表于 2013-5-9 18:58
如果问题未解决,请继续追问,如果问题解决了,请将分类改为“已解决”,谢谢合作 ...

好的:handshake
回复 使用道具 举报
郑瑞 发表于 2013-5-9 18:59
书上写:this可用于访问本类中的方法,如果本类中没有此方法,就从父类中继续查找。
我晕了。。。。。。 ...

  方法可以了。我以为是构造函数。。
你的这里没有调用构造函数。所以报错了。
你这样使用
super(name,age);
this.setName(name);
this.setAge(age);
就行。
回复 使用道具 举报
黑马-雷钊 发表于 2013-5-9 19:00
恩。要记住。咱是学java的。以后学的东西会很多。中间肯定有很多不理解或者超常理的东西。完全可以把它当 ...

是啊,你说得很有道理呀,但有时我要是理解不了,就记不住,郁闷呀
回复 使用道具 举报
本帖最后由 zms2100 于 2013-5-9 19:17 编辑
郑瑞 发表于 2013-5-9 18:59
书上写:this可用于访问本类中的方法,如果本类中没有此方法,就从父类中继续查找。
我晕了。。。。。。 ...

这道题没什么好争论的,在子类的构造函数里面必须要添加super(name,age);这个语句,除非你父类有无参的构造函数。
剩下的加不加this.setName(name)等都无所谓(反而变成重复动作了)。   【当然有了无参构造函数,且没有super(name,age),这两句话就要加了。】
而第二个问题,有区别吗?只要上面是有super(name,age)的,那么哪一句都能够通过。
问题的核心是在于你的父类没有无参构造函数,所以子类不能直接继承,必须要指定继承父类的哪一个构造函数。
回复 使用道具 举报
郑瑞 发表于 2013-5-9 19:13
是啊,你说得很有道理呀,但有时我要是理解不了,就记不住,郁闷呀

哈哈  要知道除了面试是不会写那些反常的代码的    平时不要去想那些反常的代码。。就比如刚才   我写的那个你总记得住吧    因为它简单   所以记起来容易   难点的完全可以写在笔记本上。。偶尔用的时候就拿出来看
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马