黑马程序员技术交流社区

标题: 继承的一个小问题 [打印本页]

作者: 魏亮    时间: 2012-9-7 17:08
标题: 继承的一个小问题
class Test
{
        public static void main(String[] args)
        {
                Student s = new Student("lisi");
                System.out.println(s.getName());\\ 输出结果为lisi
        }
}
class Person
{
        private String name;  \\如果这句话不加private,我可以理解,加上的话,String name 这个属性应该对子类隐藏了呀,
        Person(String name)  \\那为什么子类对象的引用,通过getName()  方法还可以获取到呢??
        {
                this.name=name;
        }
        void setName(String name)
        {
                this.name=name;
        }
        String getName()
        {
                return name;
        }
}
class Student extends Person
{
        Student(String name)
        {
                super(name);
        }
}

求指教........................




作者: 魏-玉-彪    时间: 2012-9-7 17:11
{:soso_e183:}
作者: 广驰    时间: 2012-9-7 17:15
本帖最后由 应广驰 于 2012-9-7 17:17 编辑

因为子类继承了父类所有的东西,包括getName() 方法和变量,所以Student类就有了自己的String name和getName() 方法,调用的其实可以算是自己的方法

String name的隐藏是针对其他调用来说的,也就是说外界是无法直接操作String name这个变量的,必须调用getName()
作者: 尤洋    时间: 2012-9-7 17:25
答案其实很简单
关键点就一个:private的作用范围
它只是对于自己以外的类保持私有,而在本类中则没有限制 依然可以随便调用。
本类中对外public 的get方法能随意调用private修饰的内容,所以子类只需要调用这个公共方法就可以了。
作者: 杨习平    时间: 2012-9-7 17:37
本帖最后由 杨习平 于 2012-9-7 17:42 编辑

(1)子父类中的成员关系
                A:成员变量
                        在子类方法中使用一个变量时:
                        首先,在方法的局部变量中找这个变量,有则使用。
                        否则,在本类中找成员变量,有则使用。
                        否则,在父类中找成员变量,有则使用。
                        否则,报错。
                B:成员方法
                        用子类对象使用一个方法时。
                        首先,在子类中找这个方法,有则使用。
                        否则,在父类中找这个方法,有则使用。
                        否则,报错。

                        当子父类中的方法名相同时的现象被称为重写。

                        重写和重载的区别?
                        重载:在同一类中。方法名相同,参数列表不同。

                        重写:在不同类中(子父类中)。
                              方法声明相同(返回类型,方法名,参数列表)。

                        重载可以改变返回类型。

                        重写需要注意:
                                **子类方法的访问权限要大于等于父类方法的访问权限。
                                **静态只能重写静态。一般不会出现。
                C:构造方法
                        **子类的实例化过程
                                ***子类创建对象时,会先去创建父类的对象。
                                    默认是去调用父类的无参构造方法。
                                ***子类构造方法中,第一行默认是super()
                                ***为什么子类中第一行会默认有super()
                                        因为他继承父类的成员使用,使用前这些成员必须初始化,
                                        而他们是父类的成员,所以,必须通过父类进行初始化。
                                        所以,会先创建一个父类的对象。
                        **当父类没有无参构造方法时
                                必须使用this或者super调用其他的构造方法。
        (2)this和super的区别
                this:代表本类对象的引用。
                super:代表父类的存储空间。

                用法很相似。
==========================================
public class Stings {
                public static void main(String[] args)
                {
                        Student s = new Student("lisi");
                        Person ps=new Student("jing");//这样他们是也按照父类的方法执行和调用方法
                        Person p=new Person("yesno");
                        System.out.println(ps.getName());
                        System.out.println(p.getName());
                        
                        System.out.println(s.getName());// 输出结果为lisi
                }
        }
class Person
        {
                private String name;  //如果这句话不加private,我可以理解,加上的话,String name 这个属性应该对子类隐藏了呀,
                Person(String name)  //那为什么子类对象的引用,通过getName()  方法还可以获取到呢??
                {
                        this.name=name;
                }
                void setName(String name)
                {
                        this.name=name;
                }
                String getName()
                {
                        return name;
                }
        }
        class Student extends Person
        {
                Student(String name)
                {
                        super(name);                }
        }

父类只是将一个变量用private修饰,如果不继承,就是不让其他外界的类使用和调用本属性,但
你这里已经继承了Person类,里面的方法都被子类继承并自己使用,而子类中也有带参构造,所以你对这里的private
理解可能偏了一点。那你看看上面总结吧。子父类关系 super的用法。
作者: 张飞年    时间: 2012-9-7 17:48
用一句话回答你的问题就是:被private 的name的确是成了父类私有成员。下面是子类调用父类有参构造函数,父类有参构造函数并没有被private,所以子类可以直接调用。
作者: 魏亮    时间: 2012-9-7 20:48
明白了,谢谢




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