 
    
  
  多态性
1.1 方法的重载与覆写 对象的多态性
对象多态性的类型主要有两种
A:向上转型:子类对象-》父类对象
对于向上转型,程序自动完成
格式: 父类 父类对象 = 子类实例;
    
    
      class A
      
       {
      
       public void print(){
      
       System.out.println("A");
      
       }
      
       public void fun1(){
      
       this.print();
      
       }
      
       };
      
       class B extends A
      
       {
      
       public void print(){
      
       System.out.println("B");
      
       }
      
       public void say(){
      
       System.out.println("B->say()");
      
       }
      
       };
      
       public class polDemo01
      
       {
      
       public static void main(String args[]){
      
       B b = new B();
      
       A a = b;
      
       a.print();
      
       a.fun1();
      
       }
      
       }
      
       结果:
    
  
    
    
      F:\java>javac polDemo01.java
    
  
    
      F:\java>java polDemo01
      
       B
      
       B
    
  
    
    
      如果子类没被覆盖,
    
  
    
      class A
      
       {
      
       public void print(){
      
       System.out.println("A");
      
       }
      
       public void fun1(){
      
       this.print();
      
       }
      
       };
      
       class B extends A
      
       {
      
       public void print1(){
      
       System.out.println("B");
      
       }
      
       public void say(){
      
       System.out.println("B->say()");
      
       }
      
       };
      
       public class polDemo01
      
       {
      
       public static void main(String args[]){
      
       B b = new B();
      
       A a = b;
      
       a.print();
      
       a.fun1();
      
       }
      
       }
      
       结果:
    
  
F:\java>javac polDemo01.java
    
      F:\java>java polDemo01
      
       A
      
       A
    
  
B:向下转型: 父类对象-》子类对象
对于向下转型,必须明确的指明要转型的子类类型
子类 子类对象 = (子类)父类实例;
    
      class A
      
       {
      
       public void print(){
      
       System.out.println("A");
      
       }
      
       public void fun1(){
      
       this.print();
      
       }
      
       };
      
       class B extends A
      
       {
      
       public void print(){
      
       System.out.println("B");
      
       }
      
       public void say(){
      
       System.out.println("B->say()");
      
       }
      
       };
      
       public class polDemo01
      
       {
      
       public static void main(String args[]){
      
       A a = new B();
      
       B b = (B)a;
      
       b.print();
      
       b.fun1();
      
       b.say();
      
       }
      
       }
    
  
    
    
      结果:
    
  
F:\java>javac polDemo01.java
    
      F:\java>java polDemo01
      
       B
      
       B
      
       B->say()
      
       在类B中存在三个方法,都可以调用。
      
       但进行对象向下转型时候要注意:
    
  
    
      class A
      
       {
      
       public void print(){
      
       System.out.println("A");
      
       }
      
       public void fun1(){
      
       this.print();
      
       }
      
       };
      
       class B extends A
      
       {
      
       public void print(){
      
       System.out.println("B");
      
       }
      
       public void say(){
      
       System.out.println("B->say()");
      
       }
      
       };
      
       public class polDemo01
      
       {
      
       public static void main(String args[]){
      
       A a = new A();//实例化一个父类对象
      
       B b = (B)a;
      
       b.print();
      
       b.fun1();
      
       b.say();
      
       }
      
       }
      
       但是结果出现异常:
    
  
    
    
      F:\java>java polDemo01
      
       Exception in thread "main" java.lang.ClassCastException: A cannot be cast to B
      
       at polDemo01.main(polDemo01.java:23)
    
  
    
    
      提示A不能转到B,以上的异常是第二大出现的异常,此异常出现是在对象转型的时候经常发生的,如果两个没有关系的对象之间发生了转换关系,则肯定出现此异常。
    
  
    
    
      如果要想产生对象的向下转型,则肯定必须产生一个向上转型关系。。
    
  
    
    
      1.2 对象多态性的应用
    
  
    
    
      class A
      
       {
      
       public void print(){
      
       System.out.println("A");
      
       }
      
       public void fun1(){
      
       this.print();
      
       }
      
       };
      
       class B extends A
      
       {
      
       public void print(){
      
       System.out.println("B");
      
       }
      
       public void say1(){
      
       System.out.println("B->say()");
      
       }
      
       };
      
       class C extends A
      
       {
      
       public void print(){
      
       System.out.println("C");
      
       }
      
       public void say2(){
      
       System.out.println("C->say()");
      
       }
      
       };
    
  
    
      public class polDemo01
      
       {
      
       public static void main(String args[]){
      
       fun(new B());
      
       fun(new C());
      
       }
      
       public static void fun(A a){
      
       a.print();
      
       }
      
       }
    
  
结果:
    
    
      F:\java>javac polDemo01.java
    
  
    
      F:\java>java polDemo01
      
       B
      
       C
    
  
    
    
      如果采用以上的代码实现,不管有多少子类,都可以轻松实现。。
    
  
1.3 instanceof关键字
在java中可以使用instanceof关键字判断一个对象到底是那个类的实例。
格式:对象 instanceof 类 ---->返回boolean类型
    
      class A
      
       {
      
       public void print(){
      
       System.out.println("A");
      
       }
      
       public void fun1(){
      
       this.print();
      
       }
      
       };
      
       class B extends A
      
       {
      
       public void print(){
      
       System.out.println("B");
      
       }
      
       public void say1(){
      
       System.out.println("B->say()");
      
       }
      
       };
    
  
    
    
      public class polDemo01
      
       {
      
       public static void main(String args[]){
      
       A a1 = new B();
      
       System.out.println("A a1 = new B():"+(a1 instanceof A));
      
       }
      
      
       }
    
  
结果:
    
    
      F:\java>javac polDemo01.java
    
  
    
      F:\java>java polDemo01
      
       A a1 = new B():true
    
  
可以看出a1是A的实例,那么a1是不是B的实例呢?
    
    
      class A
      
       {
      
       public void print(){
      
       System.out.println("A");
      
       }
      
       public void fun1(){
      
       this.print();
      
       }
      
       };
      
       class B extends A
      
       {
      
       public void print(){
      
       System.out.println("B");
      
       }
      
       public void say1(){
      
       System.out.println("B->say()");
      
       }
      
       };
    
  
    
    
      public class polDemo01
      
       {
      
       public static void main(String args[]){
      
       A a1 = new B();
      
       System.out.println("A a1 = new B():"+(a1 instanceof A));
      
       System.out.println("A a1 = new B():"+(a1 instanceof B));
    
  
    
      }
      
      
       }
    
  
结果:
    
    
      F:\java>javac polDemo01.java
    
  
    
      F:\java>java polDemo01
      
       A a1 = new B():true
      
       A a1 = new B():true
    
  
    
    
      a1也是B的实例
    
  
1.4
    
      class A
      
       {
      
       public void print(){
      
       System.out.println("A");
      
       }
      
       public void fun1(){
      
       this.print();
      
       }
      
       };
      
       class B extends A
      
       {
      
       public void print(){
      
       System.out.println("B");
      
       }
      
       public void say1(){
      
       System.out.println("B->say()");
      
       }
      
       };
    
  
    
    
      public class polDemo01
      
       {
      
       public static void main(String args[]){
      
       A a1 = new B();
      
       System.out.println("A a1 = new B():"+(a1 instanceof A));
      
       System.out.println("A a1 = new B():"+(a1 instanceof B));
      
       A a2 = new A();
      
       System.out.println("A a2 = new A():"+(a2 instanceof A));
      
       System.out.println("A a2 = new A():"+(a2 instanceof B));
    
  
    
      }
      
      
       }
    
  
结果:
    
    
      F:\java>javac polDemo01.java
    
  
    
      F:\java>java polDemo01
      
       A a1 = new B():true
      
       A a1 = new B():true
      
       A a2 = new A():true
      
       A a2 = new A():false
    
  
    
    
      在开发中一定要注意,对于向下转型操作最好增加验证,以保证转型时不会发生ClassCastexception的错误。
    
  
在开发中一定要记住一点:
【一个类永远不要去继承一个已经实现好的类,只能继承抽象类或者实现接口。】
    
    
    
  


 
					 
					