day07 final、单例设计模式、枚举、抽象类、接口

目录

1.final关键字

1.1final是什么

1.2final修饰类

1.3final修饰方法

1.4final修饰变量

1.5使用final需要注意什么

2.单例设计模式

2.1是什么

2.2作用

2.3饿汉单例

2.4懒汉单例

3.枚举

3.1是什么

3.2可以表达什么

3.3定义格式

3.4特点

3.5使用场景

4.抽象类

4.1什么是抽象类

4.2什么是抽象方法

4.3定义格式

4.4作用

4.5抽象类的注意事项

4.6模板方法设计模式

5.接口

5.1接口是什么

5.2接口的特点

5.3接口与接口的关系

5.3.1什么意思

5.3.2作用

5.3.3注意

5.4继承抽象类的同时实现多个接口

5.4.1类和类的关系

5.4.2类和接口的关系

5.4.3语法

5.5使用接口的好处

5.6小案例

5.7JDK8开始接口新增的方法

5.7.1默认方法

5.7.2静态方法

5.7.3私有方法

5.8使用接口的注意事项


1.final关键字

1.1final是什么

最终的意思

1.2final修饰类

该类被称为最终类,特点是不能被继承了。

// 演示1:final修饰类 叫最终类 不能被继承
final class  LiLianying{}
class LiGang extends LiLianying{}//报错

1.3final修饰方法

该方法被称为最终方法,特点是不能被重写了。

//演示2:final修饰方法 叫最终方法 不能被重写
class ZZK{
    public final void jiMi(){
        System.out.println("重要的情报");
    }
}
class ZSF extends ZZK{
   // 方法不能被重写了
//    public void jiMi() {
//        System.out.println("变成擦屁股纸...");
//    }

1.4final修饰变量

该变量有且仅能被赋值一次

// 演示3: final修饰变量  最终变量 指的是只能赋值一次
      final int a = 10;//final修饰基本数据类型特点: 变量的数值不能变
//      a = 20;  被final修饰的变量只能赋值一次

1.5使用final需要注意什么

final修饰基本数据类型的变量,其存储的数据不能改变。final修饰引用类型的变量,其存储的地址不能改变,但是指向的对象内容可以改变。

//数组是引用类型  final修饰引用类型数据的特点: 变量的指向地址不能变,里面内容可以变
        final int[] arr = new int[]{1,2,3};
        System.out.println(arr);
//         arr = new int[]{2,3,4};
//        System.out.println(arr);
        arr[1] = 5;

2.单例设计模式

2.1是什么

是为了解决某个问题的方案

2.2作用

保证一个类对外只能产生一个对象。

2.3饿汉单例

拿对象时,对象早就创建好了。

步骤:

(1)私有构造

(2)定义一个类变量记住类的一个对象

(3)定义一个类方法返回对象

public class A {
    // 创建 私有 构造器
    private A() {
    }

    //创建私有类变量a
    private static A a=new A();

    //创建公共方法,返回变量
    public static A instance(){
        return a;
    }
}
public static void main(String[] args) {
        A a1=A.instance();
        A a2=A.instance();
        System.out.println(a1);
        System.out.println(a2);
    }

2.4懒汉单例

拿对象时,才开始创建对象。

步骤:

(1)私有构造

(2)拿对象时,才开始创建对象。

(3)提供一个静态方法,保证返回的是同一个对象。

//懒汉式
public class B {

    // 1、单例必须私有构造
    private B(){
    }

    // 2、定义一个类变量量用于存储对象
    private static B b;

    // 3、提供一个类方法返回类的一个对象
    public static B getInstance(){
        if (b==null){
            b=new B();
        }
        return b;
    }
}
public static void main(String[] args) {
        B b1=B.getInstance();
        B b2=B.getInstance();
        System.out.println(b1);
        System.out.println(b2);
    }

 

3.枚举

3.1是什么

是一个特殊的类。可以看做是包含特定对象的"集合",设定好之后该类型只包含特定个数的对象

3.2可以表达什么

可以表达有固定数量的类型,比如季节,星期,性别,交通灯等....

3.3定义格式

修饰符 enum 枚举类名{
    名称1,名称2...;
}

public enum A{
    X,Y,Z;
}

3.4特点

【1】枚举类中的第一行,只能写枚举类的对象名称,且要用逗号隔开。

【2】这些名称,本质是常量,每个常量都记住了枚举类的一个对象

【3】枚举都是最终类,不可以被继承,枚举类都是继承java.lang.Enum类的。

【4】枚举类的构造器都是私有的(写不写都只能是私有的),因此,枚举类对外不能创建对象。

3.5使用场景

枚举类很适合做信息分类和标志。

控制方向场景

public enum Direction {
    UP,DOWN,LEFT,RIGHT;
}
public class Constant {
    public static final int UP=1;
    public static final int DOWN=2;
    public static final int LEFT=3;
    public static final int RIGHT=4;
}
public static void main(String[] args) {
        move(0);
        System.out.println("==================");
        move2(Direction.UP);
        move2(Direction.DOWN);
        move2(Direction.LEFT);
        move2(Direction.RIGHT);
    }
public static void move2(Direction direction){
        switch (direction){
            case UP:
                System.out.println("上");
                break;
            case DOWN:
                System.out.println("下");
                break;
            case LEFT:
                System.out.println("左");
                break;
            case RIGHT:
                System.out.println("右");
                break;
        }
    }

4.抽象类

4.1什么是抽象类

abstract修饰类,这个类就是抽象类。

4.2什么是抽象方法

abstract修饰方法,这个方法就是抽象方法。只有方法签名,不能写方法体。

4.3定义格式

修饰符 abstract class 类名{     修饰符 abstract 返回值类型 方法名称(形参列表);  }

public abstract class A{
    public abstract void test();
}

4.4作用

被子类继承。如果父类知道子类一定要做这件事,但是每个子类做的不一样,父类可以声明抽象方法,交给子类重写来实现。这个类就是抽象类了。

4.5抽象类的注意事项

【1】抽象类中不一定要有抽象方法,有抽象方法的类必须是抽象类。

【2】类有的成员:成员变量、方法、构造器,抽象类都可以有

【3】抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现。

【4】一个类继承抽象类,必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。

【5】不能用abstract修饰变量、代码块、构造器。

4.6模板方法设计模式

父类知道每个子类都要做某个行为,但每个子类要做的情况不一样,父类就定义成抽象方法,交给子类去重写实现,我们设计这样的抽象类,就是为了更好的支持多态。

public abstract class ZwModel {
    public void write(){
        System.out.println("《我的区长爸爸》");
        writeMain();
        System.out.println("他真厉害!");
    }

    public abstract void writeMain();
}
public class MyZw extends ZwModel{

    @Override
    public void writeMain() {
        System.out.println("我爸爸手眼通天哈哈哈");
    }
}
public class YouZw extends ZwModel{
    @Override
    public void writeMain() {
        System.out.println("我好羡慕你爸爸");
    }
}
public static void main(String[] args) {
        MyZw myZw=new MyZw();
        myZw.write();
        System.out.println("===============================");
        YouZw youZw=new YouZw();
        youZw.write();
    }

 

5.接口

5.1接口是什么

使用interface关键字定义的一种结构, JDK 8之前,接口中只能定义成员变量和成员方法。

public interface Driver

5.2接口的特点

【1】接口不能创建对象;接口是用来被类实现(implements)的,实现接口的类称为实现类。

【2】一个类可以实现一个或多个接口,实现类实现多个接口,必须重写完全部接口中的全部抽象方法,否则实现类需要定义成抽象类。

5.3接口与接口的关系

多继承

5.3.1什么意思

一个接口可以同时继承多个接口

5.3.2作用

规范合并,整合多个接口为同一个接口,便于子类实现。

5.3.3注意

实现子接口名的类必须实现后面所有接口中的所有抽象方法。

public interface Driver extends ha
//ha也为接口

5.4继承抽象类的同时实现多个接口

5.4.1类和类的关系

单继承

5.4.2类和接口的关系

多实现

5.4.3语法

修饰符 class 实现类 extends 父类 implement 接口1,接口2....{}

5.5使用接口的好处

【1】弥补了类单继承的不足,一个类在单继承的同时还可以实现多个接口。

【2】让程序可以面向接口编程,这样程序员就可以灵活方便的切换各种业务实现(多态思想)。

5.6小案例

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    private String name;
    private char sex;
    private double score;
}
public interface ClassDataOp {
    void All(Student[] students);
    void avg(Student[] students);
}
public class Op1 implements ClassDataOp{
    @Override
    public void All(Student[] students) {
        for (int i = 0; i < students.length; i++) {
            Student student = students[i];//获取每个学生
            System.out.println(student.getName() + " " + student.getScore() + " " + student.getSex());
        }
    }

    @Override
    public void avg(Student[] students) {
        double sum = 0;//定义求和变量
        for (int i = 0; i < students.length; i++) {
            Student student = students[i];//获取每个学生
            sum += student.getScore();//求和
        }
        System.out.println("平均成绩:" + sum / students.length);
    }
}
public class Op2 implements ClassDataOp{
    @Override
    public void All(Student[] students) {
//定义统计男生人数的变量
        int count = 0;
        for (int i = 0; i < students.length; i++) {
            Student student = students[i];//获取每个学生
            System.out.println(student.getName() + " " + student.getScore() + " " + student.getSex());
            if (student.getSex() == '男') {
                count++;
            }
        }
        System.out.println("男生人数:" + count);
        System.out.println("女生人数:" + (students.length - count));
    }

    @Override
    public void avg(Student[] students) {
        double sum = 0;//定义求和变量
        //定义最高分
        double max = students[0].getScore();
        //定义最低分
        double min = students[0].getScore();

        for (int i = 0; i < students.length; i++) {
            Student student = students[i];//获取每个学生
            sum += student.getScore();//求和
            //求最大值
            if (student.getScore() > max) {
                max = student.getScore();
            }
            //求最小值
            if (student.getScore() < min) {
                min = student.getScore();
            }
        }
        System.out.println("平均成绩:" + (sum-max-min) / (students.length-2));
    }
}
    public static void main(String[] args) {
        //1:创建5个学生对象
        Student s1 = new Student("张三",  '男',100);
        Student s2 = new Student("李四", '女',80 );
        Student s3 = new Student("王五", '男',90);
        Student s4 = new Student("赵六", '女',70);
        Student s5 = new Student("田七", '男',60);
        Student[] student= {s1, s2, s3, s4, s5};
        ClassDataOp op=new Op2();
        op.All(student);
        op.avg(student);
    }

5.7JDK8开始接口新增的方法

5.7.1默认方法

类似之前写的普通实例方法:必须用default修饰。默认会public修饰。需要用接口的实现类的对象来调用。

default void defaultMethod(){
    System.out.println(“接口中的默认方法”);
}

5.7.2静态方法

默认会public修饰,必须static修饰。接口的静态方法必须用本身的接口名来调用。

static void staticMethod(){
    System.out.println(“接口中的静态方法”);
}

5.7.3私有方法

必须使用private修饰,从JDK 1.9才开始有的。根据是否有static关键字修饰,私有方法可以分为非静态私有方法和静态私有方法。非静态私有方法只能在本类中被其他的默认方法或者私有方法访问。静态私有方法还能在本类的其他静态方法中访问。

private void privateMethod(){
    System.out.println(“接口中的私有方法”);
}

5.8使用接口的注意事项

【1】接口不能创建对象

【2】一个类实现多个接口,多个接口的规范不能冲突

【3】一个类实现多个接口,多个接口中有同样的静态方法不冲突。

【4】一个类继承了父类,同时又实现了接口,父类中和接口中有同名方法,默认用父类的。

【5】一个类实现了多个接口,多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可。

【6】一个接口继承多个接口,是没有问题的,如果多个接口中存在规范冲突则不能多继承。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值