关键字final
意思是最终的、不可变的
-
修饰变量
- Final修饰变量时,变量被必须初始化,并且不能被修改。初始化可以定义final变量时直接初始化或者在构造函数中初始化
- final类型的变量一旦赋值则不允许修改,但是如果是复杂类型是不允许修改地址,但 是可以修改属性
-
修饰局部变量可以声明的同时赋值或者在第一次使用之前进行赋值
-
final修饰方法则该方法不能被子类(覆盖\重写)
-
final修饰一个类,则该类不能被继承
-
表示字串的3种类型String、StringBuffer、StringBuilder都是final类型的类,所以都不允许继承
单例模式
由专家总结出来的在某种情况下解决某类问题的最佳解决方案,是思想、是知识,是一种抽象的 内容
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:当您想控制实例数目,节省系统资源的时候。
单例模式有多种写法,最常见的是懒汉模式和饿汉模式
饿汉单例模式
优点:没有加锁,执行效率会提高
缺点:类加载时就初始化,浪费内存
编程实现:
- 私有构造器
- 静态的私有属性
- 公共的静态方法
懒汉单例模式
优点:由于采用延迟处理的方式,所以比较节约内存
缺点:在多线程不能正常工作
懒汉式:主要是针对饿汉式中不管是否需要使用对象都先创建对象所引起的内存浪费
静态static关键字
-
用于修饰成员
-
随着类加载,随着类消失
-
优先于对象,用类名直接访问
static属性是当前类的所有对象所共有的共同属性(只有一个,而普通属性各个对象都有自己的,相互隔 离),任何一个当前类对象修改这个属性,所有其他类对象的这个属性都会受影响
执行顺序
静态属性—>属性—>构造器
访问的方式
可以使用“类名.静态属性名”或者“对象名.静态属性名”的方式进行访问。【范围限制】
定义常量
命名规则:名称全大写,下划线分词
-
声明语法:public static final double MIN_NUMBER = 0.1;
-
声明的同时直接进行初始化
-
先声明后在static静态块中赋值
静态方法
-
因为可以直接使用”类名.方法名”的形式直接调用静态方法,静态方法执行时很有可能并没有构建对 象,所以在静态方法中不允许使用this/super之类用于指定对象的关键字
-
当然在静态方法中允许创建对象,并调用对象方法
-
静态方法只能直接访问静态成员,不能直接访问非静态成员
静态块
-
类在执行时需要通过一个叫作类加载器的组件将程序加载到内存中,类在运行时一般不会发生变化,所以类不会频繁加载,在整个运行过程中只加载一次,而且常驻内存
-
静态块在类加载完毕后自动执行,而且只执行一次
非静态块
非静态块在类内且在所有的方法之外,非静态块并不会在类加载后自动执行,而是在构建当前对象时自动执行。new一次则会执行一次,执行时机在构造器之前执行
什么时候使用静态
-
当成员变量的数据各个对象都相同时,可以用static修饰的,让多个对象共享
-
方法如果访问了特有数据(非静态成员变量),该函数是非静态的。方法如果没有访问特有数据, 那么该方法就是静态修饰
-
如果类中的功能都是静态的,那么该类创建对象是没有意义的,所以构造方法需要私有化
在JDK5当中提供了导入静态方法的import语句
- 语法:import static java.lang.Math.*; - 导入Math类中的所有静态方法
- 注意要求使用JDK1.5+版本,否则编译不通过
import static java.lang.Math.*;
public class Test1 {
public static void main(String[] args) {
double a1 = -12.345;
System.out.println(abs(a1));
System.out.println(cos(a1));
System.out.println(sin(a1));
}
}
变量分类
-
局部变量,方法体中声明
-
成员变量,方法体外类内声明
- 实例变量,没有static修饰符,各个不同对象相互隔离
- 静态变量,有static修饰符,这个类的所有对象共享
- 静态变量存储在方法区内存中
-
三块主要内存中变化最频繁的是栈内存,最先有数据的是方法区内存,垃圾回收期主要针对的是堆内存
栈和堆的区别
-
管理方式:栈自动释放,堆需要GC
-
空间大小:栈比堆小
-
碎片相关:栈产生的碎片远小于堆
-
分配方式:栈支持静态和动态分配,而堆仅仅支持动态分配
-
效率:栈的效率比堆高
java.lang.Object
所有Java类都直接或者间接的继承自Object类,那么Object中的方法也是其他所有类都拥有的
Object类中的常用方法
getClass方法用于获得当前对象的类型
直接输出一个对象时,实际上默认输出的是该对象toString()方法的返回值。所有的Java类中都有这个方法,因为Java类都直接或者间接的继承于Object类,而Object类中定义了toString方法。为了实现用户自定义输出格式,允许在类中覆盖定义toString方法