java 多态的特殊特性

最近一个阶段在学习java的多态特性,按照我个人的理解,首先多态的目的是为了更好的实现类型的兼容,其次如果子类覆盖了的方法时,如果把子类的对象赋给父类的应用,且调用父类接口的方法时,会调用子类中的方法,因为一个父类可能会有多个子类,那么在运行的过程中java是怎么知道具体是要调用那个子类中的方法的了?这个特性是由java中所谓的动态绑定的机制来保证的。就其多态本身而言不是很复杂,但是有三个比较容易绕的问题需要搞清楚,

(1)Pitfall: “overriding” private methods  即对于父类中的private 方法,子类不能进行覆盖,且用父类的引用调用private方法时只能调用父类中的方法

 public class PiteFallPrivate {
 private void print() {
  System.out.println("PeteFallPrivate.....");
 }
 
 public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
  PiteFallPrivate pfp = new T();
  System.out.println(pfp.getClass().getName());
  
  pfp.print();
 }
}

class T extends PiteFallPrivate {
 // @Override
 public void print() {
  System.out.println("T method output.....");
 }
}

 

(2)Pitfall: fields and static methods  字段没有多态的特性,字段的值和应用有关系,而不会和具体的对象有关系

public class PiteFallField {
 public static void main(String[] args) {
  Super sup = new Sub();
  System.out.println(sup.i);
  System.out.println(sup.getI());
  System.out.println(new Sub().getSuper());
  System.out.println(new Sub().i);
  System.out.println(new Sub().getI());
 }
}

class Super {
 int i = 0;
 
 public int getI() {
  return i;
 }
 
 public Super() {
  System.out.println("Super init....");
  i = 6;
 }
}

class Sub extends Super {
 int i = 1;
 
 public Sub() {
  System.out.println("Sub init....");
 }
 
 public int getI() {
  return i;
 }
 
 public int getSuper() {
  return super.i;
 }
}

 

(3)static methods are associated with the class, and not the individual objects. static 方法的特性和字段相同

public class PitFallStaticMethod {
 public static void print(){
  System.out.println("base static method output....");
 }
 public void print2(){
  System.out.println("base not static method output...");
 }
 
 public static void main(String[] args) {
  PitFallStaticMethod pfs=new StaticMethodSub();
  pfs.print();
  pfs.print2();
    }
}

class StaticMethodSub extends PitFallStaticMethod{
 public static void print(){
  System.out.println("sub static method output....");
 }
 public void print2(){
  System.out.println("sub not static method output...");
 }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值