Day14
关键字:static
我们有时候希望,无论是否产生对象或者无论产生多少个对象,某些特定数据在内存中只有一份
例如,所有中国人共享中国这个名称,每个中国人都共享中国这个国家名称,不必在每个中国人的实例对象中都单独分配一个代表国家名称的变量。
-
static 静态的
-
可以用来修饰 属性,方法,代码块,内部类
-
修饰属性:
-
按是否使用static修饰:分为静态属性,非静态属性
- 静态属性:创建了类的多个对象,多个对象共享同一个静态变量,通过某一个对象修改静态变量时,回到值其他对象调用此静态变量时,是修改过的了
- 非静态属性:创建了类的多个对象,每个对象独立有一套类中的静态属性,改变其中一个,不会引起其他对象中同样的属性修改
-
static修饰属性的其他说明
-
静态属性随着类的加载而加载,可以通过“类.静态属性”的方法调用
-
静态变量的创建早于对象的创建
-
类只会加载一次,静态变量也只存在一份存在方法区的静态域中。
-
是否可以调用 类变量(静态属性) 非静态属性 类 yes no 对象 yes yes
-
-
-
静态属性举例:System.out.println(),Math.sqrt()
-
-
修饰方法:
-
随着类的加载而加载,可以通过“类.静态方法”的方法调用
-
是否可以调用 静态方法 非静态方法 类 yes no 对象 yes yes -
静态方法中,只能调用静态方法或静态属性
非静态方法中,可以调用静态方法或属性和非静态方法或属性
-
-
Attention:
- 静态方法内部,不能使用this,super
- 静态方法和静态属性,从生命周期方面去理解
-
在开发中如何确定一个属性或方法是否要声明为static?
- 属性
- 属性可以被多个对象所共享,且不会因为对象的不同而不同
- 方法
- 操作静态属性的方法,通常为static
- 工具类中的方法,习惯上为static。如:Math,Arrays,Collections
- 属性
单例(Singleton)设计模式
什么是设计模式?
在大量实践中总结和理论化后优选的代码结构,编程风格,以及解决问题的思考方式。通俗来讲,就是编程“套路”。
什么是单例设计模式?
采取一定方法,保证在整个软件系统中,对于某个类只能存在一个实例对象,并且该类只提供一个取得其对对象实例的方法。
- 将类的构造器访问权限设置为private(这样就无法使用new操作符在类的外部产生类的对象,但在类的内部仍然可以产生)
- 调用类的某个静态方法以返回类内部创建的对象(静态方法只能访问类中的静态成员变量)
- 指向该类内部产生的该类对象的变量也必须定义成静态的
两个例子
饿汉式实现(事先创建好)
class Bank{
//1.私有化类的构造器
private Bank(){
}
//2.内部创建静态的类的对象
private static Bank instance = new Bank();
//提供公共的静态方法
public static Bank getInstance(){
//...
return instance;
}
}
懒汉式实现(啥时候用啥时候创建)
class Order{
//1.私有化类的构造器
private Order(){
}
//2.声明当前类的实例,么的初始化
private static Order instance = null;
//3.声明public,static返回值的get函数
public static Order getInstance(){
//...
if(instance == null)
instance = new Order();
return instance;
}
}
两者对比
好处 | 坏处 | |
---|---|---|
饿汉式 | 天然线程安全 | 对象加载时间过长 |
懒汉式 | 延迟对象创建 | 目前写法:线程不安全* |
*两个线程同时调用,则生成两个对象,不安全!
单例模式的优点
减少系统性能开销:当一个对象产生需要比较多的资源时,可以让他永久驻存,节省空间,并满足单例的条件
用途
- 网站计数器
- 应用程序日志应用
- 数据库连接池
- 读取配置文件的类
- Appllication
- windows任务管理器
- windows回收站
Main方法
- main()作为程序的入口
- main()也是一个普通的静态方法
- main()可以有多个,通过ide选择入口?
- main()可以调用静态属性
- main()可以作为与控制台交互的方式,通过main的参数,获取的参数可以不加“”,默认String
代码块(初始化块)
例子
class Person{
String name;
int age;
static String decs = "hhh";
public Person(){
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
// 代码块
static{
}
{
}
}
- 代码块的作用:用来初始化类,或对象
- 代码块如果有修饰符,只能是static
- 静态代码块:
- 可以有输出
- 随着类的加载而执行(只执行一次)
- 对类进行初始化
- 如果类中定义了多个代码块,按先后顺序
- 静态代码块的执行,先于非静态代码块
- 先于构造器执行?
- 可以调用静态结构
- 非静态代码块:
- 可以有输出
- 随着对象的创建而执行(每创建一个对象,就执行一次)
- 可以在对象创建的时候,对对象的属性进行初始化
- 先于构造器执行?
- 可以调用静态和非静态结构
对属性可以赋值的位置:
- 默认初始化
- 显式初始化
- 构造器初始化
- 对象.属性 初始化
- 代码块中赋值
- 先后顺序(完结)
- 默认初始化
- 显式初始化/代码块赋值
- 构造器初始化
- 对象.属性
关键字:final
final:最终的
-
final可以修饰:类,方法,变量
-
修饰类:表明终点类,不能被继承,比如String,System,StringBuffer等
-
修饰方法:表明终点方法,不能被重写,比如Object.getClass()
native 关键字表明该方法由C/C++实现
-
修饰变量:表明终点变量,不能被改变,常量;
- 修饰属性:可以考虑赋值的位置:
- 显式初始化
- 代码块初始化
- 构造器初始化(每个构造器都得赋值)
- 不可以使用方法初始化
构造器是对象创建的最后一步
- 修饰局部变量:表示常量,习惯上大写
- 修饰普通局部变量
- 修饰形参(表示在方法中只读)
- 修饰属性:可以考虑赋值的位置:
-
-
static final 修饰属性:全局常量
static final 修饰方法:??