黑马程序员技术交流社区

标题: 对象调用类输出问题 [打印本页]

作者: Johnny_Hu    时间: 2015-3-12 16:28
标题: 对象调用类输出问题
  1. public class AbstractDemo {

  2.         public static void main(String[] args) {
  3.                 Pro pro = new Pro("胡平燕", "112", 1000);
  4.                 Manager manager = new Manager("胡平燕22", "113", 3000, 500);
  5.                 pro.work();
  6.                 System.out.println("\t" + pro);
  7.                 manager.work();
  8.                 System.out.println("\t" + manager);
  9.         }

  10. }

  11. abstract class Employee {
  12.         private String name;
  13.         private String id;
  14.         private double pay;

  15.         Employee(String name, String id, double pay) {
  16.                 this.name = name;
  17.                 this.id = id;
  18.                 this.pay = pay;
  19.         }

  20.         void work() {

  21.         }
  22. }

  23. class Pro extends Employee {
  24.         Pro(String name, String id, double pay) {
  25.                 super(name, id, pay);
  26.         }

  27.         void work() {
  28.                 System.out.print("普通员工");
  29.         }
  30. }

  31. class Manager extends Employee {
  32.         private int bonus;

  33.         Manager(String name, String id, double pay, int bonus) {
  34.                 super(name, id, pay);
  35.                 this.bonus = bonus;
  36.         }

  37.         void work() {
  38.                 System.out.print("公司经理");
  39.         }
  40. }
复制代码
输出 对象调用的函数参数出现这个普通员工        Pro@15db9742
公司经理        Manager@6d06d69c  

请问什么原因呢  谢谢

作者: yangruijing    时间: 2015-3-12 16:42
在你的程序中,向输出语句中直接传递了对象名作为参数,那么输出结果将会是变量的地址,而非其所指向的内容
更改后的程序:
public class AbstractDemo {
    public static void main(String[] args) {
            Pro pro = new Pro("胡平燕", "112", 1000);
            Manager manager = new Manager("胡平燕22", "113", 3000, 500);
            pro.work();
            System.out.println("\t" + pro.getName()+" "+pro.getId()+" "+
            pro.getPay());
            manager.work();
            System.out.println("\t" + manager.getName()+" "+manager.getId()+" "+
            manager.getPay()+" "+manager.getBonus());
    }

}
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;
        }
        void work(){}
}
class Pro extends Employee {
    Pro(String name, String id, double pay) {
            super(name, id, pay);
    }
    void work() {
            System.out.print("普通员工");
    }
}
class Manager extends Employee {
    private int bonus;
    Manager(String name, String id, double pay, int bonus) {
            super(name, id, pay);
            this.bonus = bonus;
    }
    public int getBonus() {
                return bonus;
        }
        public void setBonus(int bonus) {
                this.bonus = bonus;
        }
        void work() {
            System.out.print("公司经理");
    }
}


捕获.JPG (34.13 KB, 下载次数: 0)

捕获.JPG

作者: Johnny_Hu    时间: 2015-3-12 17:47
yangruijing 发表于 2015-3-12 16:42
在你的程序中,向输出语句中直接传递了对象名作为参数,那么输出结果将会是变量的地址,而非其所指向的内容 ...

你用了 set跟get方法
那我要是没有 私有化呢  
作者: 万合天宜    时间: 2015-3-12 17:59
本帖最后由 万合天宜 于 2015-3-12 18:01 编辑
  1. public class AbstractDemo {
  2.      public static void main(String[] args) {
  3.              Pro pro = new Pro("胡平燕", "112", 1000);       // 创建对象并初始化,赋值
  4.              Manager manager = new Manager("胡平燕22", "113", 3000, 500);         // 创建对象并初始化,赋值
  5.              pro.work();                                               // 调用pro的work方法,输出普通员工
  6.              System.out.println("\t" + pro);                // 直接输出pro这个对象的引用,打印的是对象的地址值
  7.              manager.work();                                      // 调用manager的work方法,输出公司经理
  8.              System.out.println("\t" + manager);       // 直接输出manager这个对象的引用,打印的是对象的地址值
  9.      }
  10. }
  11. 注意:打印的时候,直接打印对象引用是输不出对象的属性的,必须调用相应的get方法。你用的构造函数只是在对象创建的时候进行了赋值,并未申请其获取对应得get方法。
复制代码



作者: ㏒假™面具    时间: 2015-3-12 18:04
本帖最后由 ㏒假™面具 于 2015-3-12 18:18 编辑

1.没有重写toString()方法。2.最好是添加set()和get()方法



作者: yangruijing    时间: 2015-3-12 18:33
Johnny_Hu 发表于 2015-3-12 17:47
你用了 set跟get方法
那我要是没有 私有化呢

没有私有化可以直接用对象名得到属性值,如:pro.name
作者: Johnny_Hu    时间: 2015-3-12 20:31
yangruijing 发表于 2015-3-12 18:33
没有私有化可以直接用对象名得到属性值,如:pro.name

:)太感谢了  
作者: Johnny_Hu    时间: 2015-3-12 21:09
万合天宜 发表于 2015-3-12 17:59
  1. package Extends.hupingyan.Extends;

  2. public class ExtendsDemo {

  3.         //Employee Pro Manager
  4.         public static void main(String[] args)
  5.         {
  6.                 Manager manager = new Manager("李鸿章", "11", 2000, 200);
  7.                 Pro pro = new Pro("袁世凯", "22", 1000);
  8.                 manager.Print();
  9.                 String name1 = manager.getName()+"\t"+manager.getId()+"\t"+manager.getPay()+"\t"+manager.getBonus();
  10.                 System.out.println(name1);
  11.                 String name2 = pro.getName()+"\t"+pro.getId()+"\t"+pro.getPay();
  12.                 pro.Print();
  13.                 System.out.println(name2);
  14.         }
  15.        
  16. }
  17. abstract class Employee
  18. {
  19.         private String name;
  20.         private String id;
  21.         private double pay;
  22.        
  23.         public String getName() {
  24.                 return name;
  25.         }
  26.         public void setName(String name) {
  27.                 this.name = name;
  28.         }
  29.         public String getId() {
  30.                 return id;
  31.         }
  32.         public void setId(String id) {
  33.                 this.id = id;
  34.         }
  35.         public double getPay() {
  36.                 return pay;
  37.         }
  38.         public void setPay(double pay) {
  39.                 this.pay = pay;
  40.         }
  41.         Employee(String name,String id,double pay)
  42.         {
  43.                 this.name = name;
  44.                 this.id = id;
  45.                 this.pay = pay;
  46.         }
  47.         public abstract void Print();
  48. }

  49. class Manager extends Employee
  50. {
  51.         private int bonus;
  52.        
  53.         public int getBonus() {
  54.                 return bonus;
  55.         }
  56.         public void setBonus(int bonus) {
  57.                 this.bonus = bonus;
  58.         }
  59.         Manager(String name,String id,double pay,int bonus)
  60.         {
  61.                 super(name,id,pay);
  62.                 this.bonus = bonus;
  63.         }
  64.         @Override
  65.         public void Print()
  66.         {
  67.                 System.out.print("经理的工资"+"\t");
  68.         }
  69. }

  70. class Pro extends Employee
  71. {
  72.         Pro(String name,String id,double pay)
  73.         {
  74.                 super(name,id,pay);
  75.         }
  76.         @Override
  77.         public void Print()
  78.         {
  79.                 System.out.print("普工的工资"+"\t");
  80.         }
  81. }
复制代码

作者: 殷俊    时间: 2015-3-12 22:49
不能直接在输出打印里调用类名,这样的话,就出现的是你那样的结果,@号后面的是类名建立的对象的哈希地址,还有就是你的父类既然是抽象的,那父类里的方法也要是抽象的才好




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