zoukankan      html  css  js  c++  java
  • 第十一节(单例模式初步、类的继承)

    设计模式 
    
    什么是设计模式:设计模式是可以重复利用的解决方案
    
    设计模式的提出是在 1995 人,是由 4 为作者提出的,称为 GoF, 也就是“四人组”
    
    设计模式从结构上分为三类:
    
      创建型
    
      结构性
    
      行为型
    其中最简单的设计模式就是单例了,单例这种模式,尽量少用,也有将其称为“反模式” 
    
    
    单例模式有什么好处:
    
    我们知道对象实例创建完成后, 会放到堆中, 如果堆中的实例过多, 将会存在特别多的垃圾,这样会导致一些问题, 如内存溢出等,
    
    使用单例模式后,只会创建一个实例,显著减少对象实例的个数,同时也会提高性能,因为不会频繁的创建对象,这只是他的一个好处,
    
    其他方面项目中再说。


    单例模式的三要素:

      一.  在类体中需要具有静态的私有的本类型的变量

      二.  构造方法必须是私有的

      三. 提供一个公共的静态的入口点方法

     

    单利模式分为两种:
    1. 饿汉式单利模式:在类加载阶段就创建了对象
    2. 懒汉式单利模式:用到对象时才会创建对象

    /*
        实现单例模式
        
            单例模式的要领:
                1. 构造方法私有化
                2. 对外提供一个公开的静态的获取当前类型的对象的方法
                3. 提供一个当前类型的静态变量
            
            
            单利模式分为两种:
                1. 饿汉式单利模式:在类加载阶段就创建了对象
                2. 懒汉式单利模式:用到对象时才会创建对象
            
            
    */
    public class Singleton{ // 懒汉式
    
        // 静态变量
        private static Singleton s;
    
        // 将构造方法私有化 空构造(如果我们没有自定义构造方法时,系统自动会有一个默认的空构造)
        private Singleton(){}
        
        //  对外提供一个公开获取Singleton对象的方法
        public static Singleton getInstance(){
            if(s == null){
                s = new Singleton();
            }
            
            return s;
            
        }
    }
    
    /*
        调用懒汉式 设计模式 ,输出的是同一个内存地址
    
    */
    public class Test01{
        
        public static void main(String[] args){
            
            /* 编译不通过(构造方法私有化了)
                Singleton s1 = new Singleton();
                Singleton s2 = new Singleton();
                
                System.out.println(s1 == s2);
            */
            
            Singleton s1 = Singleton.getInstance();
            Singleton s2 = Singleton.getInstance();
            Singleton s3 = Singleton.getInstance();
            
            System.out.println(s1 == s2); // 输出 true
            System.out.println(s2 == s3); // 输出 true
        }
    
    }

    /////////////////////////////////////////

    /*
        饿汉式单例模式
    */
    public class User{
        
        // 类加载时,只执行一次
        private static User user = new User();
        
        // 构造方法私有化
        private User(){}
        
        // 提供公开的方法
        public static User getInstance(){
            return user;
        }
        
    
    }
    /*
        调用 饿汉式单例模式
    */
    public class Test02{
    
        public static void main(String[] args){
            
            User u1 = User.getInstance();
            User u2 = User.getInstance();
            
            System.out.println(u1 == u2); // 输出 true
            
            
        }
    
    }
     
    类的继承
    
    面向对象的三大特性:
    
    封装(封装细节)
    
    继承
    
    多态
    
    继承是面向对象的重要概念,软件中的继承和现实中的继承概念是一样的
    
    继承是实现软件可重用性的重要手段, 如:A 继承 B,A 就拥有了 B 的所有特性,如现
    
    实世界中的儿子继承父亲的财产,儿子不用努力就有了财产,这就是重用性
    
    java 中只支持类的单继承,也就是说 A 只能继承 B,A 不能同时继承 C
    
    java 中的继承使用 extends 关键字,语法格式:
    
    [修饰符] class 子类 extends 父类 {
    
    }

    例题1:
    public
    class Person{ // 姓名 private String name; // 性别 private boolean sex; // 年龄 private int age; public void setName(String name){ this.name = name; } public String getName(){ return name; } public void setSex(boolean sex){ this.sex = sex; } public boolean getSex(){ return sex; } public void setAge(int age){ this.age = age; } public int getAge(){ return age; } } public class Student{ // 学号 private int id; // 姓名 private String name; // 性别 private boolean sex; // 年龄 private int age; public void setId(int id){ this.id = id; } public int getId(){ return id; } public void setName(String name){ this.name = name; } public String getName(){ return name; } public void setSex(boolean sex){ this.sex = sex; } public boolean getSex(){ return sex; } public void setAge(int age){ this.age = age; } public int getAge(){ return age; } } public class Student01 extends Person{ //继承了Person类 即拥有了Person类的全部属性 // 学号 private int id; // 班级编号 private int classId; public void setId(int id){ this.id = id; } public int getId(){ return id; } } public class ExtendsTest01{ public static void main(String[] args){ Student s = new Student(); s.setId(10001); s.setName("ming"); s.setSex(true); s.setAge(18); Student s1 = new Student(); s1.setId(10002); s1.setName("ming哥"); s1.setSex(true); s1.setAge(48); System.out.println("id = " + s.getId()); System.out.println("name = " + s.getName()); System.out.println("sex = " + s.getSex()); System.out.println("age = " + s.getAge()); System.out.println("id = " + s1.getId()); System.out.println("name = " + s1.getName()); System.out.println("sex = " + s1.getSex()); System.out.println("age = " + s1.getAge()); } }
    
    
  • 相关阅读:
    MQTT入门1 -- mosquitto 安装
    利用wireshark抓取TCP的整个过程分析。
    ARM Linux驱动篇 学习温度传感器ds18b20的驱动编写过程
    移植ARM linux下远程连接工具dropbear
    飞凌2440开发板制作路由器
    基于视觉寻迹的寻路算法
    Linux I2C驱动架构
    Linux 设备树学习——基于i2c总线分析
    Linux SPI驱动学习——注册匹配
    从Linux内核LED驱动来理解字符设备驱动开发流程
  • 原文地址:https://www.cnblogs.com/Deng1185246160/p/4229596.html
Copyright © 2011-2022 走看看