第一个类
public class person {
public void say() {
System.out.println("personS");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
person aPerson=new student();
aPerson.say();
}
}
第二个类
public class student extends person {
public void say() {
System.out.println("personS");
}
}
结果
personS
请问这是为什么??
这个问题不好解释,为什么不好解释呢,就像是1+1=2,没有道理,就像你妈要打你,你也身不由己。
这个是java的语法规定,他就规定这样了。然后我们来讲道理:
java中一般都是这样的:
Person person = new Student();
这一句话你的由等号分开,然后分左右两边看,左边就是声明一个变量,变量名称就是person,变量类型是Person
但是这不是就表示他确确实实就是Person这个类的实例。有可能是Person的子类。
右边则是表示具体的某个类的实例,但是他必须属于左边的类型,或者左边那个大类型下的某个小类型。
所以你写的代码,
person aPerson=new student();
aPerson.say();
就表示,我定义了一个人,这个人是学生,然后让这个人说话,因为他是学生啊,自然说personS,
这里调用的是Student的say方法
就是面向对象的基本特征多态的体现啊,这个不是重载,而是多态,即程序的运行结果是由变量的运行时类型决定的,虽然变量类型的person的抽象类型,但真正赋值类型是student,所以会执行student的方法。
是我看花眼了?不都是personS吗?还用解释?
这个是java的多态性,子类重写父类方法,在new对象的时候,是父类引用指向子类对象,调用方法时,编译看父类方法,运行时看子类方法,就是等号右边的方法.
各位大神不好意思,添麻烦了,昨天眼拙,第二个类写错了
第二个类
public class student extends person {
public void say() {
System.out.println("student");
}
}
表示给大家添了麻烦......sorry