1.1、static 的使用

当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过 new 关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。

我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份。

例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。

static 关键字的使用

*

* 1.static:静态的。

* 2.static 可以用来修饰:属性、方法、代码块、内部类。

*

* 3.使用 static 修饰属性:静态变量(或类变量)。

* 3.1  属性:是否使用 static 修饰,又分为:静态属性 VS 非静态属性(实例变量)

* 实例变量:我们创建了类的多个对象,每个对象都独立的拥有了一套类中的非静态属性。*

* 当修改其中一个非静态属性时,不会导致其他对象中同样的属性值的修饰。*

* 静态变量:我们创建了类的多个对象,多个对象共享同一个静态变量。当通过静态变量去修改某一个变量时,

*   会导致其他对象调用此静态变量时,是修改过的。(可以理解为修改过的为最后一次修改的值)

*          3.2 static 修饰属性的其他说明:

*                 ① 静态变量随着类的加载而加载。可以通过"类.静态变量"的方式进行调用。

*                 ② 静态变量的加载要早于对象的创建。

*                 ③ 由于类只会加载一次,则静态变量在内存中也只会存在一次。存在方法区的静态域中。

*

*                 ④          类变量          实例变量

*                 类          yes                no

*                 对象              yes                yes

*

*          3.3 静态属性举例:System.out.Math.PI;

代码

public class StaticTest {

public static void main(String[] args) {

Chinese.nation = "中国";

Chinese c1 = new Chinese();

c1.name = "姚明";

c1.age = 40;

c1.nation = "CHN";

Chinese c2 = new Chinese();

c2.name = "马龙";

c2.age = 30;

c2.nation = "CHINA";

System.out.println(c1.nation);

//编译不通过

//           Chinese.name = "张继科";

}

}

//中国人

class Chinese{

String name;

int age;

static String nation;

}  下方有图

4.使用 static 修饰方法:静态方法

 *          ① 随着类的加载而加载,可以通过"类.静态方法"的方式调用

 *          ②                 静态方法              非静态方法

 *                 类          yes                no

 *                 对象              yes                yes

 *          ③ 静态方法中,只能调用静态的方法或属性

 *            非静态的方法中,可以调用所有的方法或属性

 *

 * 5.static 注意点:

 *    5.1  在静态的方法内,不能使用 this 关键字、super 关键字

 *   5.2 关于静态属性和静态方法的使用,大家从生命周期的角度去理解。

 *  

 * 6.开发中,如何确定一个属性是否需要声明 static 的?

 *    》 属性是可以被多个对象所共享的,不会随着对象的不同而不同的。

 *    》 类中的常量也常常声明为 static

 *  

 *   开发中,如何确定一个方法是否要声明为 static 的?

 *   》 操作静态属性的方法,通常设置为 static 的

 *   》 工具类中的方法,习惯上声明为 static 的。比如:Math、Arrays、Collections

单例(Singleton)设计模式

设计模式是**在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。**设计模免去我们自己再思考和摸索。就像是经典的棋谱,不同的棋局,我们用不同的棋谱。”套路”

所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例。并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造器的访问权限设置为 private,这样,就不能用 new 操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。

/*

 * 单例设计模式:

 * 1.所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例

 * 

 * 2.如何实现?

 *   饿汉式  VS   懒汉式

 *

 * 3.区分饿汉式和懒汉式。

 *      饿汉式:坏处:对象加载时间过长。

 *                好处:饿汉式是线程安全的。

 *

 *   懒汉式:好处:延迟对象的创建。

 *                 坏处:目前的写法,会线程不安全。---》到多线程内容时,再修改

 */

方法一

类名   对象名 = null;  //声明对象、

对象名 = new 类名(形参列表);  //实例化对象

                                                           表示的为类的实例化过程

      方法二                                                       

    类名   对象名 = new  类名();

public class SingletonTest {

       public static void main(String[] args) {

//           Bank bank1 = new Bank();

//           Bank bank2 = new Bank();

             

              Bank bank1 = Bank.getInstance();

              Bank bank2 = Bank.getInstance();

             

              System.out.println(bank1 == bank2);

             

       }

}

//单例的饿汉式

class Bank{

      

       //1.私有化类的构造器

       private Bank(){

             

       }

      

       //2.内部创见类的对象

       //4.要求此对象也必须声明为静态的

       private static Bank instance = new Bank();

//类名   对象名 = new  类名();

                 //直接new出来了一个对象

       //3.提供公共的静态的方法,返回类的对象。

       public static Bank getInstance(){

              return instance;

       }

}

/*

 * 单例的懒汉式实现

 *

 */

public class SingletonTest2 {

       public static void main(String[] args) {

             

              Order order1 = Order.getInstance();

              Order order2 = Order.getInstance();

             

              System.out.println(order1 == order2);

       }

}

class Order{

       //1.私有化类的构造器

       private Order(){

             

       }

      

       //2.声明当前类对象,没有初始化。

       //此对象也必须声明为 static 的

       private static Order instance = null;

                             //类名   对象名 = null;  //声明对象、

// 对象名 = new 类名(形参列表);  //实例化对象

       //3.声明 public、static 的返回当前类对象的方法

       public static Order getInstance(){

              if(instance == null){

                     instance = new Order();                 

              }

              return instance;

       }

}

由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。

每日复习关于static 饿汉式 懒汉式,单例设计模式的更多相关文章

  1. java 单利模式设计原理,饿汉式懒汉式,开发中推荐饿汉式

    单例模式的设计:  1 //Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象. //对象是方法被调用时,才初始化,也叫做对象的延时加载.成为:懒汉式. //Si ...

  2. Java并发-懒汉式单例设计模式加volatile的原因

    懒汉式单例的double check.例一: class SingletonClass{ private static SingletonClass instance = null; private ...

  3. Java 单例设计模式之 饿汉式和懒汉式

    public class InstanceSampleTest { public static void main(String[] args) { /** 单例设计模式的 饿汉式和懒汉式 * 单例模 ...

  4. Java面试 - 什么是单例设计模式,为什么要使用单例设计模式,如何实现单例设计模式(饿汉式和懒汉式)?

    什么是单例设计模式? 单例设计模式就是一种控制实例化对象个数的设计模式. 为什么要使用单例设计模式? 使用单例设计模式可以节省内存空间,提高性能.因为很多情况下,有些类是不需要重复产生对象的. 如果重 ...

  5. 零基础学习java------day8------javabean编写规范,继承,static关键字,代码块,单例设计模式

    0. 今日内容提要 1. javabean书写规范 javabean:一个普通的类,用来描述事物的类,里面不包含任何的业务逻辑,只是用来存储数据. 比如:Teacher,Student,Mobile. ...

  6. JAVA单例模式:懒汉式,饿汉式

    今天复习了一下java的单例模式,写了懒汉式和饿汉式的实现例子.代码如下: 1.懒汉式单例 package com.lf.shejimoshi; /** * @classDesc: 类描述:(懒汉式单 ...

  7. java中的单例模式(懒汉式+饿汉式)

    什么是单例模式: 单例模式既只能在自己本类中创建有且唯一的一个实例(姑且不考虑映射的情况)通过方法将该实例对外公开 第一种:单例模式-懒汉式 既调用getInstance()方法返回实例之前判断有没有 ...

  8. Java单例模式--------懒汉式和饿汉式

    单件模式用途:单件模式属于工厂模式的特例,只是它不需要输入参数并且始终返回同一对象的引用.单件模式能够保证某一类型对象在系统中的唯一性,即某类在系统中只有一个实例.它的用途十分广泛,打个比方,我们开发 ...

  9. java设计模式单例模式 ----懒汉式与饿汉式的区别

    常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...

  10. Java中的懒汉式单例与饿汉式单例实例详解

    懒汉式单例:线程非安全,当被调用的时候才创建实例,效率较高 public class LazySingleton { private static LazySingleton lazySingleto ...

随机推荐

  1. 执行kubectl api-resources 报错error: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request

    1.故障现象:error: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the serve ...

  2. CSS 常用样式-字体属性

    字体类样式我们已经学习过字号font-size.字体font-family两个属性,接下来还有几个常用的字体属性. 粗细 font-weight: 作用:设置文字是否加粗显示. 属性名:font-we ...

  3. C语言初级阶段7——指针2——特殊指针

    C语言初级阶段7--指针2--特殊指针 指针函数:是一个函数,返回值类型是一个指针. #include<stdio.h> int* fun() { //a是一个局部变量 int a = 1 ...

  4. 服务器端口对外开放(包括,mysql,django)

    1.查看对外开放端口号,并开放端口 查看开放的端口 ,有两个命令 1.1.iptables -L -n (比较清晰明了) 1. 2.firewall-cmd --list-ports 1.3 .打开端 ...

  5. 剑指offer-孩子们的游戏

    题目描述:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指 ...

  6. TCP 为什么是 三次 握手 不是两次 不是四次

    ​ 为什么不是两次 (1) 防止 历史 旧数据 连接 客户端连续发送多次 SYN 建⽴连接的报⽂,在⽹络拥堵等情况下: ● ⼀个「旧 SYN 报⽂」⽐「最新的 SYN 」 报⽂早到达了服务端: ● 那 ...

  7. 服务器安装docker

    安装命令: curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 使用国内 daocloud 一键安装: curl -s ...

  8. (三).JavaScript的分支结构和循环结构

    1. 分支结构 1.1 分支语句之单分支 ①.语法: if(值,如果不是布尔值会强制转换成布尔值) { 代码块; } ②.案例: // 案例:如果a变量的值加键盘上输入的数大于100,就打印我爱你二狗 ...

  9. CH573 CH582 CH579蓝牙从机(peripheral)例程讲解二(广播内容修改)

    在上一篇外设例程讲解中讲述了蓝牙从机的收发接口,这样可以快速的上手,那么接下来就讲解另一个重要设置,从机的广播. 在peripheral例程中,一直是以50ms的周期进行广播,使用手机软件扫描可以获取 ...

  10. loadrunner入门(关联)

    左右边界:提取第一个id web_reg_save_param_ex(                 "ParamName=Id",         "LB=//OK[ ...