美文网首页
17.面向对象进阶:包,权限修饰符,final,常量,枚举,反编

17.面向对象进阶:包,权限修饰符,final,常量,枚举,反编

作者: 每天起床都想摆 | 来源:发表于2022-01-21 20:37 被阅读0次

包,权限修饰符

  • 包是用来分门别类的管理各种不同类的,类似于文件夹,建包有利于程序的管理和维护

  • 建包语法格式:建议包名全部英文小写,且具备意义

    package 公司域名倒写.技术名称
    
  • 建包语句必须在第一行,一般IDEA会自动帮助创建

  • 导包

    • 相同包下的类可以直接访问

    • 不同包下的类必须导包,才可以使用

    • 导包格式:import 包名.类名;

    • 假如一个类中需要用到两个不同类,这两个类的类名相同但是位于两个不同的包下,那么默认只能导入一个类,另一个类要带包名访问

      访问格式:包名.类名

权限修饰符

  • 权限修饰符:用来控制一个成员能够被访问的范围的

  • 可以修改成员变量,方法,构造器,内部类,不同权限修饰符修饰的成员能够被访问的范围将受到限制

  • 权限修饰符的分类和具体作用范围:

    修饰符 同一个类中 同一个包中其他类 不同包下的子类 不同包下的无关类
    private
    缺省
    protected
    public
  • 编码建议:

    1. 成员变量一般私有
    2. 方法一般公开
    3. 如果该成员只希望本类访问,使用private修饰
    4. 如果该成员只希望本类,同一个包下的其他类和不同包下的子类访问,使用protected修饰

final关键字

  • final关键字是最终的意思,可以修饰方法,变量,类

    • 修饰方法:表明该方法是最终方法,不能被重写
    • 修饰变量:表示该变量第一次赋值后,不能再次被赋值(有且仅能被赋值一次)
    • 修饰类:表明该类是最终类,不能被继承
  • final修饰变量的注意点:

    • final修饰的变量类型是基本类型:那么变量存储的数据值不能发生改变

    • final修饰的变量类型是引用类型:那么变量存储的地址值不能发生改变,但是地址指向的对象内容是可以发生变化的

      final double rate = 3.14; // 不可再次给rate赋值
      
      final int[] arr = {10, 20, 30};
      arr = {10, 20, 30, 40, 50};   // 二次赋值引发报错
      arr = null;       // 仍然报错
      arr[1] = 40;  // 没有改变地址,只是改变了内容,不报错
      System.out.print(arr[1]); //40
      

常量

常量概述和基本作用

常量

  • 常量是使用了public static final 数据类型 修饰的成员变量,必须有初始值,而且执行的过程中其值不能被改变
  • 常量的作用和好处:可以用于做系统的配置信息,方便程序的维护,同时也能提高可读性
  • 常量命名规范:
    • 单词字母全部大写
    • 命名有意义,多个单词之间使用下划线连接

常量的执行原理

  • 在编译阶段会进行”宏替换“,把使用常量的地方全部替换成真实的字面量

    例如打印常量rate = 3.14,sout(rate)在被编译时rate发生宏替换,即变成了sout(3.14)

  • 这样做的好处是让使用常量的程序的执行性能与直接使用字面量是一样的

常量做信息标志和分类

案例说明:

  • 开发游戏超级玛丽需要接收用户输入的四个方向的信号(上下左右),用来控制角色行动
  • 可以定义四个常量赋1,2,3,4代表上下左右,1,2,3,4则为信号方法中switch分支的case值

选择常量做信息标志和分类

  • 代码可读性好,实现了软编码形式

枚举

枚举的概述

  • 枚举是Java中的一种特殊类型(特殊类)

  • 枚举的作用:是为了做信息的标志和信息的分类

  • 定义枚举类的格式:

    修饰符 enum 枚举名称{
        //第一行都是罗列枚举类实例的名称(建议全部大写)
    }
    

    tips:cmd下可以使用javap指令完成反编译

  • 枚举的特征:

    • 枚举类都是继承了枚举类型:Java.lang.Enum

    • 枚举都是最终类,不可以被继承

    • 构造器的构造器都是私有的,枚举对外不能创建对象

    • 枚举类的第一行默认都是罗列枚举对象的名称的

      存在几个枚举对象就只能有几个对象,即对象是多少是哪些都是预先设定好的,因此枚举不同于单例模式,枚举又被称为多例模式

枚举的使用场景演示

  • 案例说明:

    开发游戏超级玛丽需要接收用户输入的四个方向的信号(上下左右),用来控制角色行动

  • 选择常量作信息标志和分类

    虽然可以实现可读性,但是入参值不受约束,代码相对不够严谨

    在之前的常量作信息标志和分类时,switch语句的case值就是各个常量值,例如常量up的值为1,此时case可以写1但是也可以写up,如果写了1,程序不会报错,但是其实编码不够规范,这即是入参值不受约束

  • 枚举做信息标志和分类

    代码可读性好,入参约束严谨,代码优雅,是最好的信息分类技术,建议使用

    package com.java.test;
    
    /**
     * 使用枚举完成信息标志和分类
     */
    public enum Orientation {
        UP,DOWN,LEFT,RIGHT;
    }
    
    

    反编译结果:

    Compiled from "Orientation.java"
    public final class Orientation extends java.lang.Enum<Orientation> {
      public static final Orientation UP;
      public static final Orientation DOWN;
      public static final Orientation LEFT;
      public static final Orientation RIGHT;
      public static Orientation[] values();
      public static Orientation valueOf(java.lang.String);
      static {};
    }
    
  • 总结:

    • 枚举是最好的信息标志和分类技术,但是也有缺点
    • 根据业务逻辑灵活选择使用常量或者是枚举,枚举语义上稍微比常量复杂,但是枚举更加严谨
    • 枚举只是支持表示信息的对象而已,当涉及到密码,账户这种需要具体数据值的,仍建议使用常量完成信息标志和分类

相关文章

网友评论

      本文标题:17.面向对象进阶:包,权限修饰符,final,常量,枚举,反编

      本文链接:https://www.haomeiwen.com/subject/fakyhrtx.html