为什么java只有方法支持多态,成员此类型的变量不支持点进行引索多态

//这里会出现编译错误

java中子类继承父类的方法后子类所属方法区中是否有父类中的方法呢?
不会在方法区里面父类和子类的两块空间是有联系的,JVM在子类中找不到对应嘚方法就去父类里面找。如果sing()方法被重写了子类的空间内也会有一个sing(),调用时就会调用子类的sing(),不再去父类中寻找

其次,static修饰的方法是静態绑定(在编译时期类和方法的关系就确定了),在这个例子中

调用testB.print();方法时,子类TestB“重写”了父类TestA的静态方法所以在编译时期,重寫的static方法已经和TestB绑定在一起了所以产生了“复写”的效果,准确来说子类static方法隐藏了父类的static方法

但是调用test.print();时,仍旧调用的是父类TestA的方法同样,对静态方法在编译期就静态绑定了类和方法的关系,不存在多态性所以静态方法的调用看等号=左边的类

对于成员属性,不管事static还是普通变量都不存在多态性,都看等号=左边

上面还提出了一个问题:

构成复写的条件:方法名参数列表,返回类型都相同这裏满足了复写的条件,然而子类方法的修饰符是static这和多态性是相冲突的,所以会报编译错误

总结:调用类中的方法和成员变量的流程:先茬自己的类对象中找如果没有找到,就在父类的类对象中找所以子类重写父类的成员变量或者static方法时,会产生隐藏父类同名变量和static方法的效果这个效果是由java查找方法和变量的模式产生的(类似于classloader的委派模式,android中view的事件机制模式)和动态绑定没有关系,是两个概念!

子类是永远继承父类的非私有化方法当子类中重写父类方法时,调用的是子类的方法没有重写时,调用的是父类中的方法

1 多态是只针对方法而不是属性的,但是写法上子类重写父类的属性,编译器是不会报错的

我要回帖

更多关于 此类型的变量不支持点进行引索 的文章

 

随机推荐