zoukankan      html  css  js  c++  java
  • Java:多态

    Java:多态

    定义

    多态:简单来说,多种形态,多种处理方法。不同对象对相同的消息有不一样的反应。就好比一个学渣(本人)拿到了一张60分的成绩单,就十分高兴,而学霸拿到一张60分的成绩单,就十分郁闷。

    发生条件

    1. 继承,子类继承父类
    2. 重写(override),子类重写父类的方法
    3. 父类引用指向子类(父类的声明,子类的实例)

    好处:

    1. 程序更加灵活,多变。因为子类会覆盖父类的方法且每个子类都有不一样的方法,所以处理同一问题会有不一样的结果,最重要的是它需要程序员手动判断。
    2. 规范性更强,每个子类都有相同的方法名(虽然方法体不一样)
    3. 便于维护,有利于后期开发。

    引用转换类型

    引用转换类型有两种:向上转型,向下转型。

    辅助代码:

    class person{
    	
    	public void saidName() {
    		System.out.println("My name is ...");
    	}
    	
    	
    }
    class tom extends person {
    
    	
    	public void saidName() {
    		System.out.println("My name is tom");
    	}
    }
    
    class jack extends person{
    	
    	public void saidName() {
    		System.out.println("My name is jack");
    	}
    }
    
    1. 向上转型:

      ​ 小类型向大类型转换,子类向父类转型,不需要强行转换。就好比苹果是一种水果这句话是没有什么问题。

      下.jpg

    2. 向下转型:

      ​ 大类型向小类型转换,父类向子类转型,需要强行转换。就好比水果是苹果这句话是有问题的,一个抽象大类是许多实例的抽象的集合。但是如果这个水果本身就是苹果的话,这句话就没有什么问题。所以向下转型需要有一定条件。

    上.jpg

    运行出错:

    出错.jpg

    instanceof

    1. 作用:

      判断左边的对象是不是属于右边的类或者右边的派生类

    2. 应用场景:

      我们在强制转换之前可以,用instanceof判断一下能否强制转换,避免运行时出错。

      person p2 = new jack();
      		if(p2 instanceof tom)
      		{
      			//不会被执行
      			tom t2 = (tom) p2;//编译没有出错,但是运行时会出错
      		}
      
    3. 判断的本质:

      instanceof通过判断左边的对象而不是左边的声明。(即左边是new 哪个对象)

    public static void test1(){
    		tom t = new tom();
    		person p = new person();
    		person p1 = new tom();
    		tom t1 = (tom)p1;
    		
    		System.out.println(t instanceof person);//true
    		System.out.println(p instanceof person);//true
    		System.out.println(t instanceof tom);//true
    		System.out.println(p instanceof tom);//false
    		System.out.println(t1 instanceof person);//true
    		System.out.println(p1 instanceof person);//true
    		System.out.println(t1 instanceof tom);//true
    		System.out.println(p1 instanceof tom);//true
    		
    	}
    

    重写(override)和重载(Overload)的区别

    • 重写:子类覆盖父类的方法,需要子类继承父类,而重载不需要覆盖,不需要继承,重载只是在同一个类中有着相同方法名不同的参数和方法体的方法。

    • 重写需要子类的方法名,参数列表和父类的方法一致,而重载要求方法名相同,参数列表不一样。

    • 简单来说,重写好比不同人参加100m冲刺,每个人有着不一样的表现,重载好比不同人对你有着不同的称呼,比如在你母亲的眼里,你是她的孩子,在你同学眼里,你可能是学霸(学渣)。

      示例

      体现多态的灵活性:

      class person{
      	
      	public void saidName() {
      		System.out.println("My name is ...");
      	}
      	
      	
      }
      class tom extends person {
      
      	
      	public void saidName() {
      		System.out.println("My name is tom");
      	}
      }
      
      class jack extends person{
      	
      	public void saidName() {
      		System.out.println("My name is jack");
      	}
      }
      
      
      public class test2{
      	
      	public static void main(String[] args) {
      		person p =new person();
      		jack j = new jack();
      		tom t = new tom();
      		
      		Name(p);//My name is ...
      		Name(j);//My name is jack
      		Name(t);//My name is tom
      		
      		
      	}
      	
      	public static void Name(person obj) {//体现了多态的灵活性
      		obj.saidName();//如果不是多态,这里要写多少个判断语句,现在只用一个语句即可。
      		
      	}
      	
      
      }
      
  • 相关阅读:
    Samba 4.0 RC3 发布
    SymmetricDS 3.1.7 发布,数据同步和复制
    Express.js 3.0 发布,Node.js 的高性能封装
    GIFLIB 5.0.1 发布,C语言的GIF处理库
    jQuery UI 1.9.1 发布
    SVN Access Manager 0.5.5.14 发布 SVN 管理工具
    DynamicReports 3.0.3 发布 Java 报表工具
    HttpComponents HttpClient 4.2.2 GA 发布
    AppCan 2.0 正式发布,推移动应用云服务
    Ruby 2.0 的新功能已经冻结
  • 原文地址:https://www.cnblogs.com/whllow/p/12200438.html
Copyright © 2011-2022 走看看