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();//如果不是多态,这里要写多少个判断语句,现在只用一个语句即可。
      		
      	}
      	
      
      }
      
  • 相关阅读:
    mysql索引创建和使用细节(二)
    mysql索引创建和使用细节(一)
    PHP7.2.6安装sodium扩展
    passwd修改密码失败,报鉴定令牌操作错误
    centos6升级python版本至python3.5
    centos6升级gcc版本
    elasticsearch中文手册
    MySQL主从仅同步指定库
    适用于Centos6/7,vsftp自动安装脚本
    Redis内存模型
  • 原文地址:https://www.cnblogs.com/whllow/p/12200438.html
Copyright © 2011-2022 走看看