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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 魏亮 中级黑马   /  2012-9-7 17:08  /  1793 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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);
        }
}

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



7 个回复

倒序浏览
{:soso_e183:}
回复 使用道具 举报
本帖最后由 应广驰 于 2012-9-7 17:17 编辑

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

String name的隐藏是针对其他调用来说的,也就是说外界是无法直接操作String name这个变量的,必须调用getName()
回复 使用道具 举报
答案其实很简单
关键点就一个:private的作用范围
它只是对于自己以外的类保持私有,而在本类中则没有限制 依然可以随便调用。
本类中对外public 的get方法能随意调用private修饰的内容,所以子类只需要调用这个公共方法就可以了。
回复 使用道具 举报
本帖最后由 杨习平 于 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的用法。
回复 使用道具 举报
用一句话回答你的问题就是:被private 的name的确是成了父类私有成员。下面是子类调用父类有参构造函数,父类有参构造函数并没有被private,所以子类可以直接调用。
回复 使用道具 举报
明白了,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马