成员变量分为两类:

1、静态成员变量(由static修饰,内存加载一次):常表示在线人数需要被共享的信息,可以被共享访问。
(1) 注意:一般static都是用public修饰。Public static int number=;
(2) 静态成员变量一般由类访问。也可以用对象访问(但不推荐)
(3) 同一类中静态成员变量的访问可以省略类名。同一个类中,访问静态方法,类名可以省略不写【这点就可以解释在主函数main中,可以不用写类名,直接写方法名就可以用这个方法。】
2、实例成员变量(无static修饰,存在于每个对象中),常表示对象的属性如:姓名、年龄等。
(1) 实例成员变量,属于每个对象,必须通过对象来访问。

内存原理

  1. 将类加载到方法区,同时会在堆内存中开辟出一块这个类的静态变量区(实例成员变量暂时不会被加载)
  2. 提取main方法到栈内存。可以直接访问堆内存中的静态变量。如果在同一类,则不需要在变量前面加类名,也可以直接访问。
  3. 在main 方法中开辟变量空间,在堆内存中new了一个新对象,同时对对象的实例成员变量赋值。将该对象在堆内存中的地址赋给栈内存中的变量空间。必须通过对象才能访问实例成员变量。

image.png

Static修饰成员方法基本用法

同样,成员方法也分为两类:
1、静态成员方法:有static修饰,归属于类。用类名访问。同一个类中,访问静态方法,类名可以省略不写
2、实例成员方法:无static修饰,归属于对象,只能用对象除法访问。
使用场景
实例方法:表示对象自己的行为,且方法中需要访问实例成员。
静态方法:如果该方法是以执行一个共用功能为目的。

Static修饰成员方法的内存原理

1、当类被加载到方法区的时候,其静态方法也已经被加载了出来,但成员方法还暂时没有加载。
2、Main方法加载到栈内存,然后创建对象(在堆内存中创建对象,在栈内存中的main方法中存放着对象在堆内存的地址。)对象中包含着实例成员变量和实例成员方法(方法在方法引用中。)当需要用到方法时,实例方法会加载到方法区中。
3、当要用到实例成员方式时,通过对象中存储的方法地址,在方法区中找到方法。

Static 注意事项
1、静态方法只能访问静态成员,不能直接访问实例成员。但是可以通过对象来间接访问。
2、实例方法可以访问静态成员,也可以访问实例成员
3、静态方法中是不可以出现this关键字的。

Static静态关键字

Static 工具类

在开发中会遇到多处地方用到同一个功能,出现代码重复度过高的问题。
工具类的定义

类中都是一些静态方法,每个方法都是以完成一个共用的功能为目的,这个类用来给系统开发人员共同使用的。

工具类的要求
1、工具类构造器私有化处理

  1. private 类名 (){}

2、工具类不需要创建对象;3、一般工具类起名为Util

工具类的好处:

1、内部都是静态方法,每个方法完成一个功能;2、提高了代码的复用

为什么不用实例方法做:

实例方法需要创建对象调用给你,此时用对象只是为了调用方法,这样只会浪费内存。

Static 代码块

代码块的分类、作用

代码块定义

在java类中,使用{}括起来的代码称为代码块。

代码块概述

代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类),定义在类中方法外。

代码块分类

  • 静态代码块
    • 格式:static{}
    • 特点:通过static关键字修饰,随着类的加载而加载,并且自动触发,只执行一次
    • 使用场景:在类的加载到方法区的时候做一些静态数据初始化操作,比main方法先一步执行,以便后续使用。
    • 作用:
      • 1、初始化静态资源。
      • static {schoolName=”BJUT”}; public static String schoolName;//对该变量进行初始化
  • 构造代码块
    • 特点:无static修饰,属于对象,每次构建对象时,都会触发一次。构造代码块会优先于对象内的代码执行。
    • 使用场景:初始化实例资源。但是这种方法并不好,会使无差别对每个对象进行初始化。

静态代码块的应用案例

斗地主游戏:当系统启动时需要准备好54张牌的数据,可以用静态代码块完成。

设计模式:单例设计模式

设计模式、单例模式介绍

设计模式:问题的最优解法。 单例模式:保证系统中应用该模式的这个类永远只有一个实例,即一个类永远只能创建一个对象。例如:任务管理器对象只需要一个,这样可以节约空间。

表示共享信息

设计模式:单例

有些类只需要一个对象就可以,如何实现一个类只能对外产生一个对象。

继承(三大特征:封装、继承、多态)

系统中很多实体类的属性和行为存在重复代码,如何把这些信息进行优化,降低代码冗余,提升代码复用。