JAVA程序设计--继承和多态(二)

多态

意指,不同类的对象对同一消息的不同响应。

意味着父类的变量可以指向(引用)子类对象。

菜鸟教程解释:


实例:




动态绑定:

方法可以在沿着继承链的多个类中实现。JVM决定运行时调用哪个方法。(在运行根据具体对象的实际类型进行绑定



实例:

package chapter11;

public class DynamicBindingDemo {
  public static void main(String[] args) {
	Object o = new GraduateStudent(); // implicit casting
	
	Object o1 = new Object();
	
	if (o1 instanceof GraduateStudent) {
	  System.out.println("Never got here");
	  GraduateStudent gs = (GraduateStudent)o1; // explicit casting
	}
	
    m(o);
    m(new Student());
    m(new Person());
    m(new Object());
  }

  public static void m(Object x) {
    System.out.println(x.toString());
  }
}

class GraduateStudent extends Student {
}

class Student extends Person {
  public String toString() {
    return "Student";
  }
}

class Person extends Object {
  public String toString() {
    return "Person";
  }
}

ps:方法可以在父类中定义而在子类中重写~

java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。

结果:

Student
Student
Person
java.lang.Object@7852e922


可看出,被调用的toString方法是在运行时动态绑定的!

从”太上皇类”cn,也就是object类开始往下找,一旦找到一个实现,停止查找,然后调用先找到的实现。而o调用那个方法由o的实际类型决定!


实例:

// Show the output of the following code:
   // (a)
    public class Test {
      public static void main(String[] args) {
        new Person().printPerson();
        new Student().printPerson();
      }
    }

    class Student extends Person {
      @Override
      public String getInfo() {
        return "Student";
      }
    }

    class Person {
      public String getInfo() {
        return "Person";
      }

      public void printPerson() {
        System.out.println(getInfo());
      }
    }

  //  (b)
    public class Test {
      public static void main(String[] args) {
        new Person().printPerson();
        new Student().printPerson();
      }
    }

    class Student extends Person {
      private String getInfo() {
        return "Student";
      }
    }

    class Person {
      private String getInfo() {
        return "Person";
      }

      public void printPerson() {
        System.out.println(getInfo());
      }
    }

答案:

(a)
Person
Student

(b)
Person
Person

ps:明确,子类是不能够覆盖(重写)父类的私有方法的。

因为:子类要能够重写父类的方法的前提条件是继承,子类对父类的私有方法并不继承,也没有访问权限,自然也是不能重写的。

父类的getInfo和子类的getInfo实际上就是两个”无关”的方

法,因为私有方法是不能被子类重写的,私有方法并不是父类接

口的一部分,只是隐藏在父类中的一段程序代码。


猜你喜欢

转载自blog.csdn.net/qq_35827280/article/details/80378229