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. docker安装常用软件

    linux安装docker 1.安装gcc相关 yum install gcc -y yum install gcc-c++ -y 2.安装工具包 #安装工具包 yum -y install yum- ...

  2. 关于在Eclipse中使用EclEmma

    在LAB2中,要求使用EclEmma来统计JUnit测试用例的代码覆盖度.下面就来说说如何进行基本的使用来应付实验(bushi). 在这给出完全体,可以访问下面的网址进行学习. http://www. ...

  3. Spring Boot 中的异步调用

    通常我们开发的程序都是同步调用的,即程序按照代码的顺序一行一行的逐步往下执行,每一行代码都必须等待上一行代码执行完毕才能开始执行.而异步编程则没有这个限制,代码的调用不再是阻塞的.所以在一些情景下,通 ...

  4. Java mysql批量关联插入数据

    mysql 关联批量插入数据 INSERT INTO 表1 ( id, name, addTime ) SELECT UUID( ) AS id, v_Name, now( ) FROM 表2;

  5. qt webassembly emscripten build 编译 环境搭建 JS调用C++传参

    环境搭建 本文主要是针对ubuntu/mac编译环境搭建和调试环境 可以直接参考下面的dockerfile qt wasm build docker pull colorlength/qt-webas ...

  6. SQLServer 远程链接MySql数据库

    第一步:安装MySQL odbc driver 在SQL SERVER所在主机上安装MYSQL ODBC Driver; 下载地址:http://dev.mysql.com/downloads/con ...

  7. Docker部署Nginx报错 WARNING: IPv4 forwarding is disabled. Networking will not work.

    Docker 部署 Nginx 报错 WARNING: IPv4 forwarding is disabled. Networking will not work. [root@localhost ~ ...

  8. 实验2 C语言分支语句、循环语句应用编程

    一.实验目的 掌握格式化输出函数printf()和格式化输入函数scanf()的用法 掌握单个字符输出函数putchar()和单个字符输入函数getchar()的用法 理解结构化程序设计的三种基本结构 ...

  9. java输入一个字符串,要求将该字符串中出现的英文字母, * 按照顺序输出,区分大小写,且大写优先

    public static void main(String[] args) { String input ="A8r4c5jaAjp#7"; //转为char[] char[] ...

  10. Learning under Concept Drift: A Review 概念漂移综述论文阅读

    首先这是2018年一篇关于概念漂移综述的论文[1]. 最新的研究内容包括 (1)在非结构化和噪声数据集中怎么准确的检测概念漂移.how to accurately detect concept dri ...