代码如下:
class Base1 {
public int mm = 2;
public void pri(){
System.out.print(mm);
}
}class Sub1 extends Base1{
public int mm = 5;
public void pri(){
System.out.print(mm);
}
}class test {
public static void main(String[] args){
Base1 app1 = new Sub1();
app1.pri();//为什么这里调用的是子类得pri方法而下面这句中输出的是父类的属性值??!
System.out.print(app1.mm);
}
}难道子类能改写父类中同名的方法不能改写父类中同名的属性值???!请大家指教,谢谢!
class Base1 {
public int mm = 2;
public void pri(){
System.out.print(mm);
}
}class Sub1 extends Base1{
public int mm = 5;
public void pri(){
System.out.print(mm);
}
}class test {
public static void main(String[] args){
Base1 app1 = new Sub1();
app1.pri();//为什么这里调用的是子类得pri方法而下面这句中输出的是父类的属性值??!
System.out.print(app1.mm);
}
}难道子类能改写父类中同名的方法不能改写父类中同名的属性值???!请大家指教,谢谢!
Base1 app1 = new Sub1();把Sub1的对象上升到Base1,
调用变量时就是调用这个对象实例的变量;
调用方法时,是调用这个对象实例的方法;这里有个特殊性,就是调用生成的对象的方法;这个地方是多态的体现;
总之,多态是体现在方法上而不是变量上
你的例子是明显的超类引用指向子类对象,这是一种常用的“多态”机制,主要是为了用超类的应用管理子类的对象方便,估计你是个新手,如果以后学习到接口的时候,你就会越来越明白为什么要这么做了。当用这种多态机制的时候,往往还要伴随着子类重写夫类的同名方法(包括实例方法和静态方法),也许还会有同名的变量(包括实例变量和静态变量)。下面这个例子就会让你彻底明白这一系列的问题到底是怎么回事:
//: ConversionTest.java//package g3ds.joop.ch4;class Super{
static String str1="超类的静态变量";
String str2="超类的实例变量";
static void showStatic(){
System.out.println("超类的静态方法");
}
void showNonStatic(){
System.out.println("超类的实例方法");
}
}class This extends Super{
//定义与超类重名的静态变量
static String str1="子类的静态变量";
//定义与超类重名的实例变量
String str2="子类的实例变量";
//当改写超类的静态方法时,在当前类中也必须设计为静态的,否则报错!
static void showStatic(){
System.out.println("子类的静态方法");
}
//改写超类的实例方法
void showNonStatic(){
System.out.println("子类的实例方法");
}
//添加子类特有的成员变量,可以是静态的或者非静态的
static String str3="子类特有成员变量";
//添加子类特有的成员方法,可以是静态的或者非静态的
void showDetail(){
System.out.println("子类特有的成员方法");
}
}public class ConversionTest{
public static void main(String arg[]){
//测试:以超类声明以子类实例化,存在转型
Super obj=new This();
//对静态和非静态成员的多态机制测试
System.out.println(obj.str1);
System.out.println(obj.str2);
obj.showStatic();
obj.showNonStatic();
}
}执行的结果如下:
超类的静态变量
超类的实例变量
超类的静态方法
子类的实例方法这下楼主应该明白了吧???
总结以下几点:
1、对于实例变量和静态变量,多态机制反应的是“超类的属性”。
2、对于静态方法,多态机制反映的是“超类的属性”。
3、对于实例方法,多态机制反应的是“子类的属性”。
当然我不知道你学习了“包”机制没有,在不同的包中,子类和超类里的同名方法并不一定是“覆盖”关系了,这点要你在以后的学习中特别要注意!不知道我的回答你满意吗?