问题描述
背景:在跟着视频学习类的继承和函数重写:代码如下classPerson{privateStringname;privateintage;publicvoidsetName(Stringname){this.name=name;}publicvoidsetAge(intage){this.age=age;}publicStringgetName(){returnname;}publicintgetAge(){returnage;}publicStringgetInfo(){return"name:"+name+"n"+"age:"+age;}}classStudentextendsPerson{privateStringschool;publicStringgetSchool(){returnschool;}publicvoidsetSchool(Stringschool){this.school=school;}publicStringgetInfo(){return"name:"+name+"n"+"age:"+age+"n"+"school"+school;}}publicclassTestPerson{publicstaticvoidmain(String[]args){Studentstudent=newStudent();Personperson=newPerson();person.setName("none");person.setAge(11);student.setName("jolin");student.setAge(21);student.setSchool("SCH");System.out.println(person.getInfo());System.out.println(student.getInfo());System.out.println(student.getSchool());}}根据对比我发现要将30行的name改成getName,age改成getAge代码可以成功编译问题1:与17行对比我就很疑惑。既然是继承就包括继承了成员变量name和age为什么这里就不可以直接调用了?问题2:还有我试了下如果把30行的name改成student.name还是不行同样的改成this.name还是出错。这里问题比较杂求大神解答
解决方案
解决方案二:
因为name和age是私有的(private)
解决方案三:
是私有。但是student继承了person。所以student里也应该有name和age。所以调用应该理论上还是可以的。难道是name计算机不识别是student还是person的?那我加了个student.name还是识别不了?
解决方案四:
引用1楼u010779899的回复:
因为name和age是私有的(private)
理论上是不可以的。私有就是私有,虽然student里面有父类的所有属性,但就是没有权限访问。你可以用protected范围。
解决方案五:
私有就是私有,虽然student里面有父类的所有属性,但就是没有权限访问。你可以用protected范围。
解决方案六:
4楼说的对,这两个属性是父类私有的属性,子类无法直接访问,只能通过getset方法来访问。同时,不止是子类无法访问,其他任何一个类都不能直接访问另一个类的私有属性。
解决方案七:
根据对比我发现要将30行的name改成getName,age改成getAge代码可以成功编译问题1:与17行对比我就很疑惑。既然是继承就包括继承了成员变量name和age为什么这里就不可以直接调用了?问题2:还有我试了下如果把30行的name改成student.name还是不行同样的改成this.name还是出错。解析:1)类的私有属性只归其本身所有,其他类访问该属性只能通过该类对外提供的方法访问--类的封装特性2)有我试了下如果把30行的name改成student.name还是不行--student哪来的建议把抽象和类的封装、继承、多态特性好好理解,多练,多分析就好,动手之前多看看书上的分析
解决方案八:
private私有的,不可继承。public公共的,可继承。protected受保护的,可继承。
解决方案九:
父类的private成员和方法,子类可以直接访问吗?答案是不能。