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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张世钦 中级黑马   /  2013-1-26 12:56  /  1779 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 zhangshisk 于 2013-1-27 12:36 编辑

代码如下:
class Fu
{
        private String name;
        Fu(String name)
        {
                this.name = name;
        }
}
class Zi extends Fu
{
        private int age;
        Zi(String name,int age)
        {
                super(name);//----------------->问:这样写可以吗?调用父类构造初始化name后Zi还是没有name.
                this.age = age;
        }
        void show()
        {
                //System.out.println(this.name+"......"+this.age);//如果打印子类的name和age报错.
        }
}

class Test
{
        public static void main(String[] args)
        {
                Zi z = new Zi("子类",100);
        }
}

老毕的视频里有类似的写法,参见:java基础-d07-     10-抽象类练习
父类的私有属性在子类构造函数调用父类构造函数初始化后,子类还是没有该属性.难道要子类再定义一个name去接受初始化后的name???

好疑惑啊!!!!!把我都搞晕了,完全混乱了......

7 个回复

倒序浏览
本帖最后由 zhangshisk 于 2013-1-26 12:59 编辑

附上老毕的源码:

/*
假如我们在开发一个系统时需要对员工进行建模,员工包含 3 个属性:
姓名、工号以及工资。经理也是员工,除了含有员工的属性外,另为还有一个
奖金属性。请使用继承的思想设计出员工类和经理类。要求类中提供必要的方
法进行属性访问。

员工类:name id pay

经理类:继承了员工,并有自己特有的bonus。

*/

class Employee
{
        private String name;
        private String id;
        private double pay;

        Employee(String name,String id,double pay)
        {
                this.name = name;
                this.id = id;
                this.pay = pay;
        }
        
        public abstract void work();

}

class Manager extends Employee
{
        private int bonus;
        Manager(String name,String id,double pay,int bonus)
        {
                super(name,id,pay);//--------------------------->这里
                this.bonus = bonus;//--------------------------->这里
        }
        public void work()
        {
                System.out.println("manager work");
        }
}

class Pro extends Employee
{
        Pro(String name,String id,double pay)
        {
                super(name,id,pay);// --------------------------->这里
        }
        public void work()
        {
                System.out.println("pro work");
        }
}

class  
{
        public static void main(String[] args)
        {
                System.out.println("Hello World!");
        }
}
回复 使用道具 举报
那里子类调用name  要改成这样吧:
void show()
        {
                //System.out.println(super.name+"......"+this.age);//如果打印子类的name和age报错.
        }
回复 使用道具 举报
bruthe 发表于 2013-1-26 14:01
那里子类调用name  要改成这样吧:
void show()
        {

我是想打印子类的name....
回复 使用道具 举报
本帖最后由 罗广伟 于 2013-1-26 19:18 编辑

因为父类中name是私有的子类是无法使用的也不会继承,如果你想在子类中打印name必须在子类中定义name
如果你想把父类name值赋给子类那么必须在父类中创建一个对外公开的方法输出值
可以父类中定义
public String getname()
{
        return name;
}
子类中改为
private String name;        
Zi(String name,int age)
        {
                super(name);
                this.age = age;
                this.name= super.getname();
        }
回复 使用道具 举报
本帖最后由 陈圳 于 2013-1-26 23:07 编辑

子类与父类的关系之间的访问权限不明确,
private成员是不能被子类访问的.
要通过对外接口提供方法.
给你一段我刚写的:
class fu
{
private String name;
fu(){}
fu(String name)
{
  this.name=name;
}
public String nameInter()
{
  return this.name;
}
void show()
{
  System.out.println(this.name);
}
}
class zi extends fu
{
private int age;
zi(){}
zi(String name,int age)
{
  super(name);
  this.age=age;
}
void show()
{
  System.out.println(this.nameInter()+":"+this.age);
}
}
class text
{
public static void main(String[] args)
{
  fu f=new fu("赵氏");
  zi z=new zi("赵本山",62);
  f.show();
  z.show();
}
//打印结果:赵氏
                赵本书,62
回复 使用道具 举报
私有成员是没有被继承的,你的子类中都没有这个元素。所以访问失败的。你可以把这些子类需要继承的元素定义为Public或者Protect,不要定义为私有的。
回复 使用道具 举报
私有属性private name只能在类内部使用,不能通过obj.name在类外引用
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马