随便写了一个问题
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 谢谢了!
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 谢谢了!
a是一个Employee type的reference variable;
它的值指向的是一个zilei的instance。通过a,可以调用这个instance的看得到的方法,变量是看不到的。1,比如书,Employee里有个fangfa(),zilei里有个function(),如果zilei重写了fangfa(),通过a,我们可以调用那个重写的fangfa(),那个function是a看不到的。2,zilei的变量是通过a看不到的。
(父类)Employee a=new (子类)zilei(); 子类继承父类,里面有子类对父类方法的覆盖
a 里面有父类的属性,当调用方法时,会调用子类的
这是"is-a"关系,就是说,每一个子类的对象都是一个超类的对象.
例如,每一个经理都是一个雇员.所以每一个经理都能引用其超类雇员中定义的通用方法(除了覆盖的情况)
你问这个问题还不是要解决方法引用的问题,在java中方法的引用过程叫做"动态帮定"每一个方法都有一个标签,既方法名字和方法函数(方法返回值不算),在引用方法的时候系统会自动查找有相同标签的方法.对于你这个例子,超类是"Employee"子类是"zilei"
你用"Employee"的对象变量引用了"zilei"的对象这是一个多态的过程.(不过子类对象变量能不能引用超类对象,或者其他无关的类对象我还不太清楚,研究ing),而在具体调用类的方法的时候是一个动态绑定的过程,如果调用function()系统就直接调用字类的方法,如果调用fangfa()系统就调用超类的方法.(如果覆盖了,就调用覆盖后的方法)
而对于function()是不可见的 也就是说你可以写a . fangfa() 但是不能写 a .function()明白了吗?
楼上的说错了吧...
楼上的没有说错,是你错了,你说的根本行不通,确实是不能a.function();
这样会找不到符号,因为它确实是不能调用子类中的方法
这种写法没意义的,怎么能用"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;超类对象变量引用了子类对象变量(这就是多态)
那为什么还要申请超类对象变量呢?直接用子类的对象作操作就可以了啊?
这个问题是愚蠢的,多态到底有什么用?先想清楚这个问题再用多态!
这种写法没意义的,怎么能用"Employee"的构造器去构造一个"zilei"对象呢?
即使编译通过了,"zilei"也是一个Employee对象..楼上的这段话是错的,你也去读书吧。
Employee a=new zilei(2,5,6,"asfdasdf");
呢?这句话是什么意思?构造对象是一个完整的句子,而不是分成"超类对象变量"="子类对象"
而不是
zilei a=new zilei(2,5,6,"asfdasdf");
Employee b=new employee();
b=a;
楼上的这段话是错的,你也去读书吧
我错在哪里
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.
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);建议不要用这种构造的句子.
那a到最后是一个什么对象,可以调用哪些方法.我关心的是这个,解决问题的时候也需要明白这个.
==> Create an instance of class zilei, then assign it to a reference variable a, of type Employee.
最多只能证明超类变量可以直接引用子类对象,但是有什么用??你仍然没有解决楼主的问题.
==>这句话对了。为什么呢?说明他仍然是超类,也就是说50000在传递过程中丢失了.
==>这句话是错的。为什么呢?为什么呢?因为boss是一个类型为Employee的reference variable,通过它只能看到Employee里定义的方法,所以,看得到Getname();看不到Getsalary();。但是,看不到不代表不存在。new Manager("Peter", 50000);创建的是一个Manager Instance。((Manager)boss).getsalary();
这样就可以了。如果按照你的说法,50000丢了,那怎么可能再找回来呢?
==>这句话是有道理的,多态不是这样用的。
重要的是大家都弄清楚,那就达到目的啦
楼上的错了还不知道改,真是的,你想用这样掉子类的方法当然可以了,Employee a=new zilei(2,5,6,"asfdasdf");
看好了,zilei c = (zilei)a.zileifangfa();
Employee a=new zilei(2,5,6,"asfdasdf");
那a到最后是一个什么对象,可以调用哪些方法.我关心的是这个,解决问题的时候也需要明白这个.
_______________________________________________
a到最后不是一个什么对象,他只是一个变量,属于Employee 类的变量,但是他却引用了子类的对象,也就是实例化.他可以调用的方法多着,只要Employee类里面的方法,他都可以调用,Employee里面的方法zilei自然也有了,如果想调用子类特有的方法,那就需要类型转换,象这样.zilei c = (zilei)a.zileifangfa();OK啦.