代码块
静态代码块
声明在类中,方法外,使用static修饰。类加载的时候就会被加载,并且只加载一次。
语法格式
static{
代码块内容
}
局部代码块
声明在方法中的代码块
优点: 缩减局部变量的生命周期 提高内存是使用率
语法格式
{
代码块内容
}
成员代码块
初始化块,声明在类中,方法外的代码块。
语法格式
{
代码块内容
}
注意:
- 初始化块在类加载的时候是不会执行的。
- 在创建对象之前会被调用(对于对象中的一些内容进行初始化操作)
代码示例
public class Test02 {
static {
System.out.println("我是静态代码块");
}
int age ;
{
age = 20;
System.out.println("我是初始化块");
}
public static void main(String[] args) {
/*
* { int num = 10; System.out.println(num); }
*/
Test02 t = new Test02();
System.out.println(t.age);
new Test02();
}
public Test02() {
System.out.println("我被调用了");
}
}
设计模式之单例
什么是单例
单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。
在计算机系统中,还有 Windows 的回收站、操作系统中的文件系统、多线程中的线程池、显卡的驱动程序对象、打印机的后台处理服务、应用程序的日志对象、数据库的连接池、网站的计数器、Web 应用的配置对象、应用程序中的对话框、系统中的缓存等常常被设计成单例。
单例的特点:
- 单例类只有一个示例对象
- 该单例对象必须由单例类自行创建;
- 单例类对外提供一个访问该单例的全局访问点;
如何编写
- 构造器私有
- 对外提供获取对象的方法
- 声明一个static的成员变量 类加载的时候创建当前单例对象。
- 在获取对象方法中返回成员变量的值。
单例的两种实现方法
饿汉式
代码示例
public class Single {
//3.创建一个single对象
public static Single single = new Single();
//1.将构造器私有
private Single(){
}
//2.创建一个返回对象的方法
public static Single getInstance() {
return single;
}
public static void eat() {}
}
优缺点
优点:
- 天然线程安全
缺点:
- 不能延迟加载(如果只需调用该类中的方法时,对象也被加载了)
懒汉式
代码示例
/**
* 单例模式中的懒汉式
*/
public class Lazy {
//创建一个对象
private static Lazy lazy = null;
//私有化构造器
private Lazy() {
}
//创建一个返回该类对象的方法
public static Lazy getInstence() {
if(lazy == null) {
lazy = new Lazy();
}
return lazy;
}
}
优缺点
优点:
- 可以做到延迟加载。
缺点:
- 线程不安全。
多态
多态是同一个行为具有多个不同表现形式或形态的能力。多态性是对象多种表现形式的体现。
多态的优点
- 消除类之间的耦合关系
- 可替换性
- 接口性
- 可扩充性
- 灵活性
- 简化性
多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
代码示例
package com.mage.text0717;
public class Text02 {
public static void main(String[] args) {
Chinese ch = new Chinese();
canteen(ch);
En en = new En();
canteen(en);
}
public static void canteen(Person person) {
person.eat();
}
}
class Chinese extends Person{
public void eat() {
System.out.println("用筷子吃饭");
}
}
class En extends Person{
public void eat() {
System.out.println("用刀叉吃饭");
}
}
class Person{
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return this.age;
}
public void eat() {
}
}