zoukankan      html  css  js  c++  java
  • 六、java基础-单例模式_继承_覆盖_多态

    1、单例模式:

    1)提出原因
      是由gof 也就是四人组提出来的。为了保证jvm中某一类型的java对象永远只有一个,同时也是为了节省内存的开销。因为外面程序可以通过new的方法直接调用类里面的构造方法。导致该类的对象不止一个。
    2)定义
      单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
    A、构造方法私有化;
    B、对外提供一个公开的、静态的、获取当前类型对象的方法
    C、提供一个当前类型的静态变量。
    3)分类
     A、饿汉式单例模式:在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快

    public class CustomerSingleton {
        private static CustomerSingleton instance = new CustomerSingleton();//静态私有成员,已初始化
       
        private CustomerSingleton()
        {
            //私有构造函数
         System.out.println("私有构造函数执行");
        }
       
        public static CustomerSingleton getCustomerInstance()    //静态,不用同步(类加载时已初始化,不会有多线程的问题)
        {
            return instance;
        }
    }
    View Code

     B、懒汉式单例:类加载时不初始化

    当调用getInstance方法的时候,底层的对象才会考虑创建,所以显得比较懒

     public class UserSingleton {
       //提供一个当前类型的静态变量
       public static UserSingleton intance=null;
     
       //构造方法私有化
       private UserSingleton(){
        System.out.println("构造函数私有化");
       }
     
       //对外提供一个公开获取Singleton 对象的方法
       public static UserSingleton getInstance(){
          if(intance==null){
           intance=new UserSingleton();
        }
        return intance;
       }
    }
    View Code

    2、继承 

     1)继承的语法:java中类只支持单继承,一个类继承了A类就无法再继承B类,继承是面向对象的重要概念。一个类没有现实的继承其他类,默认继承sun提供的java.lang.object

       [修饰符列表] class  子类名   extends   父类名{
          类体;

       } 

     备注:

    java语言中子类继承父类,会将父类中所有的数据全部继承,包括私有的也能继承过来;

    但是在子类中无法直接访问父类中的私有数据。但是可以间接访问,构造方法无法被子类继承

    3、方法的覆盖

     1)什么时候方法要进行覆盖?
     如果父类中的方法已经无法满足当前子类的业务需求,需要将父类中的方法进行覆盖重新
    子类如果重写父类的方法之后,子类对象一定调用的是重写之后的方法。覆盖指的是成员方法和成员变量无关。

     2)发生方法覆盖的条件:
      第一:发生在具有继承关系的两个类之间
      第二:必须具有相同的方法名,相同的返回值类型,相同的参数列表
      第三:重写的方法不能比被重写的方法拥有更低的访问权限
      第四:重写的方法不能比被重写的方法抛出更宽泛的异常
      第五:私有的方法不能被覆盖(因为私有方法无法被子类访问,所以不能重写;必须是public的方法才能被覆盖,如果定义成了final是不可以被重写的)
      第六:构造方法无法被覆盖,因为构造方法无法被继承。
      第七:静态的方法不存在覆盖
      第八:覆盖指的是成员方法,和成员变量无关。

    4、多态 

     向上转型:子转父(父类型的引用,指向子类型的对象);
     向下转型:父转子(子类型的引用,指向父类型的对象);
     多态编译期是静态绑定,而运行期是动态绑定

    5、多态的经典例子

     public class Person {
       public void feed (Animal a){
        a.eat();
       }
    }
    
    public class Animal {
       public void eat(){
      
       }
    }
    
    public class Dog extends Animal {
       public void eat(){
          System.out.println("狗在吃肉");
       }
    }
    
    public class Cat extends Animal {
       public void eat(){
          System.out.println("猫在吃鱼");
       }
    }
    
    public class Test01 {
       public static void main(String[] args) {
          Person p1=new Person();
          Dog d1=new Dog();
          Cat c1=new Cat();
          p1.feed(d1);
          p1.feed(c1);
       }
    
    }
    View Code

    更多设计模式理解,可参看博文:https://www.cnblogs.com/jiarui-zjb/p/9637308.html

    细水长流,打磨濡染,渐趋极致,才是一个人最好的状态。
  • 相关阅读:
    postman接口测试及断言
    postman使用CSV和Json文件实现批量接口测试
    php 实现抽奖代码
    判断时间是否过期
    文件上传-图片展示
    导入
    增删改查
    NDK编译Eigen
    keras下载vgg16太慢解决办法
    非极大值抑制NMS
  • 原文地址:https://www.cnblogs.com/jiarui-zjb/p/6179522.html
Copyright © 2011-2022 走看看