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. go的相关包time、os、rand、fmt

    time 1.time包 2.time.Time类型, 用来表示时间 3.取当前时间, now := time.Now() 4.time.Now().Day(),time.Now().Minute() ...

  2. 使用git钩子防止合并分支

    git是一款实用的版本管理工具,我们通过git init初始化一个git仓库,git会在当前目录为我们生成一个.git/目录,用来管理我们的版本文件信息. 在这个目录中有一个二级目录.git/hook ...

  3. element-ui的确认消息弹框校验;$prompt校验

    this.$prompt('请输入您的姓名', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', inputPattern: /^.+$ ...

  4. aos.js 与 swiper 组合,翻页后无法触发aos的效果

    手动给除第一页之外的需要特效的元素添加 class="aos-animate" 转自:https://cloud.tencent.com/developer/ask/sof/302 ...

  5. 对Java要学东西的认识 (一点点javascript见解)

    JavaScript是一种脚本语言,它采用小程序段的方式实现编程.像其它脚本语言一样,JavaScript同样已是一种解释性语言,它提供了一个易的开发过程.它的基本结构形式与C.C++.VB十分类似. ...

  6. CSS vw与vh动态设置元素的高度宽度

    做为一个前端开发者,总有一天我们要设置页面某一部分内容自适应浏览器窗口大小,下面分享下使用vw和vh的设置方式, 一波解释: v(即viewport):可视窗口,也就是浏览器窗口大小.vw Viewp ...

  7. Web_ServletContext主要方法

    ServletContext:联系上下文,一个项目通用一个context,作用域:整个项目 用法:Servlet里面直接应用,tomcat帮我们自动创建. 获取ServletContext:getSe ...

  8. Java经典知识复习

    1.自增变量 int i = 1; i = i++; int j = i++; int k = i + ++i * i++; 问i.j.k分别等于? 针对这类题目,   1. 赋值操作=,最后计算: ...

  9. Websocket是什么?

    一. WebSocket是什么? Websocket是一种网络通信协议,是一个在计算机里专门在[两点]之间传输数据的约定和规范. 二. 为什么存在WebSocket? 因为 HTTP 协议有一个缺陷: ...

  10. 记录一次HAWQ手工启动

    一.环境变量初始化 使用hawq的命令必须先进行环境变量的初始化 命令不能以 root 用户执行,应该以 gpadmin 用户执行 source /usr/local/apache-hawq/gree ...