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中如果把构造方法也私有化,如何创建对象?Java的单例设计模式——饿汉式和懒汉式区别

    Java的单例模式——饿汉式 package com.swift; //Java单例设计模式——恶汉式 public class SinglePerson { private String name= ...

  2. Java中单例设计模式,饿汉式和懒汉式

    Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯 ...

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

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

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

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

  5. 类(静态)变量和类(静态)static方法以及main方法、代码块,final方法的使用,单例设计模式

    类的加载:时间 1.创建对象实例(new 一个新对象时) 2.创建子类对象实例,父类也会被加载 3.使用类的静态成员时(静态属性,静态方法) 一.static 静态变量:类变量,静态属性(会被该类的所 ...

  6. java基础10 单例模式之饿汉式和懒汉式单例

    前言: 软件行业中有23中设计模式 单例模式    模版模式    装饰者模式    观察者模式    工厂模式    ........... 单例模式 1. 单例模式包括 1.1 饿汉式单例 1.2 ...

  7. C#单例---饿汉式和懒汉式

    单例模式: 步骤: 1.定义静态私有对象 2.构造函数私有化 3.定义一个静态的,返回值为该类型的方法,一般以Getinstance/getInit为方法名称 单例模式有懒汉和饿汉,最好使用饿汉 1. ...

  8. Singleton模式(单例模式) 饿汉式和懒汉式

    目的:整个应用中有且只有一个实例,所有指向该类型实例的引用都指向这个实例. 好比一个国家就只有一个皇帝(XXX),此时每个人叫的“皇帝”都是指叫的XXX本人; 常见单例模式类型: 饿汉式单例:直接将对 ...

  9. 设计模式:单例模式介绍及8种写法(饿汉式、懒汉式、Double-Check、静态内部类、枚举)

    一.饿汉式(静态常量) 这种饿汉式的单例模式构造的步骤如下: 构造器私有化:(防止用new来得到对象实例) 类的内部创建对象:(因为1,所以2) 向外暴露一个静态的公共方法:(getInstance) ...

  10. java单例模式(饿汉式和懒汉式)

    1 /* 2 * 设计模式:对问题行之有效的解决方式.其实它是一种思想. 3 * 4 * 1,单例设计模式 5 * 解决的问题:就是可以保证一个类在内容中的对象唯一性. 6 * 7 * 必须对于多个程 ...

随机推荐

  1. js-label

    js中的label就像一个对已有语句块的命名,函数有了函数名我们可以随时调用它,语句块有了语句名我们也可以随时调用它,将他运用到循环中可快速跳出 循环. var num = 0;for (var i ...

  2. Jmeter 接口自动化 对变量【登录密码】进行加密处理

    在我们使用Jmeter测试的过程中,尤其是接口测试,有时候需要对参数进行MD5加密后再进行操作: Jmeter自带的就有MD5加密需要使用的到的jar(注意jmeter版本):commons-code ...

  3. centos7部署teleport堡垒机

    Centos7.9部署Teleport堡垒机 简介 Teleport是一款简单易用的开源堡垒机系统,具有小巧.易用的特点,支持 RDP/SSH/SFTP/Telnet 协议的远程连接和审计管理.Tel ...

  4. 【原创】解决Multiple dex files define问题的思路

    Multiple dex files define Landroid/support/v4/media/MediaMetadataCompat$Builder; 工作中我们可能会遇到各种 muxtip ...

  5. C# 图片 等 文件 读取操作 的一点提示

    源于:在读取图片时,总喜欢首先采用:Image img=Image.FromFile("");操作,这种方式由于 调用图片的程序与图片文件是通过 绝对地址关联的,会造成 当前进程或 ...

  6. git—分支设置

    什么是分支? 项目以上线,但需要开发新的功能.不能直接在项目上进行开发的,这时候就需要创建一个分支,去完成新功能的开发.测试等.完成之后合并到主分支上面.如果新功能的开发不用分支,导致的问题就会有很多 ...

  7. GFF2GTF.py2

    import sys inFile = open(sys.argv[1],'r') for line in inFile: #skip comment lines that start with th ...

  8. 用反证法说明List<Object>和List<String>不存在子父类关系可行吗?

    看宋红康老师的Java基础视频讲解,视频中用反证法证明List

  9. element ui 全选反选

    <el-checkbox class="selectAll" :indeterminate="isIndeterminate" v-model=" ...

  10. MySQL 分组排序,取第一条

    select t1.* from coal_installed_capacity t1where NOT EXISTS (select * from coal_installed_capacity t ...