代码块

  1. 代码块又称初始化块,属于类的一个成员
  2. 它是将逻辑语句封装在方法体中通过{}包裹,代码块没有方法名,没有参数,没有返回值,只有方法体
  3. 它是不需要通过对象或类进行显式的调用,它会在类加载或者创建对象时主动的隐式调用

(1)静态代码块

  • 一个类被加载时会被调用一次,做一下初始化的工作

(2)实例化代码

  • 每次创建对象,都会被调用一次

静态

  1. 可用于定义属性、方法、代码块
  2. static修饰的结构,不属于任何一个对象
  3. 静态方法无论在哪里都是类名.方法名调用,同一个类的静态方法之间可以省略
  4. 静态方法没有重写这个概念

(1)实例方法和静态方法互相调用:

  • 静态方法中不可以直接调用实例方法,如果想用必须通过对象.方法名调用
  • 实例方法中可以直接调用静态方法

(2)static内存解析:

  • 静态的变量或者静态方法存在于方法区。静态的结构不会被垃圾回收
  • 不属于某一个实例对象,只存在于方法区

静态的结构:随着类的加载而加载的
非静态的结构:随着对象的创建而加载
在Java中调用实例方法,必须有主体。

类的组成结构:属性、方法、构造器、代码块、内部类
内部类:在一个类内部进行其他类结构的嵌套操作
外部类:一个public声明的类,类名必须和.java的文件名相同

设计模式

设计模式是人们为软件开发中抽象出可重复利用的解决方案;软件开发工程师之间沟通的"行话"

面向对象的设计原理:

  1. 开闭原则(Open Principle)
  • 对扩展开放,对修改关闭(继承,实现接口)
  • 我们可以通过“抽象约束,封装变化”来实现开闭原则
  • 通过接口或者抽象类为软件定义一个相对稳定的抽象层
  • 将相同的可变因素封装在相同的具体实现类中。派生一个实体类就可以了
  1. 里氏代换原则
  • 子类继承父类时,除了添加新的方法完成新增的功能外,尽量不要重写父类的方法
  1. 依赖倒转原则
  • 要面向接口编程,不要面向实现编程
    • 每个类尽量提供接口或抽象类,或者两者兼备
    • 变量的类型声明尽量是接口或者是抽象类
    • 任何类都不应该从具体的类派生
    • 使用继承时,要遵循里氏代换原则
  1. 接口隔离原则
  • 使用多个隔离的接口
  1. 迪米特法则
  2. 合成复用原则
  3. 一原则:一个类只做一件事
  4. 单例模式

单例模式

一个类只有一个实例
思路

  1. 别人不能new,构造器私有化,不能在类的外部通过new去实例化
  2. 在该类内部产生一个唯一的实例对象,把它封装成static类型
  3. 定义一个静态方法返回这个唯一的对象

饿汉式单例模型

不管以后会不会使用到该实例化对象,先创建了再说

//实现的办法就是直接new实例化

public class Ch03 {

    private static final Ch03 ch03 = new Ch03();

    private Ch03(){}

    public static Ch03 getInstance(){
        return ch03;
    }
}

懒汉式(延迟加载)

什么时候调用getInstance方法,什么时候new

//这种懒汉式在多线程环境中是完全错误的,根本不能保证单例的状态

public class Ch04 {
    //将自身实例化对象设置为一个属性,现在是没有赋值的
    private static Ch04 ch04;

    //构造器私有化
    private Ch04(){}

    public static Ch04 getInstance(){
        if(ch04 == null){
            ch04 = new Ch04();
        }
        return ch04;
    }
}

内部类实现单例

它是懒汉式的一种,这种懒汉式没有线程的问题

结合了饿汉式和懒汉式的优点:

  1. 只要不调用getInstance方法,就不会使用内部类
  2. 内部类一旦被使用就只会被初始化一次,以后一直用的是INSTANCE静态常量
public class Ch05 {
    //私有化构造器
    private  Ch05(){}

    public static Ch05 getInstance(){
        return SingletonHolder.INSTANCE;
    }
    public static class SingletonHolder{
        private static final Ch05 INSTANCE = new Ch05();
    }
}

JDK8的新特性——箭头函数

  1. 函数式接口:如果一个接口只有一个抽象方法,这个接口就称为函数式接口
  2. 可以用注解@FunctionalInterface标识
1、有参数,有返回值。
    (i,j) -> {
        return i + j;
    }
    如果方法体只是一句返回值(i,j) -> i+j
   2、有参数,无返回值
    (i,j) -> {
        // 方法体
    }
    如果方法体只有一句话(i,j) -> 方法体的一句话
   3、无参数
    ()->{
        方法体
    }

this和super

  1. 无论是this还是super,都不可以在静态结构中使用
  2. 静态结构是属于类的,静态结构是优于对象存在的
  3. this和super必须有对象才能出现、必须得有实例

面试题:(输出优先级)

  1. 当没有继承关系,就一个类。静态块>实例块>构造器
  2. 当有继承关系。父类静态块>子类静态块>父类实例块>父类构造器>子类实例块>子类构造器