黑马程序员技术交流社区

标题: 子类继承父类的的问题 [打印本页]

作者: 兜兜转转    时间: 2013-8-26 01:38
标题: 子类继承父类的的问题
本帖最后由 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;
        }
         
}


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

作者: gulup    时间: 2013-8-26 02:25
又到大半夜了。。又到了赚技术分的时间了。。
本来写好了一大段的,但是手贱不小心把网页关了。害我重写。。
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就给他返回来了财产了。小明就可以去买东西了。。。七喜可乐七喜可乐。
作者: javamov    时间: 2013-8-26 04:26
子类继承父类时候,能不能继承父类的私有属性和方法?可是为什么上面的代码能执行成功呢?

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

就好比电脑主机,你可以使用接口,但你不能直接触摸主板。这样既方便又安全。--java的封装性。
作者: .....淡定    时间: 2013-8-26 08:17
私有的属性和方法不能被继承。
作者: 兜兜转转    时间: 2013-8-26 09:26
.....淡定 发表于 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 .........吗?
应该是可以继承,但不能直接操作吧?


作者: 穿靴子的猫    时间: 2013-8-26 11:03
私有的是不可以访问的 只有公有的才可以,属性是私有的,但是你提供了通道了呀,一个是有参数的构造,这个通道可以给赋值,还有公有的getter setter 方法 也是可以赋值的 私有属性是不让你随意赋值,所以一般都是在有参构造啊 或者get set方法中进行控制,这就是封装,把属性隐藏起来
作者: xinchenglong    时间: 2013-8-26 15:25
1、是的,除了JAVA中,子类继承父类的所有方法和属性(构造方法要用关键字super([参数])调用)
另外,当父类的方法或属性被声明为private(私有的)时,子类也是不可以继承的。
2、继承是JAVA中一个重要的特色,便于程序的编写,提高代码的重用性。

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

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




作者: 杨增坤    时间: 2013-8-26 21:03

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

更改方法:http://bbs.itheima.com/thread-71308-1-1.html

作者: 兜兜转转    时间: 2013-8-27 07:57
我知道可以提供公开的方法进行对私有成员的操作和设置,但是我问的是,这几个私有属性是不是已经被子类继承过来了呢?
public General(String name , String workid, double salary)
          {
                  super(name , workid, salary);//这个到底是给父类对象赋值还是子类对象属性赋值?
          }

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

可以麻烦把内存图画画,让小弟看看?我觉得是可以继承,不能直接访问和操作。




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