黑马程序员技术交流社区

标题: 关于抽象类构造函数的问题? [打印本页]

作者: 廖超超    时间: 2012-8-3 19:09
标题: 关于抽象类构造函数的问题?
本帖最后由 liaochao 于 2012-8-3 22:00 编辑

//建立共性内容 雇员
abstract class Employee
{
private String name; //名字
private String id; //员工编号
private double pay;//薪水
private double bonus ;//奖金
Employee(String name,String id,double pay){
  this.name = name;
  this.id = id;
  this.pay = pay;
}
Employee(String name,String id,double pay,double bonus){
this(name,id,pay);  this.bonus = bonus;
}
  public abstract void work();//抽象方法
public void show(){
  System.out.println("名字:"+name+"\t员工编号:" +id+"\t薪水"+pay+"奖金"+bonus);
}
}
//描述程序员
class Programmer extends Employee
{
Programmer(String name,String id,double pay){
  super(name,id,pay);
}
public void work(){//复写其抽象方法
  
  System.out.println("工作是编写代码");
}
}
//描述经理
class Manager extends Employee
{
Manager(String name,String id,double pay,double bonus){
  super(name,id,pay,bonus);
  }
public void work(){
  System.out.println("工作是管理程序员");
}
}
class Abstract //主类
{
public static void main(String[] args){
  Programmer pr = new Programmer("张三","技术部01",3000);
  Manager ma = new Manager("王五","经理",9000, 5000);
  
  pr.show();
  pr.work();
  ma.show();
  ma.work();
}
}

作者: 官文昌    时间: 2012-8-3 21:31
你这是方法调用方法啊,不能用this的,this不要和super混淆了,你在这里调用上面的方法,直接用方法名调用啊~~~
作者: 戎石锁    时间: 2012-8-3 21:57
//建立共性内容 雇员
abstract class Employee
{
        private String name; //名字
        private String id; //员工编号
        private double pay;//薪水
        private double bonus ;//奖金
        Employee(String name,String id,double pay)
        {
                this.name = name;
                this.id = id;
                this.pay = pay;
        }
        Employee(String name,String id,double pay,double bonus)
        {
                this.(name,id,pay);//想这里访问另外一个构造函数,但他的类的是抽象的,使用this他说需要标识符。怎么修改这句话???
//this.(name,id,pay); 应该是这样的

                this.bonus = bonus;
        }
        public abstract void work();//抽象方法
        public void show()
        {
                System.out.println("名字:"+name+"\t员工编号:" +id+"\t薪水"+pay);
        }
        public void show()
        {
                System.out.println("名字:"+name+"\t员工编号:" +id+"\t薪水"+pay+"奖金"+bonus);
        }
}
//描述程序员
class Programmer extends Employee
{
        Programmer(String name,String id,double pay)
        {
                super(name,id,pay);
        }
        public void work()
        {//复写其抽象方法
  
                System.out.println("工作是编写代码");
        }
}
//描述经理
class Manager extends Employee
{
        private double bonus; //奖金
        Manager(String name,String id,double pay,double bonus)
        {
                super(name,id,pay);
                this.bonus = bonus;
        }
        public void work()
        {
                System.out.println("工作是管理程序员");
        }
}
class Abstract //主类
{
        public static void main(String[] args)
        {
                Programmer pr = new Programmer("张三","技术部01",3000);
                Manager ma = new Manager("王五","经理",9000, 5000);
  
                pr.show();
                pr.work();
                ma.show();
                ma.work();
        }
}
补充一下this用法

this是指对象本身,super则是代表其父类,都是在定义类的时候用到 ;

this关键字只能出现在方法内部,表示调用方法的那个对象的引用,通常情况下编译器会自动帮你添加,只有当你明确指出当前对象的引用时才需要使用this关键字,例如当需要返回当前对象的引用时就常常在return语句里这么写:
object A{
……
return this;
}
      如果想在意个构造器重调用另一个构造器,以避免重复代码,你可以用this做到这一点,在构造器中,如果为this添加了参数列表,那么就有了不同的含义,这将产生对符合此参数列表的摸个构造器的明确调用。但并不能在一个构造器中用相同的方法调用两个构造器,而且必须将this调用构造器这行至于最顶端。
super和this的用法一样  只不过指定的父类对象
作者: 郑小杰    时间: 2012-8-3 22:01
Programmer要继承Employee,那么在Employee里就不应该建立bonus 这个属性,还有show方法应该是抽象函数,不能那样写的
构造函数不是那样写的,哥们你搞得好乱啊,我写了一下你看看


//建立共性内容 雇员
package test;
abstract 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 String getName() {
  return name;
}
public void setName(String name) {
  this.name = name;
}
public String getId() {
  return id;
}
public void setId(String id) {
  this.id = id;
}
public double getPay() {
  return pay;
}
public void setPay(double pay) {
  this.pay = pay;
}

public abstract void work();//抽象方法
public abstract void show();//这个应该是抽象函数


}
//描述程序员
class Programmer extends Employee
{
Programmer(String name,String id,double pay)
{
  super(name,id,pay);
}
public void work()//复写其抽象方法
{
  System.out.println("工作是编写代码");
}
public void show()
{
  System.out.println("名字:"+this.getName()+"\t员工编号:" +this.getId()+"\t薪水"+this.getPay());
}

}
//描述经理
class Manager extends Employee
{
private double bonus; //奖金
Manager(String name,String id,double pay,double bonus)
{
  super(name,id,pay);
  this.bonus = bonus;
}

public void work()
{
  System.out.println("工作是管理程序员");
}

public void show()
{
   System.out.println("名字:"+this.getName()+"\t员工编号:" +this.getId()+"\t薪水"+this.getPay()+bonus);
}
}
class Abstract //主类
{
public static void main(String[] args)
{
  Programmer pr = new Programmer("张三","技术部01",3000);
  Manager ma = new Manager("王五","经理",9000, 5000);
  
  pr.show();
  pr.work();
  ma.show();
  ma.work();
}
}


作者: 林康春    时间: 2012-8-3 22:02
Employee(String name,String id,double pay,double bonus){
this.(name,id,pay);想这里访问另外一个构造函数,但他的类的是抽象的,使用this他说需要标识符。怎么修改这句话???

  this.bonus = bonus;
}
分析: 你这样用this访问另外一个构造函数 ,但因为这个类是抽象的 ,也就是说这个构造函数还没有初始化,还没有存在
要想访问这个构造函数,必须继承这个抽象类,初始化这个构造函数
注意: 抽象类的构造函数在实例化具体子类时被调用
所以,你在抽象类中去调用构造函数,一定会报错的。
作者: 包晗    时间: 2012-8-3 22:29
1:提问贴,主题分类选择“提问”,提问后,问题已经解决了必须及时在贴内回复内容“问题已经解决”。
(如查明问题确实已解决,楼主未在贴内回帖说明,解决后的24小时之内 问题 提问者 扣除 技术分 1分,如有特殊情况请在贴内说明,让管理人员知道你的实际情况)

2:非真实姓名注册论坛用户ID提问,解决问题,不提供任何技术分加分。(非真实姓名发帖,版主和管理人员有权直接关闭贴)
申请论坛改名地址:http://bbs.itheima.com/thread-19719-1-1.html
如果姓名已经有人注册
例如:王鹏 这个ID被注册了,那么你可以改成“黑马-王鹏”“黑马粉-王鹏”“黑马_王鹏”“黑马王鹏”都是可以的!


作者: 廖超超    时间: 2012-8-3 22:44
以解决!




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