本文主要是介绍Java基础13 面向对象~static关键字和单例模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
超详细的Java知识点路线图
面向对象系列:
类和对象
封装
继承
多态
static关键字和单例模式
接口和内部类
前言
Hello,大家好,本章我们介绍两个知识点:static关键字和单例模式
static关键字
static的意思是静态,可以用来修饰类的属性和方法,一旦被static修饰的属性和方法,就会由类的所有对象共享,而不是属于某一个对象。
当某些属性和方法不想被对象调用时,就可以定义成静态的。
静态属性
语法:
static 类型 属性名;
静态属性的调用:
类名.属性名
也可以使用:对象名.属性
一般推荐使用类名调用静态成员
静态属性和非静态属性的区别
public class StaticTest {int count;public static void main(String[] args) {StaticTest t1 = new StaticTest();StaticTest t2 = new StaticTest();StaticTest t3 = new StaticTest();t1.count++;t2.count++;t3.count++;System.out.println(t1.count);System.out.println(t2.count);System.out.println(t3.count);}
}
输出结果都是1,如果将count定义为static的,输出结果为3,为什么?
总结:
- 静态的属性保存在方法区中,每个对象都共享这一个静态属性。
- 非静态的属性是由每个对象都有一个独立的副本。
非静态属性
静态属性
静态常量
开发过程中我们需要一些固定的数据,如:圆周率 3.1415926
public static final double PI = 3.1415926;
优点:
- 可读性高
- 提高数据的安全性
- 调用和维护方便
静态方法
定义:
public static 返回值类型 方法名(参数){
}
调用:
类名.方法名(参数)
注意:
- 静态方法中可以直接调用当前类的其它静态属性和方法
- 静态方法中不能直接调用当前类的非静态方法属性和方法
- 非静态方法中可以直接调用当前类的静态和非静态的属性和方法
- 静态方法中不能出现this和super关键字
Java中的各种工具类都大量使用静态方法,如:Arrays、Math等
静态代码块
语法:
static{代码块
}
作用:
对静态的成员进行初始化
特点:
- 静态代码块只执行一次
- 在类加载到内存后执行,是类中所有代码最先执行
- 在第一次使用类的使用调用
面试题:下面代码的执行结果
public class Test2 {//静态代码块static{System.out.println("这是静态代码块");}//非静态代码块{System.out.println("这是非静态代码块");}//构造方法public Test2(){System.out.println("这个构造方法");}public static void main(String[] args) {Test2 t1 = new Test2();Test2 t2 = new Test2();Test2 t3 = new Test2();}
}
执行顺序:
- 静态代码块(只执行一次)
- 非静态代码块(每个对象执行一次)
- 构造方法(每个对象执行一次)
静态导入
jdk1.5的特性,导入某个类的静态方法后,可以不通过类名直接调用
//静态导入
import static java.util.Arrays.sort;public class Test3 {public static void main(String[] args) {int[] array = {3,5,7,8,2};//直接调用sort(array);for(int n : array){System.out.println(n);}}
}
单例模式
设计模式是前人针对不同的应用需求总结一套解决方案,常见的设计模式有23种,也称为GOF23。
单例模式属于GOF23中的创建性模式,作用是:保证一个类只能创建一个实例
单例模式的应用场景
- 某些业务场景,如:公司只有一个老板
- 减少大型对象对系统资源的消耗,如:连接池、线程池
如何实现单例模式
步骤:
- 将构造方法定义成private的
- 在单例类的内部定义一个该类的静态对象
- 定义一个静态方法用于返回静态对象
单例的分类
单例模式分为:饿汉式和懒汉式
区别是:
- 饿汉式,一开始就创建对象
优点:代码简洁
缺点:如果方法没有调用,就浪费了内存 - 懒汉式,开始不创建对象,当方法被调用后,再创建对象
优点:内存的分配更高效
缺点:有线程安全问题
饿汉式
/*** 单例*/
public class Singleton {//静态对象private static Singleton instance = new Singleton();//私有构造方法private Singleton(){}//返回对象public static Singleton getInstance(){return instance;}public static void main(String[] args) {Singleton s1 = Singleton.getInstance();Singleton s2 = Singleton.getInstance();Singleton s3 = Singleton.getInstance();System.out.println(s1 == s2);System.out.println(s2 == s3);}
}
懒汉式
//静态对象
private static Singleton instance = null;//返回对象
public static Singleton getInstance(){if(instance == null){instance = new Singleton();}return instance;
}
结束
好了,本文内容就是这么多,欢迎大家留言讨论
大家如果需要学习其他Java知识点,戳这里 超详细的Java知识点汇总
这篇关于Java基础13 面向对象~static关键字和单例模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!