黑马程序员技术交流社区
标题:
私有,构造函数,super的相关疑问
[打印本页]
作者:
张世钦
时间:
2013-1-26 12:56
标题:
私有,构造函数,super的相关疑问
本帖最后由 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???
好疑惑啊!!!!!把我都搞晕了,完全混乱了......
作者:
张世钦
时间:
2013-1-26 12:56
本帖最后由 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!");
}
}
作者:
吴在兴
时间:
2013-1-26 14:01
那里子类调用name 要改成这样吧:
void show()
{
//System.out.println(super.name+"......"+this.age);//如果打印子类的name和age报错.
}
作者:
张世钦
时间:
2013-1-26 14:32
bruthe 发表于 2013-1-26 14:01
那里子类调用name 要改成这样吧:
void show()
{
我是想打印子类的name....
作者:
罗广伟
时间:
2013-1-26 19:14
本帖最后由 罗广伟 于 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 22:50
本帖最后由 陈圳 于 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
作者:
dzr19850306
时间:
2013-1-27 08:50
私有成员是没有被继承的,你的子类中都没有这个元素。所以访问失败的。你可以把这些子类需要继承的元素定义为Public或者Protect,不要定义为私有的。
作者:
逍林游
时间:
2013-1-27 10:08
私有属性private name只能在类内部使用,不能通过obj.name在类外引用
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2