构造方法

架构师内功心法,经典高频面试的单例模式详解

回眸只為那壹抹淺笑 提交于 2020-02-27 08:15:51
一、单例模式应用场景 单例模式(Single Pattern)是指 确保一个类在任何情况下绝对只是一个实例,并提供一个全局的访问点。 单例模式在现实生活中的应用也很广泛。例如国家总统、公司CEO、部门经理等。在java标准中,ServletContext、ServletContextConfig等;在Spring框架中ApplicationCotext;数据库对应的连接池也都是单例形势的。 二、单例模式分类 2.1 饿汉式单例 饿汉式单例是在类加载的时候就立即初始化了,并且创建了单例对象。绝对的线程安全,在线程还没出现以前就实例化了,不可能存在访问安全问题。 优点:没有加任何的锁,执行效率高,在用户体验上,比懒汉式更好。 缺点:类加载的时候就初始化了,不管用与不用都占空间,浪费了内存,有可能占着茅坑不拉屎。 Spring中的IOC容器ApplicationContext 本身就是典型的饿汉式单例。案例代码: public class HungrySingleton { /** * 先静态后动态 * 先属性后方法 * 先上后下 */ private static final HungrySingleton hungrySingleton = new HungrySingleton(); private HungrySingleton() { } public static

Java学习-综合案列-文件上传

大城市里の小女人 提交于 2020-02-27 01:41:36
综合案例_文件上传的原理 综合案例_文件上传案例的客户端 import java . io . FileInputStream ; import java . io . IOException ; import java . io . InputStream ; import java . io . OutputStream ; import java . net . Socket ; /* 文件上传案例的客户端:读取本地文件,上传到服务器,读取服务器回写的数据 明确: 数据源:c:\\1.jpg 目的地:服务器 实现步骤: 1.创建一个本地字节输入流FileInputStream对象,构造方法中绑定要读取的数据源 2.创建一个客户端Socket对象,构造方法中绑定服务器的IP地址和端口号 3.使用Socket中的方法getOutputStream,获取网络字节输出流OutputStream对象 4.使用本地字节输入流FileInputStream对象中的方法read,读取本地文件 5.使用网络字节输出流OutputStream对象中的方法write,把读取到的文件上传到服务器 6.使用Socket中的方法getInputStream,获取网络字节输入流InputStream对象 7.使用网络字节输入流InputStream对象中的方法read读取服务回写的数据 8.释放资源

Java编程的逻辑 (58) - 文本文件和字符流

╄→гoц情女王★ 提交于 2020-02-26 22:20:15
上节我们介绍了如何以字节流的方式处理文件,我们提到,对于文本文件,字节流没有编码的概念,不能按行处理,使用不太方便,更适合的是使用字符流,本节就来介绍字符流。 我们首先简要介绍下文本文件的基本概念、与二进制文件的区别、编码、以及字符流和字节流的区别,然后我们介绍Java中的主要字符流,它们有: Reader/Writer:字符流的基类,它们是抽象类。 InputStreamReader/OutputStreamWriter:适配器类,输入是InputStream,输出是OutputStream,将字节流转换为字符流。 FileReader/FileWriter:输入源和输出目标是文件的字符流。 CharArrayReader/CharArrayWriter: 输入源和输出目标是char数组的字符流。 StringReader/StringWriter:输入源和输出目标是String的字符流。 BufferedReader/BufferedWriter:装饰类,对输入输出流提供缓冲,以及按行读写功能。 PrintWriter:装饰类,可将基本类型和对象转换为其字符串形式输出的类。 除了这些类,Java中还有一个类Scanner,类似于一个Reader,但不是Reader的子类,可以读取基本类型的字符串形式,类似于PrintWriter的逆操作。 理解了字节流和字符流后

面向对象 总结笔记

断了今生、忘了曾经 提交于 2020-02-25 22:11:04
1.面向对象 面向对象的特点:封装、继承、多态、抽象 封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。封装是一种信息隐藏技术,在java中通过关键字private,protected和public实现封装。 适当的封装可以让程式码更容易理解和维护,也加强了程式码的安全性。 继承:继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。 多态:多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作 抽象 温馨提示:对象与实例是同一个概念,创建一个对象就是创建一个实例。程序员最不缺的就是对象,想要自己就new一个呗。 2.类 public class A { //成员属性 private String name; private int age; //构造方法,一般用于对象的初始化 A(String name,int age) { super();//这个super是默认隐藏的,继承父类的构造方法。 this.name=name; this.age=age; } //toString方法,默认返回哈希值 public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode());

JAVA生疏笔记 正则表达式

允我心安 提交于 2020-02-25 21:56:18
Java 正则表达式 正则表达式==一个字符串 定义了字符串的模式 用于匹配 菜鸟教程学习链接 https://www.runoob.com/java/java-regular-expressions.html 构造方法 当一个对象被创建时候,构造方法用来初始化该对象。构造方法和它所在类的名字相同,但构造方法没有返回值。 通常会使用构造方法给一个类的实例变量赋初值,或者执行其它必要的步骤来创建一个完整的对象。 不管你是否自定义构造方法,所有的类都有构造方法,因为Java自动提供了一个默认构造方法,默认构造方法的访问修改符和类的访问修改符相同(类为 public,构造函数也为 public;类改为 protected,构造函数也改为 protected)。 一旦你定义了自己的构造方法,默认构造方法就会失效。 Puppy myPuppy = new Puppy( "tommy" ); 对象 类名=NEW 对象 Java Scanner 类 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。 Scanner s = new Scanner(System.in); 重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。 即外壳不变,核心重写! 重载(Overload) 重载

单例模式

戏子无情 提交于 2020-02-25 19:27:00
1.单例模式 保证一个类仅有一个实例。 (1)实现方式 1、懒汉模式(线程不安全) 2、懒汉模式(线程安全) 3、饿汉模式(线程安全) 4、静态类内部加载(线程安全) 5、枚举方法(线程安全) 6、双重校验锁法(通常线程安全,低概率不安全) 7、带 volatile 的双重校验锁法(线程安全) 8、使用 ThreadLocal 实现单例模式(线程安全) 9、使用 CAS 锁实现(线程安全) … 实际还有各种奇淫技巧,不只只 9 种方式。 单例模式的安全方式 单例模式大家并不陌生,也都知道它分为什么懒汉式、饿汉式之类的。但是你对单例模式的理解足够透彻吗?今天我带大家一起来看看我眼中的单例,可能会跟你的认识有所不同。 下面是一个简单的小实例: [java] view plaincopyprint? 1. //简单懒汉式 2. public class Singleton { 3. 4. //单例实例变量 5. private static Singleton instance = null; 6. 7. //私有化的构造方法,保证外部的类不能通过构造器来实例化 8. private Singleton() {} 9. 10. //获取单例对象实例 11. public static Singleton getInstance() { 12. 13. if (instance ==

Java基础——对象和类

ⅰ亾dé卋堺 提交于 2020-02-24 23:05:25
  将包含main方法的类称为主类。   变量的作用域是指变量可以在程序中引用的范围。   实例变量和静态变量的作用域是整个类,无论变量是在哪里声明的。   局部变量的声明和使用都在一个方法的内部。   一个类的实例变量和静态变量称为类变量或数据域。在方法内部定义的变量成为局部变量。   局部变量的作用域从声明变量的地方开始,直到包含该变量的块结束为止。局部变量都必须在使用之前进行声明和赋值。(Java没有给局部变量赋默认值)   无论在何处声明,类变量的作用域都是整个类。类的变量和方法可以在类中以任意顺序出现。但当一个数据域是基于对另一个数据域的引用来进行初始化时则不是这样。在这种情况下,必须首先声明另一个数据域。   类变量只能声明一次,但是在同一个方法内不同的非嵌套块中,可以多次声明相同的变量名。   可以在一个方法的不同块里声明同名的局部变量,但是,不能在嵌套块中或同一个块中两次声明同一个局部变量。   如果一个局部变量和一个类变量具有相同的名字,那么局部变量优先,而同名的类变量将被隐藏。   可以把两个类放在同一个文件中,但是文件中只能有一个类是公共(public)类。此外,公共类必须与文件同名。源代码中的每个类编译成.class文件。   构造方法在使用new操作符创建对象的时候调用,它是一种特殊的方法,有以下三个特殊性:    (1)构造方法必须具备和所在类相同的名字

高并发之——从源码角度分析创建线程池究竟有哪些方式

99封情书 提交于 2020-02-24 18:21:30
前言 在Java的高并发领域,线程池一直是一个绕不开的话题。有些童鞋一直在使用线程池,但是,对于如何创建线程池仅仅停留在使用Executors工具类的方式,那么,创建线程池究竟存在哪几种方式呢?就让我们一起从创建线程池的源码来深入分析究竟有哪些方式可以创建线程池。 使用Executors工具类创建线程池 在创建线程池时,初学者用的最多的就是Executors 这个工具类,而使用这个工具类创建线程池时非常简单的,不需要关注太多的线程池细节,只需要传入必要的参数即可。Executors 工具类提供了几种创建线程池的方法,如下所示。 Executors.newCachedThreadPool:创建一个可缓存的线程池,如果线程池的大小超过了需要,可以灵活回收空闲线程,如果没有可回收线程,则新建线程 Executors.newFixedThreadPool:创建一个定长的线程池,可以控制线程的最大并发数,超出的线程会在队列中等待 Executors.newScheduledThreadPool:创建一个定长的线程池,支持定时、周期性的任务执行 Executors.newSingleThreadExecutor: 创建一个单线程化的线程池,使用一个唯一的工作线程执行任务,保证所有任务按照指定顺序(先入先出或者优先级)执行 Executors

【Java基础】(十)关键字this

扶醉桌前 提交于 2020-02-24 14:25:24
this的两种使用方法 一、this指代具体的对象 二、this也可表示当前类的构造方法 this在自定义的类的方法中使用,有两种使用方法。 一、this指代具体的对象 在我编写本类方法时,有时可能会需要使用本类的对象,这时候我们利用this代替该对象。 比如在我们set的方法中。 在这里,我们有两个carNum,一个是我们要传进来的参数,另一个呢,是我们的成员变量。为了区分这两个,我们就用了this来代表我们这个类的一个对象。 此时的this的用法,就和你在类外去使用一个这个类的对象是一样的。this.carNum也就是我们这个类对象的carNum属性。单独的carNum呢,就是我们传进来的参数。同理,你也可以用this来访问本类中的方法。 不知道有没有人和我学的时候一样,有个困扰,既然是名字重了,那我给改个名字不就好了。 其实是可以的,至于为什么不这么做呢,我是下面这样理解的。 比如我们如果有个学生类,属性中有个 “姓名”,我们参数整了个 “叫啥”,其实可以解决问题,但总是容易给人造成困扰,我想要姓名,你给我弄了个叫啥来,那这个叫啥和姓名是一样的吗,还是不一样?这就会造成困惑。 当然,这也仅仅是我的个人理解。 二、this也可表示当前类的构造方法 在我们编写类的方法时,不能直接访问类的构造方法,但可以用this来表示类的构造方法。 例如:还是我们之前的Car类

Java基础学习--抽象类与抽象函数

爱⌒轻易说出口 提交于 2020-02-24 05:04:27
抽象类的作用是强制定义了其子类的实现要求(抽象类中有一些抽象方法,子类若想继承自抽象类则必须覆盖这些方法。在实际开发中,几乎不会使用普通类来定义子类,大多数都是继承抽象类) 规范:abstract class A {        public abstract void fun1();        public void fun2() {          System.out.println("hello");        }      } 抽象类不能制造对象,但是可以定义变量,赋给这个变量的一定是他非抽象子类的对象; 抽象类中的抽象函数没有函数体,例如:public abstract void move(); 一个抽象类可以没有任何抽象方法,所有的方法都有方法体,但是整个类是抽象的。 抽象类中所有的的抽象函数必需子类的覆盖,而非抽象函数不需要覆盖。因为子类会继承父类的函数,如果不去覆盖继承来的抽象函数,那么子类就含有抽象函数,含有抽象函数的类必须要声明为抽象类。 设计这样的抽象类主要是为了防止制造它的对象出来。 有抽象方法的类一定是抽象类!(有abstract修饰的方法,并且方法没有方法体,这样的类一定是抽象类,并且类前面一定要有abstract来修饰) 但抽象类不一定有抽象方法(有abstract来修饰的类一定是抽象类,但抽象类里不一定有抽象方法) 相关说明: