黑马程序员技术交流社区

标题: 一道基础困惑已久的题,五一老师回家请论坛师兄代为解答 [打印本页]

作者: 728503435    时间: 2015-5-1 09:52
标题: 一道基础困惑已久的题,五一老师回家请论坛师兄代为解答
class Student
{
        private String name;
        private int age;
    public        Student(String name,int age) {
                this.name = name;
                this.age = age;
                }
        public void show() {
                System.out.println("name="+name+";age="+age);
        }
}
class Undergraduce extends Student
{
        private String degree;
    public Undergraduce(String name,int age,String degree) {
                super(name,age);
                this.degree=degree;

        }
        public void show() {
System.out.println("name="+name+",age="+age+"degree="+degree);//这个地方报错: 错误: name可以在 Student中访问private
        }
}
class Test
{
        public static void main(String[] args) {
                Undergraduce c=new Undergraduce("卓明钊",22,"硕士");
                c.show();
                Student b=new Student("卓明钊",22);
                b.show();
                Undergraduce c1=new Undergraduce("卓明钊",22,"硕士");
                //c1.show();
        }
}
=============================================================================
问题就是:子类不能继承父类构造方法这我们知道,当把父类的属性私有话以后,我在子类里面创建一个有参的构造方法,打印输出的时候难道不是输出我子类的属性?这里为什么会错?我要怎么样做才能在子类中获取父类的私有属性
请详尽的解答,谢谢!
作者: 沙迦    时间: 2015-5-1 09:59
用get/set方法加上吧
  然后用get方法获取就可以了

作者: 728503435    时间: 2015-5-1 10:01
注意:1.是子类获取父类的私有属性。不是父类对外提供方法获取。2.System.out.println("name="+name+",age="+age+"degree="+degree)为什么不行,我建立子类对象后难道不是子类具备了这些属性,子类对象初始化在我写的这串代码里面是怎开始的,为什么没有给它赋值上Name和Age
作者: major2015    时间: 2015-5-1 10:09
在父类中创建公有访问方法
作者: wangyu    时间: 2015-5-1 10:21
private 修饰后只能在本类中访问,你子类的有参构造通过super(name,age)调用父类的有参构造是可以访问的,也就是说这个name和age的赋值动作应该是做了,但是在子类中是不能通过show方法去访问name和age的,因为他在父类之外。这里你可以在子类的show方法中试着调用父类的show方法,应该可以。我是这么想的,不一定对
作者: wangyu    时间: 2015-5-1 10:27
728503435 发表于 2015-5-1 10:01
注意:1.是子类获取父类的私有属性。不是父类对外提供方法获取。2.System.out.println("name="+name+",age= ...

私有化的属性不能被继承,  我刚才试了,你这里在子类的show方法第一行加上super.show();调用父类的show方法,然后把子类的show方法输出的name和age都去掉就搞定
作者: 728503435    时间: 2015-5-1 11:11
wangyu 发表于 2015-5-1 10:27
私有化的属性不能被继承,  我刚才试了,你这里在子类的show方法第一行加上super.show();调用父类的show ...

你的回答点拨了我,但是还有疑惑:为什么子类可以直接调用父类的方法?如果说继承了,但是我在子类里面重写了show();按道理show()已经被重复了也就是不存在这个方法了,我怎么调用出来的
作者: wangyu    时间: 2015-5-1 11:40
本帖最后由 wangyu 于 2015-5-1 12:05 编辑
728503435 发表于 2015-5-1 11:11
你的回答点拨了我,但是还有疑惑:为什么子类可以直接调用父类的方法?如果说继承了,但是我在子类里面重 ...

子类确实重写了父类的show方法,但是不是说父类的show方法就不存在了。这个过程就相当于这样:首先子类继承了父类的show方法,这个show方法在子类里面隐形存在,然后你重写了show方法,就覆盖了这个从父类里面继承来的show方法,但是父类中的show方法还是没有改变的。所以要调用父类的show方法就要用super。你可以这么想,因为比较好理解,虽然结果一样,但实际过程肯定不是这样,具体是怎样我也不知道,我目前就是这么想的
作者: Chans_宇    时间: 2015-5-1 11:59
Java的跨平台性依赖于虚拟机,虚拟机的工作只是引用计算机资源来完成相关操作,所以继承父类成员属性和成员方法,其实只是做引用操作运算来实现现实生活中的逻辑关系,这样能大大提高运算效率,因此这里说的继承并不是说子类重新定义了自己的属性,它只是对父类成员属性进行了引用,至于怎么引用,关键实在子类的构造方法流,当父类没有自己定义带参构造方法时,子类若自己没引用父类的构造方法时都是默认第一行引用的是父类空参构造方法,相信许多人会对super和this这两个关键字感到疑惑,其实这就是我们一直听别人说万物皆对象一个体现,super代表父类,this代表子类,是直接把类当作一个对象来看待了,所以super可以直接调用父类的私有成员,这里无论实例对象是直接由子类去创建还是还是根据多态引用父类实现,实例化对象的属性都只是自己在堆内存里开辟空间独立存放的,无论引用哪一个,父类子类都只是实例对像的模板而已,因此this和super的主要作用就是用来区分实例化对象究竟是用哪一种方式对自己的成员属性和方法进行引用。这里的概念一定要区分开来。
以上内容纯手打,都是我自己总结,若有谬误希望大家指正,同时希望能够对你有多帮助。

作者: 728503435    时间: 2015-5-1 21:39
Chans_宇 发表于 2015-5-1 11:59
Java的跨平台性依赖于虚拟机,虚拟机的工作只是引用计算机资源来完成相关操作,所以继承父类成员属性和成员 ...

那么问题来了,子类为什么不能直接输出自己的属性  public void show() {
System.out.println("name="+name+",age="+age+"degree="+degree);//这个地方报错: 错误: name可以在 Student中访问private
这个问题到底错在哪里。我自己给自己赋值了,自己却不能输出?
作者: 728503435    时间: 2015-5-1 21:43
Chans_宇 发表于 2015-5-1 11:59
Java的跨平台性依赖于虚拟机,虚拟机的工作只是引用计算机资源来完成相关操作,所以继承父类成员属性和成员 ...

你还是没明白我的问题,就像我疑惑的为什么在子类里面无法输出打印name 和age,无论私有不私有我自己在自己的类中调用自己的属性和方法是没有问题的啊?
这就是我的疑惑的
作者: 黑马杜浔    时间: 2015-5-1 23:01
子类不能继承父类私有的属性,只能通过在父类中使用set/get方法对外提供公共访问
作者: 大西洋    时间: 2015-5-2 00:08
默默的来学习~
作者: 王振光    时间: 2015-5-2 02:02
访问的顺序。 现在子类中找是否有name,age。这个字段。没有在父类中找。但是被private修饰,所以不能直接访问。
按照你的说法。我继承了一个类,子类就能直接使用私有的属性。私有这种东西有必要存在么。  任何一个类的私有属性,我只要继承它就可以任意的访问。。这样的私有没有任何意义
作者: 907888614    时间: 2015-5-2 02:14
在undergrajuate类中声明两个变量 name,和age  就OK了。你子类中没有声明。你传入名字的赋给子类的name,age。你父类私有了。访问name去哪里访问?
作者: 907888614    时间: 2015-5-2 02:25
也可以这么理解,子类super(name,age)子类调用父类构造方法。this是undergraduate。赋值之后但是你子类没有在定义变量name ,age所以虚拟机是找不到这两个变量的
作者: Chans_宇    时间: 2015-5-2 04:01
本帖最后由 Chans_宇 于 2015-5-2 04:07 编辑
728503435 发表于 2015-5-1 21:43
你还是没明白我的问题,就像我疑惑的为什么在子类里面无法输出打印name 和age,无论私有不私有我自己在自 ...

你没明白我的解释,你子类根本没初始化定义name和age,这两个成员变量都只是引用父类,只有degree这个成员变量是你子类自己定义的,我当初也是你这样想,回去再琢磨一下。俺技术分快够了,后面许多知识点还要自己琢磨,先撤了:loveliness:
作者: 728503435    时间: 2015-5-2 17:53
王振光 发表于 2015-5-2 02:02
访问的顺序。 现在子类中找是否有name,age。这个字段。没有在父类中找。但是被private修饰,所以不能直接 ...

是去父类找啊:super(age,name);它不就是找到了吗,这个时候我的构造函数把它覆盖,然后在下面打印输出为什么不行?难道说找到了其实还在父类里面,那么我的子类初始化又是怎么完成的?这是个矛盾的问题。
作者: 728503435    时间: 2015-5-2 17:56
Chans_宇 发表于 2015-5-2 04:01
你没明白我的解释,你子类根本没初始化定义name和age,这两个成员变量都只是引用父类,只有degree这个成员 ...

我引用了,如果只是引用我的子类初始化怎么完成?我初始化怎么导入的(name,age),没导入初始化我怎么重复,不重复的话就算我用方法调用的时候为什么出来的是我初始化的name 和age
作者: 黑马TYR    时间: 2015-5-2 22:15
你可以这么想,你在子类中调用父类属性或方法时,Super. name或Super.show()等 此时打印的肯定是父类的,跟子类没有半毛钱关系,对吧?那super(name,age)时,也同样是调用父类构造方法,打印的也必然是父类(所以说构造方法没有覆盖,也是子类必须对父类属性初始化的原因),所以,你只是在帮父类传值,注意!因为这里你把父类属性私有了,所以子类没有继承父类属性,如果父类不私有,也是同样的道理,你子类给父类属性传值了,又继承了父类的属性,在子类调用方法打印时,就能打印出传入的值了
作者: 王振光    时间: 2015-5-2 22:23
标题: 。。。。。。。。。。。。。。。。。。。
本帖最后由 王振光 于 2015-5-3 01:47 编辑
728503435 发表于 2015-5-2 17:53
是去父类找啊:super(age,name);它不就是找到了吗,这个时候我的构造函数把它覆盖,然后在下面打印输出为 ...

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
作者: 石义良    时间: 2015-5-2 22:25
学习了......
作者: 黑马TYR    时间: 2015-5-2 22:39
所以总结就是:1.父类属性你已经私有了,子类不可能有;2.super(name,age)时是父类的属性 3,你重写了show()时,多态时会调用子类的show()而不是父类的,而子类show(){syso(name+age)}省略了this.name和this.age,打印的是本类也就是子类的,但是你子类没有name和age。
如果你一定要私有父类属性又访问父类属性,只能在子类中show(){ super.show() }或利用父类get功能了,记住!!如果你此时你子类又重写了get(),那么同理,你自己分析吧
作者: Chans_宇    时间: 2015-5-2 22:47
728503435 发表于 2015-5-2 17:56
我引用了,如果只是引用我的子类初始化怎么完成?我初始化怎么导入的(name,age),没导入初始化我怎么重 ...

我想我是明白你的意思了,你想要问的虚拟机的底层实现吧?这个我不懂,直接问开发人员比较好,面向过程探讨到这么入微我也是没辙,抱歉。
作者: 728503435    时间: 2015-5-3 15:00
Chans_宇 发表于 2015-5-2 22:47
我想我是明白你的意思了,你想要问的虚拟机的底层实现吧?这个我不懂,直接问开发人员比较好,面向过程探 ...

再次感谢
作者: bboyXiaoNuo    时间: 2015-5-3 15:39
private String name; private int age;
给他们添加public 访问方法
作者: 大可乐    时间: 2015-5-3 16:57
建议有私有成员变量都加上孔参和有参构造,然后set、get!




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