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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 兜兜转转 中级黑马   /  2013-8-26 01:38  /  1802 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 forward 于 2013-8-26 21:40 编辑

public class AbstractDeno2
{

        public static void main(String[] args)
        {
        Manager m = new Manager("Ansen","S13006540",8900.0 , 10000.0 );
        m.working();
        System.out.println(m.getName()+" "+m.getWorkid()+" "+m.getSalary()+" "+m.getBonus());
        }

}

/*
假如在开发一个系统时需要对员工进行建模,员工有3个属性:
姓名、工号以及工资,经理也是员工,除了含有员工的属性外。
还有一个奖金属性,请使用继承的思想设计出员工类和经理类,
要求类中提供必要的方法进行属性访问。
*/
abstract class Employee
{
         private String name;
         private String workid;
         private double salary;
         public abstract void working();
         public Employee(String name , String workid,double salary)
         {
                 this.name = name ;
                 this.workid =workid;
                 this.salary = salary;
         }
        public String getName()
        {
                return name;
        }
        public void setName(String name)
        {
                this.name = name;
        }
        public String getWorkid()
        {
                return workid;
        }
        public void setWorkid(String workid)
        {
                this.workid = workid;
        }
        public double getSalary()
        {
                return salary;
        }
        public void setSalary(double salary)
        {
                this.salary = salary;
        }
         
}

class General extends Employee
{
          public General(String name , String workid, double salary)
          {
                  super(name , workid, salary);
          }
          public void working()
          {
                    System.out.println("我是个普通的工人,我正在车间工作!");
          }
}
class Manager extends Employee
{
         private double bonus;
          public Manager(String name , String workid, double salary, double bonus)
          {
                  super(name , workid, salary);
                  this.bonus = bonus;
          }
          public void working()
          {
                   System.out.println("我是公司经理,正在和各位主管们开会!");
          }
        public double getBonus()
        {
                return bonus;
        }
        public void setBonus(double bonus)
        {
                this.bonus = bonus;
        }
         
}


子类继承父类时候,能不能继承父类的私有属性和方法?可是为什么上面的代码能执行成功呢?

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 神马都是浮云

查看全部评分

8 个回复

倒序浏览
又到大半夜了。。又到了赚技术分的时间了。。
本来写好了一大段的,但是手贱不小心把网页关了。害我重写。。
private等4个关键字,字面意思是“访问权限控制符”。并不关继承什么事。它只是管访问权限的。
在大多数的java课程,java文献中都说到”子类拥有所有父类属性和方法“。
但是因为其属性是private的,私有化的,即便你是子类,也不能直接访问我的属性。
这段代码:
System.out.println(m.getName()+" "+m.getWorkid()+" "+m.getSalary()+" "+m.getBonus());
之所以能够正常运行,是因为使用了public定义的,公共的get方法。使得其能够返回来需要的属性。
如果你直接使用m.name这样的形式的话,就绝对报错咯。
如果你连get方法都定义成private的了,那就真的没得搞的了。
打个最生动的比喻,小明的爸爸拥有一大笔财产,用保险柜藏起来了(私有化),小明继承了爸爸的所有东西,包括他的一大笔财产,但是,这笔财产仍然是在保险柜里面的(访问权限仍然是private)。这时候儿子要用这笔钱了,不能直接用。只能用一把叫做getMoney的工具来拿钱(就是public的get方法)。
最终这个getMoney就给他返回来了财产了。小明就可以去买东西了。。。七喜可乐七喜可乐。

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 很给力!

查看全部评分

回复 使用道具 举报
子类继承父类时候,能不能继承父类的私有属性和方法?可是为什么上面的代码能执行成功呢?

私有的属性和方法是不提供别人操作的,
但如果你提高操作的接口,也就是如果你封装了对象,并且提供其他对象访问的接口。
那么私有的属性和方法就可以通过接口供其他对象操作,但其他对象是不能直接操作私有的属性和方法的。

就好比电脑主机,你可以使用接口,但你不能直接触摸主板。这样既方便又安全。--java的封装性。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
私有的属性和方法不能被继承。
回复 使用道具 举报
.....淡定 发表于 2013-8-26 08:17
私有的属性和方法不能被继承。

public General(String name , String workid, double salary)
          {
                  super(name , workid, salary);
          }

如果不能继承,我这里明显是用父类的构造方法为 name  和workid, salay初始化赋值了呀?
super(name , workid, salary);不就是这样吗?  this.name = name .........吗?
应该是可以继承,但不能直接操作吧?

回复 使用道具 举报
私有的是不可以访问的 只有公有的才可以,属性是私有的,但是你提供了通道了呀,一个是有参数的构造,这个通道可以给赋值,还有公有的getter setter 方法 也是可以赋值的 私有属性是不让你随意赋值,所以一般都是在有参构造啊 或者get set方法中进行控制,这就是封装,把属性隐藏起来

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
1、是的,除了JAVA中,子类继承父类的所有方法和属性(构造方法要用关键字super([参数])调用)
另外,当父类的方法或属性被声明为private(私有的)时,子类也是不可以继承的。
2、继承是JAVA中一个重要的特色,便于程序的编写,提高代码的重用性。

private 的属性和方法是不能被继承的。
能继承public,default,protected 的属性和方法。

因为父类就是子类的模板,当然能继承,但是private只有对类本身才具有可见性,所以子类不能继承其方法和属性。



评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报

楼主,如果问题解决了,请把问题的未解决更改为已解决,谢谢合作,

更改方法:http://bbs.itheima.com/thread-71308-1-1.html
回复 使用道具 举报
我知道可以提供公开的方法进行对私有成员的操作和设置,但是我问的是,这几个私有属性是不是已经被子类继承过来了呢?
public General(String name , String workid, double salary)
          {
                  super(name , workid, salary);//这个到底是给父类对象赋值还是子类对象属性赋值?
          }

System.out.println(m.getName()+" "+m.getWorkid()+" "+m.getSalary()+" "+m.getBonus());这个有是打印父类对象的属性值还是子类的呢?

可以麻烦把内存图画画,让小弟看看?我觉得是可以继承,不能直接访问和操作。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马