Java基础(四)

118 阅读3分钟

面向对象(下)

static关键字

静态变量:早于对象的创建,归该类的所有对象共同维护 静态方法:

  • 随着类的加载而加载,可以通过类.静态方法()的方式调用
  • 静态方法中只能调用静态方法或静态属性
  • 不能使用this、super关键字,因为其属于类而不指向任何一个对象 工具类的方法通常声明为static,例如Math类,这样就不需要创建对象,可以直接通过类名调用静态方法
单例设计模式

image.png 实现单例设计模式:

  • 饿汉式:
public class Bank {
    //1. 私有化类的构造器,避免从外部造对象
    private Bank() {

    }

    //2. 内部创建对象
    private static Bank instance = new Bank();

    //3. 提供公共的方法返回类的对象
    public static Bank getInstance() {
        return instance;
    }
    
}
  • 懒汉式:
public class Bank {
    //1. 私有化构造函数
    private Bank() {

    }

    //2. 声明当前类的对象,先不进行初始化
    private static Bank instance = null;

    //3. 声明public、static的返回当前类对象的方法
    public static Bank getInstance() {
        if(instance==null){
            synchronized(Bank.class){
                if (instance == null) {
                    instance = new Bank();
                }
            }
        }
        return instance;
    }
}

单例模式优点:

image.png 单例模式应用场景:

image.png

代码块

分为静态代码块和非静态代码块

  • 静态代码块 用static修饰,随着类的加载而自动执行,只会执行一次
  • 非静态代码块 随着对象的创建而执行,每创建对象就会执行一次
final关键字

final可以用来修饰:类、方法、变量 final修饰的类无法被继承,final修饰的方法无法被重写,final修饰的变量无法被修改并变成了常量,final修饰的属性值必须显式或者构造器或者代码块初始化

抽象类和抽象方法

抽象类:使用abstract修饰的类,无法创建实例。当抽象类中有抽象方法时,若被子类继承,则在子类中必须给出抽象方法的具体实现。

抽象类主要应用在父类当中某些方法依赖于子类具体情况而无法在父类中实现的场景下

抽象方法:用abstract修饰的方法,没有函数体。

包含抽象方法的类一定是抽象类,抽象类中不一定要有抽象方法。

abstract使用注意点:

  • 不能用来修饰属性、构造器
  • 不能用来修饰私有方法、静态方法、final修饰的方法
接口interface

父类只能有一个,但接口可以有多个 image.png 定义接口中的成员: JDK7中只能定义全局常量(public static final)和抽象方法(public abstract),static final和abstract可以省略,且接口不能定义构造器。

JDK8中可以定义静态方法和默认方法,其中静态方法只能通过接口名.方法名()的方式调用;默认方法用default修饰,可以通过实现类的对象调用,如果实现类重写了默认方法,则调用重写后的方法。如果某类既继承于父类,又有接口,且接口和父类中有同名方法,那么通过该类的对象调用这个方法,调用的是父类的方法。如果某个类有多个接口,且接口中有同名方法,那么该方法必须进行重写,如果想调用接口中的默认方法则要通过接口名.super.方法名()进行调用。

实现类必须重写接口中的所有抽象方法,才能创建实例,接口像是一种规范,其中的方法必须被重写,这样就对实现类进行了一定的约束。

一个接口可以进行多继承于其他接口。

接口与抽象类的区别

image.png