java 多态的特殊特性

来源:互联网 发布:淘宝上怎么打印快递单 编辑:程序博客网 时间:2024/05/22 03:14

最近一个阶段在学习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...");
 }
}