随便写了一个问题
class Employee {    
    int a,b,c;
    void fangfa()
    {
        System.out.println("父类里的方法");
    }
    
    Employee(int aa,int bb,int cc)
    {
        this.a=aa;
        this.b=bb;
        this.c=cc;
    }
     
    public static void main(String args[])
    {
        Employee a=new zilei(2,5,6,"asfdasdf");
        
    }
}class zilei extends Employee
{
    String name;
    zilei(int a,int b,int c,String mingzi)
    {
        super(a,b,c);
    
    }
    
    void function()
    {
        System.out.println("这是子类里的方法");
    
    }
}一直想不明白。谁能告诉我这个Employee a=new zilei(2,5,6,"asfdasdf");
a这个对像到底有哪些成员? 一直不明白。 55555555 谢谢了!

解决方案 »

  1.   

    你在另一个帖子里问过了。
    a是一个Employee type的reference variable;
    它的值指向的是一个zilei的instance。通过a,可以调用这个instance的看得到的方法,变量是看不到的。1,比如书,Employee里有个fangfa(),zilei里有个function(),如果zilei重写了fangfa(),通过a,我们可以调用那个重写的fangfa(),那个function是a看不到的。2,zilei的变量是通过a看不到的。
      

  2.   

    哈哈,我也是学到这个地方了.给你这么说吧
    (父类)Employee a=new (子类)zilei();   子类继承父类,里面有子类对父类方法的覆盖
    a 里面有父类的属性,当调用方法时,会调用子类的
      

  3.   

    在Java语言中,对象变量是多态的.也就是说超类的对象变量可以引用子类的对象.
    这是"is-a"关系,就是说,每一个子类的对象都是一个超类的对象.
    例如,每一个经理都是一个雇员.所以每一个经理都能引用其超类雇员中定义的通用方法(除了覆盖的情况)
    你问这个问题还不是要解决方法引用的问题,在java中方法的引用过程叫做"动态帮定"每一个方法都有一个标签,既方法名字和方法函数(方法返回值不算),在引用方法的时候系统会自动查找有相同标签的方法.对于你这个例子,超类是"Employee"子类是"zilei"
    你用"Employee"的对象变量引用了"zilei"的对象这是一个多态的过程.(不过子类对象变量能不能引用超类对象,或者其他无关的类对象我还不太清楚,研究ing),而在具体调用类的方法的时候是一个动态绑定的过程,如果调用function()系统就直接调用字类的方法,如果调用fangfa()系统就调用超类的方法.(如果覆盖了,就调用覆盖后的方法)
      

  4.   

    你这个class zilei :中的    String name;怎么没有在zilei构造器中负值呀!!还有那个 a 是一个子类的对象,但是被一个父类的引用变量引用。因此 a 中只能对父类中的一些成员可见:
     而对于function()是不可见的 也就是说你可以写a . fangfa()  但是不能写  a .function()明白了吗?
      

  5.   

    limxu() ( )  
     
       楼上的说错了吧...
      楼上的没有说错,是你错了,你说的根本行不通,确实是不能a.function();
    这样会找不到符号,因为它确实是不能调用子类中的方法
     
      

  6.   

    Employee a=new zilei(2,5,6,"asfdasdf");
    这种写法没意义的,怎么能用"Employee"的构造器去构造一个"zilei"对象呢?
    即使编译通过了,"zilei"也是一个Employee对象..
    我对多态的描述是:超类对象变量可以引用一个子类对象.也就是说子类已经存在只是拿超类对象变量引用了...
    正确对多态的运用如下:
    public class Aquestion
    {
    public static void main(String[] args)
    {
    Manager boss=new Manager("Peter",50000);//子类对象    
    Employee employee[]=new Employee[3];//超类对象变量
    employee[0]=boss;//超类对象变量对子类的引用     
    employee[1]=new Employee("simone");
    employee[2]=new Employee("Clarie");
    for(Employee e:employee)
    System.out.println("name="+e.Getname());
    }
    }
    class Employee
    {
    public Employee(String aname)
    {
    name=aname;
    }
    public String Getname()
    {
    return name;
    }
    private String name;
    }
    class Manager extends Employee
    {
    public Manager(String aname,double asalary)
    {
    super(aname);
    salary=asalary;
    }
    public double Getsalary()
    {
    return salary;
    }
    private double salary=0;
    }
    这里Manager boss=new Manager("Peter",50000);构造了一个子类对象  
    而Employee employee[]=new Employee[3]申请了一个超类对象数组
    接着是employee[0]=boss;超类对象变量引用了子类对象变量(这就是多态)
    那为什么还要申请超类对象变量呢?直接用子类的对象作操作就可以了啊?
    这个问题是愚蠢的,多态到底有什么用?先想清楚这个问题再用多态!
      

  7.   

    Employee a=new zilei(2,5,6,"asfdasdf");父类引用指向子类对象
      

  8.   

    Employee a=new zilei(2,5,6,"asfdasdf");
    这种写法没意义的,怎么能用"Employee"的构造器去构造一个"zilei"对象呢?
    即使编译通过了,"zilei"也是一个Employee对象..楼上的这段话是错的,你也去读书吧。
      

  9.   

    为什么非要写成:
    Employee a=new zilei(2,5,6,"asfdasdf");
    呢?这句话是什么意思?构造对象是一个完整的句子,而不是分成"超类对象变量"="子类对象"
    而不是
    zilei a=new zilei(2,5,6,"asfdasdf");
    Employee b=new employee();
    b=a;
      

  10.   

    z_lping(Schemer) 
    楼上的这段话是错的,你也去读书吧
    我错在哪里
      

  11.   

    Please study Chapter 2, Section 7 of this book:
    SCJP Sun Certified Programmer for Java 5 Study Guide (Exam 310-055) 
    byKathy Sierra and Bert Bates 
    McGraw-Hill/Osborne 2006 (864 pages) 
    ISBN:0072253606 Study "Constructor Chaining".Employee a=new zilei(2,5,6,"asfdasdf");
    ==> Create an instance of class zilei, then assign it to a reference variable a, of type Employee.
      

  12.   

    自己试一下吧(把公共类改成下面的):
    public class Aquestion
    {
    public static void main(String[] args)
    {
    Employee boss=new Manager("Peter",50000);
    //boss.Getsalary();
                      boss.Getname();

    }
    }
    Getsalary();是子类方法
    Getname();是超类方法
    虽然编译通过了,但是boss并不能引用Getsalary();方法,说明他仍然是超类,也就是说50000在传递过程中丢失了.Employee boss=new Manager("Peter",50000);建议不要用这种构造的句子.
      

  13.   

    Employee a=new zilei(2,5,6,"asfdasdf");
    那a到最后是一个什么对象,可以调用哪些方法.我关心的是这个,解决问题的时候也需要明白这个.
      

  14.   

    Employee a=new zilei(2,5,6,"asfdasdf");
    ==> Create an instance of class zilei, then assign it to a reference variable a, of type Employee.
    最多只能证明超类变量可以直接引用子类对象,但是有什么用??你仍然没有解决楼主的问题.
      

  15.   

    虽然编译通过了,但是boss并不能引用Getsalary();方法,
    ==>这句话对了。为什么呢?说明他仍然是超类,也就是说50000在传递过程中丢失了.
    ==>这句话是错的。为什么呢?为什么呢?因为boss是一个类型为Employee的reference variable,通过它只能看到Employee里定义的方法,所以,看得到Getname();看不到Getsalary();。但是,看不到不代表不存在。new Manager("Peter", 50000);创建的是一个Manager Instance。((Manager)boss).getsalary();
    这样就可以了。如果按照你的说法,50000丢了,那怎么可能再找回来呢?
      

  16.   

    Employee boss=new Manager("Peter",50000);建议不要用这种构造的句子.
    ==>这句话是有道理的,多态不是这样用的。
      

  17.   

    - -那我就不继续了,我只是抱着打破沙锅的态度学java地...
    重要的是大家都弄清楚,那就达到目的啦
      

  18.   

    limxu() ( )
    楼上的错了还不知道改,真是的,你想用这样掉子类的方法当然可以了,Employee a=new zilei(2,5,6,"asfdasdf");
    看好了,zilei c = (zilei)a.zileifangfa();
      

  19.   

    limxu() ( ) 信誉:100    Blog   加为好友  2007-5-8 17:41:38  得分: 0  
     
     
       
    Employee a=new zilei(2,5,6,"asfdasdf");
    那a到最后是一个什么对象,可以调用哪些方法.我关心的是这个,解决问题的时候也需要明白这个. 
    _______________________________________________
    a到最后不是一个什么对象,他只是一个变量,属于Employee 类的变量,但是他却引用了子类的对象,也就是实例化.他可以调用的方法多着,只要Employee类里面的方法,他都可以调用,Employee里面的方法zilei自然也有了,如果想调用子类特有的方法,那就需要类型转换,象这样.zilei c = (zilei)a.zileifangfa();OK啦.