zoukankan      html  css  js  c++  java
  • 面向对象oop多态

    *多态:
    * 生活中的多态:一种物质,有多种表现形态(金刚石和石墨)
    * 程序中的多态:同一个"接口"(Car),因不同的实现(Benz,Bmw,Byd..)而执行不同的操作(子类 重写 后的方法)
    * 多态的优点:
    * 1.简化代码
    * 2.提高代码的扩展性和可维护性 *(满足开闭原则)
    * 多态的实现:前提条件:必须和继承,重写结合使用;一般做法是:写一个方法,它只接收父类作为参数,编写的代码只与父类打交道。调用这个方法时,实例化不同的子类对象(new 一个对象)。

    多态的存在要有3个必要条件:要有继承,要有方法重写,父类引用指向子类对象

    package object;

     

    public class TestPolym {

        public static void main(String[] args) {

           Animal animal = new Dog();  //向上可以自动转型

           System.out.println(animal.age);   //属性调用时,仍然是基类的属性。属性没有多态!

    //     animal.shout();

          

           animalCry(new Dog());

           //传的具体是哪一个类就调用哪一个类的方法。大大提高了程序的可扩展性。

           //如果没有多态,我们这里需要写很多重载的方法。如果增加一种动物,就需要重载一种动物的喊叫方法。非常麻烦。

           //有了多态,只需要增加这个类继承Animal基类就可以了。

           animalCry(new Cat());

          

           Dog dog = (Dog) animal;  //编写程序时,如果想调用运行时类型的方法,只能进行类型转换。不然通不过编译器的检查。

           dog.gnawBone();

          

           System.out.println(dog instanceof Animal);

           System.out.println(animal instanceof Cat);

           System.out.println(animal instanceof Dog);

          

        }

       

        static void animalCry(Animal a){

           a.shout();

        }

       

    }

     

    class Animal {

        int age=10;

    public void shout(){

           System.out.println("叫了一声!");

        }

    }

    class Dog extends Animal {

        int age=28;

       

        public void shout() {

           System.out.println("旺旺旺!");

        }

       

        public void gnawBone(){

           System.out.println("我再啃骨头");

        }

       

    }

    class Cat extends Animal {

        int age=18;

        public void shout() {

           System.out.println("喵喵喵喵!");

        }

    }

    更具体的说:

    (1)、子类重写父类的方法。使子类具有不同的方法实现。

    (2)、把父类类型作为参数类型,该父类及其子类对象作为参数转入。

    (3)、运行时,根据实际创建的对象类型动态决定使用那个方法。


    * 1.创建汽车类(父类)
    * 2.创建奔驰类,宝马类并继承汽车类(子类),在子类中重写父类的方法
    * 3.将父类作为参数传入 drive(Car b)
    * 4.执行过程中传入具体的子类对象,程序在执行过程会执行子类重写后的方法

    *程序需要满足"开闭原则":
    * "开":对扩展要"开"(程序容易扩展新的功能)--->程序的扩展性要好
    * "闭":对修改要"闭"(当添加或修改功能时,代码应尽可能少的更改或不更改)
    * 可以通过多态来解决程序扩展性差的问题。
    * 类型的自动转化: byte-->short-->int-->long--->float-->double


    * 比赛的方法
    * byte--->short--->int--->long-->float-->double
    * 向上转型(自动转换):将子类转换为父类进行使用
    * 生活案例:演员(父类)和替身(子类)
    * 利用父类创建子类后(发生了向上转型):
    * 1.只能访问父类的成员变量和成员方法(子类自有的属性和方法无法使用)
    * 2.如果子类重写了父类的某个方法,上转型对象调用该方法时,是调用的重写方法。
    * long l=10L;
    * int i=(int)l;--->强制转换
    * 向下转型(强制转换):父类转换为子类
    * 可以访问子类中新增的属性和方法
    * 异常:java.lang.ClassCastException类型转换异常
    * instanceof运算符:
    * 对象 instanceof 类 :判断该对象是否为指定类的实例,如果该对象是类实例返回true,否则返回false


    *final关键字: 最终的
    *1.使用final修饰的变量,就变成常量,在运行的过程中不能被重新赋值
    *2.使用final修饰方法,不能被子类重写(覆盖)
    *3.使用final修饰的类,不能继承(不能派生其他子类)
    *java中的常见的final修饰的类
    *String,Math,Scanner,StringBuffer...
    *
    *static修饰的方法或属性:
    * 类名.属性或类名.方法名 *
    * 对象.属性或对象名.方法名



    abstract(抽象)修饰符必须放在类名前       抽象类 ;;;;;
    1 abstract修饰类,会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型,也就是编译时类型,抽象类就像当于一类的半成品,需要子类继承并覆盖其中的抽象方法。
    2 abstract修饰方法,会使这个方法变成抽象方法,也就是只有声明(定义)而没有实现,实现部分以";"代替。需要子类继承实现(覆盖)。

    3 有抽象方法的类一定是抽象类。但是抽象类中不一定都是抽象方法,也可以全是具体方法。

    4 父类是抽象类,其中有抽象方法,那么子类继承父类,并把父类中的所有抽象方法都实现(覆盖)了,子类才有创建对象的实例的能力,否则子类也必须是抽象类。抽象类中可以有构造方法,是子类在构造子类对象时需要调用的父类(抽象类)的构造方法。

    * 抽象方法:使用abstract关键字修饰的方法,抽象方法没有方法体
    * 抽象类(为继承而生):使用abstract修饰类,包含抽象方法的类必须放在抽象类之中,抽象类可 以有 构造函数,抽象类可以包含0到多个抽象方法,也可以包含非抽象方法
    * 抽象类中是否必须有抽象方法-->不一定
    * 包含抽象方法的类一定是抽象类
    * 抽象类不能实例化,不能通过new关键字创建对象。
    * 通过抽象类,可以避免子类设计的随意性
    * 如果一个类继承了一个抽象类,必须重写所有其抽象方法
    * 或者子类也是一个抽象类,否则无法通过编译。


    设计模式GOF:经典问题的解决方案(前人经验的总结)
    * 23种设计模式:
    * 简单工厂模式不属23中设计模式中的一种,主要可以通过简单工程模式创建对象
    * 生活中使用的手机,个人不会去制造一个,而是从工厂购买(生成产品的过程交给了工厂)
    * 优点:
    * 可以根据用户的需求动态创建产品(对象)
    * 需求:当输入ch字符串时创建一个Chinese对象返回,输入am时创建一个American对象返回
    * 1.使用static修饰:无需创建对象,直接使用类名.方法名调用
    * 2.返回值类型:父类类型
    * 3.根据用户输入的标示动态创建对象
    * XxxFactory--->工厂模式,主要用于生产Xxx对象

  • 相关阅读:
    centos7下查看端口是否被占用
    centos7通过yum安装redis
    centos7下mysql远程连接
    centos7通过yum安装JDK1.8
    Jwt系列2:使用
    Jwt系列1:简介
    Python基础语法
    排序
    利用MultipartFile来进行文件上传
    服务器端跳转和客户端跳转
  • 原文地址:https://www.cnblogs.com/seePoppy/p/6710743.html
Copyright © 2011-2022 走看看