static关键字
main()方法
代码块
final
一.static
static: 静态的, 可以用来修饰属性、方法、*代码块(或初始化块)、*内部类
A.static修饰属性(类变量):
- 由类创建的所有的对象,都共用这一个属性
- 当其中一个对象对此属性进行修改, 会导致其他对象对此属性调用时也会更改. vs 实例变量(非static修饰的属性, 各个对象各自拥有一套副本)
- 类变量随着类的加载而加载的, 而且独一份
- 静态的变量可以直接通过“类.类变量”的形式来调用
- 类变量的加载是要早于对象. 所以当有对象以后, 可以“对象.类变量”使用. 但是"类.实例变量"是不行的.
- 类变量存在于内存的静态域中.
B.static修饰方法(类方法):
- 随着类的加载而加载, 在内存中也是独一份
- 可以直接通过“类.类方法”的方式调用
- 方法内部可以调用静态的属性或静态的方法, 而不能调用非静态的属性或方法. 反之, 非静态的方法是可以调用静态的属性或静态的方法. 静态的方法内是不可以有this或super关键字的!
注意: 静态的结构(static的属性、方法、代码块、内部类)的生命周期要早于非静态的结构,同时被回收也要晚于非静态的结构
示例, 静态属性及内存状态:
One More Thing 👇
1 | public Test{ |
C.单例模式
23种设计模式
- 单例模式(Singleton): 即类只能创建一个对象, Runtime类就是一个单例模式的应用
- 解决的问题: 如何只让设计的类只能创建一个对象
- 如何实现: 饿汉式 & 懒汉式
- 私有化构造器
- 在类内部创建类的对象, 同时设置为private的, 通过公共的方法来调用, 体现封装性
- 一个public static的方法, 获得该(单例)对象
- 要求该对象也为static的
1 | //饿汉式1 |
二.main()
1 | public static void main(String[] args) throws Exception{ |
- main()是一个方法, 是主方法, 为程序的入口
- 权限修饰符: public protected 缺省 private —面向对象的封装性
- 对于方法来讲: static final abstract 可修饰
- 方法的返回值: void / 具体的返回值类型(基本的数据类型 & 引用数据类型), 方法内部一定要有return
- 方法名: 命名的规则: xxxYyyZzz. 给方法命名时, 要见名知意
- 形参列表: 同一个方法名不同的形参列表的诸多个方法间构成重载. 形参 & 实参—方法的参数传递机制: 值传递
- 抛出异常列表
- 方法体: 方法定义的是一种功能, 具体的实现由方法体操作.
三.代码块
- 代码块: 是类的第4个成员, 由一对大括号括起来
- 作用: 用来初始化类的属性
- 分类: 只能用static来修饰.
A.静态代码块
- 里面可以有输出语句
- 随着类的加载而加载,而且只被加载一次
- 多个静态代码块之间按照顺序结构执行
- 静态代码块的执行要早于非静态代码块的执行.
- 静态的代码块中只能执行静态的结构(类属性, 类方法)
B.非静态代码块
- 可以对类的属性(静态的 & 非静态的)进行初始化操作, 同时也可以调用本类声明的方法(静态的 & 非静态的)
- 里面可以有输出语句
- 一个类中可以有多个非静态的代码块, 多个代码块之间按照顺序结构执行
- 每创建一个类的对象, 非静态代码块就加载一次.
- 非静态代码块的执行要早于构造器
关于属性赋值的操作:
①默认的初始化
②显式的初始化或代码块初始化(此处两个结构按照顺序执行)
③构造器中;
—————————以上是对象的属性初始化的过程—————————————
④通过方法对对象的相应属性进行修改
四.final
final:最终的, 可以用来修饰类、属性、方法
- final修饰类: 这个类就不能被继承. 如: String类、StringBuffer类、System类
- final修饰方法: 不能被重写. 如: Object类的getClass()
- final修饰属性: 此属性就是一个常量, 一旦初始化后, 不可再被赋值. 习惯上, 常量用大写字符表示.
此常量在哪里赋值: ①此常量不能使用默认初始化 ②可以显式的赋值、代码块、构造器.
变量用static final修饰时: 全局常量. 比如: Math 类的PI