精华内容
下载资源
问答
  • Java单例模式的讲解
    2021-04-17 06:24:34

    1,单例模式的要素

    1)私有构造方法。

    2)public static synchronized的getInstance()方法。

    上述2个要素虽然可以保证单例模式的实现,但并不是最好的方式。因为当我们讨论性能时,synchronized方法有着非常昂贵的代价。

    2,多线程使用环境下的线程安全实现方式

    a)使用double locking机制的懒初始化。代码如下。在这种情况下,当调用getInstance方法时,才会创建单例对象。

    b)使用静态属性的早初始化。代码如下。下面的实现方式,当类被加载时,单例对象就会创建。因为单例对象是静态的。类只会被加载一次,保证了单例对象的唯一性。

    3,protected 的构造函数

    有时候,为了能够继承单例类,我们可以使用protected的构造函数。但是,这样会有2个缺点,让单例继承不实用。

    第一点,如果构造函数是protected的,这意味着单例类可以被相同包下另一个类通过调用构造函数的方式来创建。一个可以避免这种情况的解决方法是,把单例类放在一个单独的包里。

    第二点,为了能够使用继承类,代码中所有已经调用Singleton.getInstance方法的地方,都需要修改为DerivedSingleton.getInstance方法。

    4,使用不同类加载器的情景

    如果一个类被2个类加载器加载了,那么,在内存里,它们是2个不同的类。

    5,序列化

    如果一个单例类实现了Serializable接口,当单例序列化,然后多次反序列化时,将会有多个对象被创建。

    热点:

    多线程:如果单例需要在多线程环境下使用,应该要特别留心。

    序列化:当单例类实现了Serializable接口时,它必须重写readResolve方法来避免出现2个对象。

    类加载器:如果单例类被2个不同的类加载器加载,那么我们会有2个不同的类,一个类加载器会有一个类。

    通过类目进行全局访问:单例对象是通过类名获取的。初看起来,这是一个访问它的很简单的方式,但却不是很灵活。如果我们需要替换单例类,那么代码中所有引用的地方都需要修改。

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对聚米学院的支持。如果你想了解更多相关内容请查看下面相关链接

    更多相关内容
  • Java单例模式继承覆盖多态原理详解

    千次阅读 2021-03-15 14:47:44
    为了保证jvm中某一类型的java对象永远只有一个,同时也是为了节省内存的开销。因为外面程序可以通过new的方法直接调用类里面的构造方法。导致该类的对象不止一个。2)定义单例模式的意思就是只有一个实例。单例模式...

    cbe8e7e9b010ec2dd7289731609c8a68.png

    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;

    }

    }

    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;

    }

    }

    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);

    }

    }

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持云海天教程。

    原文链接:https://www.cnblogs.com/jiarui-zjb/p/6179522.html

    展开全文
  • JAVA单例模式

    2021-02-12 18:32:20
    定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。类型:创建类模式类图:类图知识点:1....单例模式应该是23种设计模式中最简单的一种模式了。它有以下几个要素:• 私有的...

    定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

    类型:创建类模式

    类图:

    ad8ca4dabff6c1e0041507e951d2372c.png

    类图知识点:

    1.类图分为三部分,依次是类名、属性、方法

    2.以<>结尾的为注释信息

    3.修饰符+代表public,-代表private,#代表protected,什么都没有代表包可见。

    4.带下划线的属性或方法代表是静态的。

    单例模式应该是23种设计模式中最简单的一种模式了。它有以下几个要素:

    • 私有的构造方法

    • 指向自己实例的私有静态引用

    • 以自己实例为返回值的静态的公有的方法

    单例模式根据实例化对象时机的不同分为两种:一种是饿汉式单例,一种是懒汉式单例。饿汉式单例在单例类被

    加载时候,就实例化一个对象交给自己的引用;而懒汉式在调用取得实例方法的时候才会实例化对象。代码如

    下:

    饿汉式单例

    public class Singleton {

    private static Singleton singleton = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){

    return singleton;

    }

    }

    懒汉式单例

    public class Singleton {

    private static Singleton singleton;

    private Singleton(){}

    public static synchronized Singleton getInstance(){

    if(singleton==null){

    singleton = new Singleton();

    }

    return singleton;

    }

    }

    单例模式的优点:

    • 在内存中只有一个对象,节省内存空间。

    • 避免频繁的创建销毁对象,可以提高性能。

    • 避免对共享资源的多重占用。

    • 可以全局访问。

    适用场景:由于单例模式的以上优点,所以是编程中用的比较多的一种设计模式。我总结了一下我所知道的适合

    使用单例模式的场景:

    • 需要频繁实例化然后销毁的对象。

    • 创建对象时耗时过多或者耗资源过多,但又经常用到的对象。

    • 有状态的工具类对象。

    • 频繁访问数据库或文件的对象。

    • 以及其他我没用过的所有要求只有一个对象的场景。

    单例模式注意事项:

    • 只能使用单例类提供的方法得到单例对象,不要使用反射,否则将会实例化一个新对象。

    • 不要做断开单例类对象与类中静态引用的危险操作。

    • 多线程使用单例使用共享资源时,注意线程安全问题。

    在一个jvm中会出现多个单例吗??

    在分布式系统、多个类加载器、以及序列化的的情况下,会产生多个单例,这一点是无庸置疑的。那么在同一个j

    vm中,会不会产生单例呢?使用单例提供的getInstance()方法只能得到同一个单例,除非是使用反射方式,将

    会得到新的单例。代码如下

    Class c = Class.forName(Singleton.class.getName());

    Constructor ct = c.getDeclaredConstructor();

    ct.setAccessible(true);

    Singleton singleton = (Singleton)ct.newInstance();

    懒汉式单例线程安全吗

    主要是网上的一些说法,懒汉式的单例模式是线程不安全的,即使是在实例化对象的方法上加synchronized关键

    字,也依然是危险的,但是笔者经过编码测试,发现加synchronized关键字修饰后,虽然对性能有部分影响,但

    是却是线程安全的,并不会产生实例化多个对象的情况。

    单例模式只有饿汉式和懒汉式两种吗

    饿汉式单例和懒汉式单例只是两种比较主流和常用的单例模式方法,从理论上讲,任何可以实现一个类只有一个

    实例的设计模式,都可以称为单例模式。

    单例类可以被继承吗

    饿汉式单例和懒汉式单例由于构造方法是private的,所以他们都是不可继承的,但是其他很多单例模式是可以继

    承的,例如登记式单例。

    饿汉式单例好还是懒汉式单例好

    在java中,饿汉式单例要优于懒汉式单例。C++中则一般使用懒汉式单例。

    展开全文
  • java继承单例模式

    2021-08-07 15:44:22
    1.java继承: 把多个类的公共部分提取出来,作为一个父类 继承java中实现代码重用的重要手段之一,java只支持单根继承,一个类只能有一个直接父类 子类可以用关键字extends来继承父类,可以继承父类的所有的...

    1.java继承:

    把多个类的公共部分提取出来,作为一个父类

    继承是java中实现代码重用的重要手段之一,java只支持单根继承,一个类只能有一个直接父类

    子类可以用关键字extends来继承父类,可以继承父类的所有的属性和方法(私有属性和方法不可)

     继承的时候,创建子类对象前必须先隐形创建父类对象

    只要父类有无参构造,创建子类的时候,会执行父类无参构造

    如果父类只有有参构造,没有无参,子类的构造方法会失效,除非子类用super关键字显示的调用父类有参构造

    所有的构造方法都是来自Object类,Object类是所有类型的父类

    public class A{
    
    }
    //相当于
    public class A extends Object{
    
    }

    this带表本类对象,super代表父类对象(没有同名属性、方法的时候,两者效果相同)

    2.super

    子类访问父类成员:

    访问父类的构造方法:在访问的时候,必须放在第一句

    super();  //访问父类的无参构造

    super(参数);  //访问父类的有参构造,参数类型个数等同于父类有参构造

    访问父类属性:super.name;

    访问父类方法:super.print();

    私有属性和方法不可以访问

    继承条件下的构造方法:
     

    子类通过super调用父类的有参通过this调用其他构造方法
    默认调用父类无参
    执行父类对应,父类无参不执行
    遵守上面两条规定

    3.单例模式

    单例模式确保某个类只有一个实例化对象。

    懒汉式:
    private static Singleton s;
    pbulic static Singleton getInstance()
    {
    	if(s==null)
    	{
    	s=new Songleton();
    	}
    	return s;
    }
    饿汉式:
    private static Singleton s;
    static 
    {
    	s=new Songleton();
    }
    public static Singleton2 getInstancs()
    {
    	return s;
    }

    展开全文
  • 设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。...
  • Java单例继承

    2020-03-23 15:46:09
    单例对象的类必须保证只有一个实例存在——这是维基百科上对单例的定义,这也可以作为对意图实现单例模式的代码进行检验的标准。 对单例的实现可以分为两大类——懒汉式和饿汉式,他们的区别在于: 懒汉式:指全局的...
  • JAVA继承:子类凭什么叫父类爹?因为写了extends子类实例化的时候访问父类中的构造函数在子类构造对象时,发现访问子类构造函数时,父类也运行了,为什么呢?原因:在子类的构造函数中第一行有一个默认的隐式语句。...
  • 1.若类中的方法都是静态的,该类是不需要创建对象的。可以将工具类中的构造函数私有化...单例设计模式:保证一个类在内存中的对象唯一性。  必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性
  • 文章目录昨天知识总结封装性类的关系--继承重写继承使用构造方法单例设计模式饿汉式懒汉式修饰词final 昨天知识总结 1.static 成员变量和局部变量的区别 static修饰成员后的作用 static作用总结 2....
  • import java.util.HashMap; import java.util.Map; public class demo {  public static void main(String args[]) throws InstantiationException,  IllegalAccessException, ClassNotFoundException...
  • java 单例模式线程安全问题SpringIOC容器默认提供bean的访问作用域是单例模式。即在整个application生命周期中,只有一个instance。因此在多线程并发下,会有线程安全风险。我们在MVC框架下的servlet就是线程安全的...
  • 实用的Bean工厂ApplicationContext,ApplicationContext的中文意思是“应用前后关系”,它继承自BeanFactory接口; ApplicationContext容器实例化后会自动对所有的单实例Bean进行实例化与依赖关系的装配,使之处于...
  • 为了保证jvm中某一类型的java对象永远只有一个,同时也是为了节省内存的开销。因为外面程序可以通过new的方法直接调用类里面的构造方法。导致该类的对象不止一个。2)定义单例模式的意思就是只有一个实例。单例模式...
  • strtok函数实际上是要把第一个参数的字符串进行修改的。因为这个原因这个字符串的存储... 说明1)单例模式:确保一个类只有一个实例,自行实例化并向系统提供这个实例2)单例模式分类:饿单例模式(类加载时实例化一个...
  • 单例模式: 单例模式(Singleton)是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个...
  • 单例对象的类必须保证只有一个实力存在----这是维基百科上对单例的定义,这也可以作为对意图实现单例模式的代码进行检验的标准。 单例分为两大类 1.懒汉式:指全局的单例实例在第一次被使用时构建。 2.饿汉式:指...
  • 一、背景最近在学习设计模式,在看到单例模式的时候,我一开始以为直接很了解单例模式了,实现起来也很简单,但是实际上单例模式有着好几个变种,并且多线程中涉及到线程安全问题,那么本文我们就来好好聊聊单例模式...
  • 1.单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象...
  • Java单例模式说明:在Java中单例模式分为两种:1.饿汉式单例:在定义实例以供外部使用的时候直接实例化对象,不存在线程安全问题2.懒汉式单例:在定义实例的时候不初始化对象(使用的时候再初始化),节省空间,但存在线程...
  • Java 单例设计模式单例设计模式1、设计模式单例设计模式继承supe关键字方法的重写(覆盖)常见的面试题静态成员的继承 单例设计模式 1、设计模式     针对特定的问题提供的固定的最优的解决方案...
  • c#中 :-------------------------------当对一个类应用 sealed修饰符时,此修饰符会阻止其他类从该类继承java中:-----------------------------...
  • java基础之单例设计与继承

    千次阅读 2017-07-19 19:36:15
    static关键字/static关键字/工具类/单例设计/继承
  • java 单例模式饿汉式单例对于饿汉模式,我们可这样理解:该单例类非常饿,迫切需要吃东西,所以它在类加载的时候就立即创建对象。懒汉式单例类对于懒汉模式,我们可以这样理解:该单例类非常懒,只有在自身需要的...
  • Java中的单例继承

    2020-03-24 09:22:43
    因程序需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计。 二. 单例模式的特点 单例模式只能有一个实例。 单例类必须创建自己的唯一实例。 单例类必须向其他...
  • 由于常见的单例模式,饿汉式单例和懒汉式单例,构造方法都私有了,因此不能被继承.最近在开发中遇到问题了,恰好需要继承单例类....代码清单3:登记式单例类import java.util.HashMap;public class RegSingleton{stat...
  • java枚举方式实现单例

    2021-08-23 20:19:11
    } } 原理: 枚举本质上是一个java类,继承自Enum类,但是我们不能人为的继承Enum类。 我们看代码,我们定义一个枚举: public enum Size { SMALL, MEDIUM, LARGE } 它被编译器编译后对应的java类就是这样: public ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 99,942
精华内容 39,976
关键字:

java单例继承

java 订阅