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. P2P网络

    P2P 网络是什么 点对点技术(peer-to-peer, 简称 P2P )又称对等互联网络技术,是一种网络技术,依赖网络中参与者的计算能力和带宽,而不是把依赖都聚集在较少的几台服务器上. 即不是传统 ...

  2. 给linux串口,增加登录密码

    一.密码更改 1.在linux系统上,输入passwd,输入需要设定的密码,密码文件保存在/etc/passwd里面. 2.把/etc/passwd文件拷贝出来,放到rootfs的etc/目录下,实现 ...

  3. Long类型转换为IP String

    package com.barry.iputil.util; public class IPFormat { public static String toIPStr(Long LongIP) { i ...

  4. sat初学入门资料2022-12

    1. GlueMiniSatPPT-nabeshima.pdf A fast SAT solver with an aggressive acquiring strategy of glue clau ...

  5. IntelliJ IDEA 最新激活破解教程,永久激活,亲测有效

    使用ja-netfilter激活Jetbrains系列软件 注意:无限试用脚本已经失效.本教程适合2021.3.*之上的高版本,使用ja-netfilter插件进行激活操作,永久有效 激活步骤: 第一 ...

  6. 黑马 java.lang.IllegalArgumentException: Property ‘dataSource‘ is required

    现象: 按照教程步骤做的,但连单元测试都无法通过,会出现java.lang.IllegalArgumentException: Property 'dataSource' is required这个错 ...

  7. jsp第十周

    数据库test 中建个表 stu(stuid 主键 自动增长 ,用户名,密码,年龄) 1.设计一个注册页面,实现用户注册功能2.设计一个登陆页面,实现用户名密码登陆3.两个页面可以互相超链接 Base ...

  8. 数字子串的和 str2int

    UVA1673 这道题可以用广义后缀自动机,不过陈锋老师给我们讲了一个巧妙地方法,使得这道题可以用普通的后缀自动机做. 题目大意: 给出NNN个完全由数字组成的字符串.计算将这个NNN的字符串的所有子 ...

  9. JavaWeb学习--EL表达式

    一.EL表达式: 1.命令表达式: ${作用域对象别名.共享数据} 2.命令作用: 1)EL表达式是EL工具包提供一种特殊命令格式[表达式命令格式] 2)EL表达式在JSP文件上使用 3)负责在JSP ...

  10. jmeter 正则表达式提取关联参数

    自己也是初学,今天就正则表达式提取关联参数举几个例子. 理论: 1.提取单个字符串: 假如想匹配Web页面的如下部分:name = "file" value = "rea ...