【Java学习笔记(五)】包管理&枚举&类的深入拓展

包管理

包的概念以及使用

  • 包(package)的基本概念

    • 包就是指一个文件夹
    • 使用方法:在类或接口的最上面一行加上package的生命,通常包名全部使用小写
    • 包的声明方法:package 名称 [.package 名称2.package 名称3……]
    • 包名应该全部都是小写字母
    • Oracle建议使用公司Internet域名倒写来作为包名,例如公司的域名是crazyit.org,则该公司的所有类都建议放在org.crazyit包及其子包下
  • 包的导入

    • import package名称.类名称

    • 当某个类需要被访问时,必须由public修饰

    • 如果导入两个包中含有相同名字的类,则应该使用类的全名(即包名.类名)类指定对应包下的类

    • 静态导入

      • 它用于导入指定类的某个静态成员变量、方法或全部的静态成员变量、方法

      • 导入指定类的单个静态成员变量、方法的语法格式

        • import static package.subpackage...ClassName.fieldName|methodName;
      • 导入指定类的全部静态成员变量、方法的语法格式

        • import static package.subpackage...ClassName.*;
  • JDK中常见的包

    • java.lang

      • java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能;还有一个子包,java.lang.reflect,用于实现java类的反射机制;在Java1.2以后的版本,会被自动导入
    • java.awt

      • 包含构成抽象窗口工具集的多个类,用类构建和管理应用程序的图形用户界面(GUI)
    • avax.swing

      • 此包用于急哪里图形用户界面,相对于java.awt来说是轻量级组件
    • java.applet

      • 包含applet运行所需的一些类
    • java.net

      • 包含执行与网络相关的操作类
    • java.io

      • 包含提供多种输入/输出功能的类
    • java.util

      • 包含一些使用工具类,如定义系统特性、与日期日历相关的方法

类成员的访问控制权限

Java的命名规范

  • 包命中的字母一律小写
  • 类名、接口应当使用名次,每个单词首字母大写
  • 变量名第一个单词小写,后面的每个单子首字母大写
  • 方法名的第一个单词小写,后面的每个单词首字母大写
  • 常量名的 每个字母一律大写
  • 可以查阅JDK文档

编译工具——javac命令的使用

  • javac -d . Hello.java

    • -d选项用于设置编译生成class文件的保存位置,.代表当前路径
    • 位于包中的类,在文件系统也必须有与包名层次相同的目录结构
    • 同一个包中的类不必位于相同的目录下,只要让CLASSPATH环境变量里包含这些目录对应的路径即可。虚拟机会自动搜索CLASSPATH下的子路径,把它们当初同一个包下的类来处理
  • 建议的文件层次结构

打包工具——jar命令的使用

  • jar -cvf create.jar demo
  • -c:创建新的文档
  • -v:生成详细输出到标准输出上
  • -f:指定存档文件名
  • create.jar:生产jar文件的名称
  • demo:要打成jar文件的包

构造方法私有化——单例设计模式(Singleton)

  • 只能在类里面实例化对象
  • 可以采用static修饰,用类名.对象名返回;
  • 或者增加getInstance()方法,返回instance
  • 为了避免内部的对象重复实例化,最好加上一个关键字final定义

多例设计模式

  • 一个类可以实例化多个对象

枚举

简介

  • 在JDK1.5中,引入的一种新类型——枚举类型
  • 用关键字表示代替特定的有限的数据集

自定义的枚举

  • 即手动定义静态常量,但是这种方法效率很低所以不做介绍

Java中的枚举

  • 定义方式

    • enum 枚举名{ 枚举值表 };
  • 说明方式

    • 先定义,后说明

      • 定义
      • enum 枚举名 变量名1,变量名2,……;
    • 定义的同时说明

      • 定义 变量名1,变量名2,……;
    • 直接说明,即无名枚举

      • enum { 数据表值 }变量名1,变量名2,……;

枚举类和枚举关键字

  • 枚举类

    • 枚举关键字(enum)定义的是一个枚举类型。通过enum关键字相当于定义了一个继承于Enum类的类。

    • public static E[] values();

      • 此方法可以得到对象取值
  • 枚举关键字

类集对于枚举的支持

  • EnumMap

    • Map映射

      • 本质上是一种把键和值<key,value>一一对应的集合,它的每一个元素都包含一对键对象和值对象
    • Map时Java中的一个类,EnumMap时Map接口的子类,它被视为专门为枚举类型量身定做的Map实现;

  • EnumSet

    • Map映射和Set集合

      • Map是一个二元组的集合,每一个元素都是由两个属性组成
      • Set,是一个一元组集合,包含一系列不可重复的数据
    • EnumSet可视为专用于处理枚举(enum)类型的set类集

深入了解枚举

  • 枚举的构造方法

    • 在枚举中可以直接定义方法;新创建的枚举类型的枚举值,必须放在枚举类代码块的第一行,实际上这个三个枚举值是枚举类的三个实例化对象,所以枚举类的方法和属性也可以供枚举值(或者说实例对象)使用,通过枚举类名.枚举值名.属性/方法访问;

      • 例如:
        public enum Gender{
          MALE("男"),FEMALE("女");
          private final String name;
          {
             this.name=name;
          }
           public String getName()
          {
             return this.name;
          }
        }
  • 枚举的接口

    • 接口的概念

      • Java的一个接口中,在某种程度上,它可视为一个简化版本的“类”,其仅包括一系列方法和一些不可更改的静态变量。Java中的接口不能直接拿来实例化任何对象,因为在其内仅仅提供了方法的声明,即只有方法的特征而没有方法的具体实现,它不具备实例化对象的条件;换句话说,接口生来就是要被继承的,在继承中被具体化实现
    • 用法

      • 先创建一个接口:修饰符 interface 接口名{ 方法体;}
      • 然后调用接口:enum 枚举名 implements 接口1[,接口2,接口3...]
    • 如果由枚举类来实现接口里的方法,则每个枚举值在调用该方法时都有相同的行为方式(因为方法体完全一样)。如果需要每个枚举值在调用该方法时呈现出不用的行为方式,则可以让每个枚举值分别来实现该方法,每个枚举值提供不同的实现方式,每个枚举值提供不同的实现方式,从而让不同的枚举值调用该方法时具有不同的行为方式

      • 例如:
        public interface GenderDesc{
           void info();
        }
        public enum Gender implements GenderDesc{
           MALE("男");
           {
               public void info(){
                    System.out.println(“这个枚举值代表男性”);
                }
            },
            FEMAILE("女")   {
               public void info(){
                    System.out.println(“这个枚举值代表女性”);
                }
            }
        }
    • 非抽象类的枚举类默认使用final修饰。对于一个抽象的枚举类而言——只要它包含了抽象方法,它就是抽象枚举类,系统会默认使用abstract修饰,而不是使用final修饰

  • 枚举的抽象方法

    • 在接口中定义的方法,由于只有方法的原型,没有具体实现,这些方法可视为是“抽象的”方法,不管用不用修饰符abstract都是一样。实际上Java也可以在枚举中直接定义一个或多个抽象方法。
    • 这种情况下,需要为枚举中的每个对象单独实现此方法;

使用枚举的注意事项

  • 枚举类型不能用public和protected修饰符修饰构造方法。构造方法的权限只能是private或者friendly(default)。因为枚举的这种特性,所以枚举对象是无法在程序中通过直接调用其构造方法初始化的;
  • 定义枚举类型时,如果是简单类型,那么最后一个枚举值可以不加分号。但是如果枚举中包含有方法,那么最后一个枚举值后面的代码必须要用分号;隔开

枚举类不可以被继承

  • 在枚举内部可以定一个或多个抽象方法时,那这个枚举类为什么不能用abstract修饰呢?如果一个枚举类用abstract修饰,那么就说明需要其他类继承这个所谓的“抽象枚举类”,而在Java中,规定枚举时不能被记得;

关于类的专题研究

众类鼻祖——Object类

  • Object类是一个特殊的类,是类层次结构根,位于继承书的顶部,即Java中所有的类从根本上都继承自Object类;它是唯一没有父类的类,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类就默认继承Object类,因此,Object类是Java类层中的最高层类,是所有类的超类;

    • Object类的常用方法

  • 可以使用Object接收对象以及任意引用数据类型

  • equals方法只会比较两个对象的内存地址,如果需要准确比较,应覆写equals方法

  • hashCode方法返回其所在对象的物理地址

内部类

  • 内部类的基本定义

    • 所谓的内部类就是指在一个类的内部又定义了其他类的情况,内部类用public或private修饰时,对其访问的限制与成员变量和成员方法完全相同

    • 语法格式

      • 定义

        • 标识符 class 外部类的名称
          {
          //外部类的成员
          标识符 class 内部类的名称
          {
          //内部类的成员
          }
          }
      • 用法

        • new 外部类().new 内部类()
    • 内部类的作用

      • 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问
      • 内部类成员可以直接访问外部类的私有数据,因为内部类被当成其外部类成员,同一个类的成员之间可以相互访问;但外部类不能访问内部类的实现细节,例如内部类的成员变量
      • 匿名内部类适合用于创建那些仅需要一次的类
      • 内部类在声明时,会破坏程序的结构,因此开发中不建议去使用
    • 使用static定义的内部类属于外部类本身

      • 静态内部类又叫做类内部类,是外部类的一个静态成员,因此外部类的静态方法、静态初始化也可以使用静态内部类来定义变量、创建对象等
      • 根据静态成员不能访问非静态成员的规则,静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。即使是静态内部类的实例方法也不可以访问外部类的实例成员。
      • 外部类不可以使用static修饰,因为外部类的上一级程序单元是包
    • 使用内部类

      • 在外部类内部使用内部类

        • 与平常使用普通类没有太大区别,可以直接通过内部类类名来定义变量,通过new调用内部类构造方法来创建实例
        • 唯一的区别在于:不要在外部类的静态成员(包括静态方法和静态初始块)中使用非静态内部类,因为静态成员不能访问非静态成员
      • 在外部类以外使用非静态内部类

        • 如果希望在外部类意外的地方访问内部类(包括静态和非静态两种),则内部类不能使用private访问控制权限,private修饰的内部类只能在外部类内部使用

        • 对于使用其他访问控制符修饰的内部类,则能在访问控制符对应的访问权限内使用

          • 省略访问控制符的内部类,只能被与外部类处于同一个包中的其它类所访问
          • 使用protected修饰的内部类,可被与外部类处于同一个包中的其它类和外部类的子类所访问
          • 使用public修饰的内部类,可以在任何地方被访问
      • 在外部类以外使用静态内部类

        • 因为静态内部类是外部类相关的,因此创建静态内部类对象时无须创建外部类对象,其语法格式如下

          • new 外部类.内部类()
        • 相比之下,使用静态内部类比使用非静态内部类要简单很多,只要把外部类当初静态内部类的包空间即可,因此当程序需要使用内部类时,应该优先考虑使用静态内部类

    • 局部内部类

      • 把一个内部类放在方法里定义,则这个内部类就是一个局部内部类
      • 不可以使用static修饰,因为它的上一级程序单元是方法
      • 如果需要用局部内部类定义变量、创建实例或派生子类,那么都只能在局部内部类所在的地方内进行
      • 因为局部内部类的作用域太小了,大部分时候顶一个类,当时是希望多次复用这个类,所以在实际开发中,局部内部类使用的很少

匿名内部类

  • 创建格式
      new 父类构造器(参数列表)|实现接口()
      {
      //匿名内部类的类体成分
      }
  • 创建匿名内部类时会立即创建一个该类的实例,该类的定义会立即消失,所以匿名内部类不能够重复使用

  • 注意事项

    • 使用匿名内部类时,必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口
    • 匿名内部类中是不能定义构造函数的
    • 匿名内部类中不能存在任何的静态变量和静态方法
    • 匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效
    • 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法

匿名对象

  • 只使用一次的对象,即没有任何一个具体的对象名称引用它

this关键字的使用

  • this表示当前对象,而所谓的当前对象就是指调用类中方法或属性的那个对象
  • 如果在程序中想用某一个构造方法调用另一个构造方法,也可以使用this()来实现;

static关键字的使用

  • 静态属性

    • 即使用static定义的属性,也称为类变量,是类对象的公共变量
  • 类方法

    • 即使用static定义的方法
    • 类方法不可以调用非static定义的属性
  • static(main)主方法

    • 由于Java虚拟机需要调用类的main()方法,所以该方法的访问权限必须public,又因为Java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static的,该方法接收一个String类型的数组参数,该数组中保存执行Java命令时传递给允许的类的参数
  • static应用——static代码块以及静态导入

    • 一个类可以使用不包含在然和方法体中的静态代码块,当类被载入时,静态代码块被执行,且只执行一次;静态代码块经常用来进行类属性的初始化
  • static最大的特点是,static属性或方法可以由类名称直接调用,另一个就是static属性是一个共享属性

final关键字的使用

  • 定义类

    • final标记的类不能被继承
  • 定义方法

    • final标记的方法不能被子类覆写
  • 定义变量

    • final标记的变量(成员变量或局部变量)即为常量,只能赋值一次
  • 好处

    • final关键字提高了性能
    • final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销
    • 使用final关键字,JVM会对方法、变量及类进行优化
    • 创建不可变类要使用final关键字;不可变类是指它的对象一旦被创建了就不能被更改了。String时不可变类的代表;好处有很多,譬如它们的对象是只读的,可以在多线程环境下安全的共享,不用额外的同步开销等

instanceof关键字的使用

  • 可以用于判断一个类是否实现了某个接口,或者一个实例对象是否属于一个类
  • 语法格式:对象 instanceof类(或接口)
  • 返回值时布尔型

人已赞赏
Java编程语言

【Java学习笔记(四)】接口&抽象类

2020-3-11 22:25:58

PHP编程语言

【PHP学习笔记(一)】PHP的基本语法

2020-3-21 22:20:04

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索