热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java重修之路(七)面向对象之静态,主函数,Doc文档,静态代码块,对象初始化过程,单例设计模式

静态(Static)是一个修饰符,用于修饰成员(包括成员变量和成员函数)被Static修饰的变量不在堆内存中&

静态(Static)


是一个修饰符,用于修饰成员(包括成员变量和成员函数)
被Static修饰的变量不在堆内存中,被提取到共享区域中,节省空间。被对象所共享。


public class Person {private int age;private String name;private String Dept = "计算机科学学院";
}
比如这个Person类,每个人的Dept都是一样的,每次new一个对象都会包含一个初始化完成的Dept,这样极大浪费空间,发现每个对象的Dept都是一样的,于是用Static修饰,将Static提到共享区域中共用,节省空间。

当成员被Static修饰时,就多了一种调用方式,除了可以被对象调用以外,还可以直接通过类名调用。类名.静态成员。
对象共享的数据才能定义为静态。
Static特点:
随着类的加载而加载,随着类的消失而消失。生命周期最长。(一旦类被调入内存,此时静态变量就已经存在)
被所有对象所共享。
优先于对象存在。
可以直接被类名调用。





实例变量和类变量的区别:
类中静态变量也称为类变量,类的成员变量成为实例变量。
1.存放位置的区别:
类变量随着类的加载而存在于方法区/共享区.
实例变量随着对象的建立存在于堆内存的对象实例里。
生命周期的区别:
类变量生命周期最长,随着类的消失而消失。
实例变量随着对象的消失而消失。





静态的使用注意事项。
1.静态方法只能访问静态成员(包括成员变量和成员方法)
原因很简单:因为静态方法随着类的加载而加载,此时对象还不存在,因此非静态的成员变量和成员方法都不存在,所以不能访问。
非静态方法既可以访问静态,也可以访问非静态。
2.静态方法中不可以定义this,super关键字,还是因为静态优先于对象存在,this也是代表对象。





利弊:
对对象的共享数据进行单独的存储, 节省空间。
可以直接被类名调用。
弊端:生命周期过长,访问有局限性。





主函数Main

public class Hello {public static void main(String[] args) {// 主函数是一个特殊的函数,作为程序的入口,可以被JVM调用。// public:访问权限最大,可以被虚拟机访问// Static:代表着主函数随着类的加载而加载// void:主函数没有具体的返回值// main:不是关键字,但是是一个特殊的标记,可以被JVM识别// 参数:是字符串数组// 主函数是固定格式的,供虚拟机识别// 主函数可以重载,但是虚拟机只识别这一个System.out.println(args.length);System.out.println(args);// 其实传进去一个数组实体,但是长度为0 new String[0]}public static void main(String[] args, int x) {System.out.println("主函数重载");}
}
打印结果:
0
[Ljava.lang.String;@2a139a55



帮助文档的制作doc

给类制作帮助文档要求类必须是public修饰
类中的私有的方法不会暴露,只会暴露public和protected会暴露出去供人使用
制作方法:
写好类和方法的注释说明之后,编译:
这里写图片描述

效果:

这里写图片描述

然后点开index.html即可查看。

这里写图片描述
至此,说明文档制作完成。


静态代码块

特点:随着类的加载而执行,只执行一次。用于给类进行初始化。

public class Person {static {System.out.println("我是静态代码块!");}public static String Name = "zhangsan";}

运行结果:

这里写图片描述



看下边执行结果:

这里写图片描述
打印结果为:bca


注意与构造代码块的区别:
静态代码块与类联系在一起,构造代码块与对象联系在一起,构造代码块详见上一篇文章构造代码块详解
静态代码块初始化类,构造代码块初始化对象。 静态代码块最先执行,只有有对象出现才会有构造代码块,注意执行顺序。
静态代码块也只能访问静态成员。


这里写图片描述


打印结果为:acd 首先是静态代码块,然后是构造代码块,然后是构造函数。





对象的初始化过程

这里写图片描述

静态方法之间互相调用,不能用this. 因为没有对象,可以用 类名. 但是一般省略。


单例设计模式


一个类在内存中只存在一个对象。

这里写图片描述


这里写图片描述


为了获取到实例,但是又不能new,只能通过getInsTance方法,但是没有对象,不能通过对象调用,只能讲此方法静态,由于静态只能调用静态,必须将s静态,然后private。最后通过类名调用。




实现方式二:懒汉式

这里写图片描述


Single类进内存,对象还没有存在,只有调用了getInstance才会建立对象。但是懒汉式有弊端,不能保证唯一性。

这里写图片描述

有可能CPU刚刚判断玩s==null 成立,就转去执行其他程序,然后B走到这里再次判断s==null成立,这时后边再执行就会有两个对象,不能保证唯一性。

解决方案:

这里写图片描述
synchronized是同步的意思,会进行加锁成立,一次只允许进一个。
建议使用饿汉式。



推荐阅读
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文介绍了Java中Currency类的getInstance()方法,该方法用于检索给定货币代码的该货币的实例。文章详细解释了方法的语法、参数、返回值和异常,并提供了一个示例程序来说明该方法的工作原理。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
author-avatar
大额资金一号
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有