Java基础08内部类枚举类日期和时间MathRandom
Posted discoverspace
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础08内部类枚举类日期和时间MathRandom相关的知识,希望对你有一定的参考价值。
1 内部类
1.1 概念
大部分时候,类被定义成一个独立的程序单元,在某些情况下,也会把一个类放到另一个类的内部定义,这个定义在其他类内部的类就被称为内部类,包含内部类的类被称为外部类。
1.2 作用
1.提供更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。
2.内部类成员可以直接访问外部类的私有数据,因为内部类被当成其外部类成员,同一个类的成员之间可以互相访问。但外部类不能访问内部类的实现细节,例如内部类的成员变量。
3.匿名内部类适合用于创建那些仅需要一次使用的类。
注意:
1.内部类比外部类可以多使用三个修饰符:private、protected、static,外部类不可以使用这三个修饰符。
2.非静态内部类不能拥有静态成员。
1.3 非静态内部类
成员内部类分为两种,静态内部类和非静态内部类,使用static修饰的成员内部类是静态内部类,没有使用static修饰的成员内部类是非静态内部类。(在方法中定义的内部类被称为局部内部类)
不允许在外部类的静态成员中直接使用非静态内部类,不允许在非静态内部类中定义静态成员。非静态内部类里不能有静态方法、静态成员变量、静态初始化块。
1.4 静态内部类
如果使用static来修饰一个内部类,则这个内部类就属于外部类本身,而不属于外部类的某个对象。因此使用static 修饰的内部类被称为类内部类,也称为静态内部类。
注意:
静态内部类可以包含静态成员,也可以包含非静态成员。根据静态成员不能访问非静态成员的规则,静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。即使是静态内部类的实例方法也不能访问外部类的实例成员,只能访问外部类的静态成员。
静态内部类是外部类的-一个静态成员,因此外部类的所有方法、所有初始化块中可以使用静态内部类来定义变量、创建对象等。
外部类依然不能直接访问静态内部类的成员,但可以使用静态内部类的类名作为调用者来访问静态内部类的类成员,也可以使用静态内部类对象作为调用者来访问静态内部类的实例成员。
Java 还允许在接口里定义内部类,接口里定义的内部类默认使用public static 修饰,也就是说,接口内部类只能是静态内部类。
1.5 匿名内部类
1.5.1 概念
简单地说:匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:
1.只用到类的一个实例。
2.类在定义后马上用到。
3.类非常小。
4.给类命名并不会导致你的代码更容易被理解。
1.5.2 要求
1.不能有构造方法。
2.不能定义任何静态成员、静态方法和静态类。
3.不能被public、protected、private、static修饰。
4.只能创建一个实例。
5.不能是抽象类、不能定义构造器,可以定义初始化块。
1.5.3 实现
new interfacename(){......};
匿名内部类在new之后隐含实现一个接口或类。
分类:(待补充)
实例化匿名内部类、形参匿名内部类、返回值匿名内部类。
2 枚举类
在某些情况下,一个类的对象是有限且固定的,比如季节类,只有四个对象,月份也是只有12个月。这种实例有限且固定的类,在Java中称作枚举类。
2.1 enum关键字(Java1.5)
枚举类是一种特殊的类,它一样可以有自己的成员变量、方法,可以实现一个或多个接口,也可以定义自己的构造器。一个Java源文件中最多只能定义一个public访问权限的枚举类,且该Java源文件也必须和该枚举类的类名相同。
2.2 与普通类的区别
1.枚举类可以实现一个或多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是默认继承Object 类,因此枚举类不能显式继承其他父类。其中java.lang.Enum 类实现了java.lang. Serializable和java.lang. Comparable两个接口。
2.使用enum定义、非抽象的枚举类默认会使用final 修饰,因此枚举类不能派生子类。
3.枚举类的构造器只能使用private 访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰;如果强制指定访问控制符,则只能指定private 修饰符。
4.枚举类的所有实例必须在枚举类的第一行显式列出,否则这个枚举类永远都不能产生实例。列出这些实例时,系统会自动添加public static final修饰,无须程序员显式添加。
2.3 使用
public enum Name{
//内容
A,B,C,D;
}
在主方法里直接调用 Name.A即可使用。
常和swich语句配合,swich括号里可以填枚举类对象。
枚举类默认提供了一个values()方法,该方法可以很方便的遍历所有的枚举值。
3日期和时间类
Java原本提供了Date和Calendar用于处理日期、时间的类,包括创建日期、时间对象,获取系统当前日期、时间等操作。但Date不仅无法实现国际化,而且它对不同属性也使用了前后矛盾的偏移量,比如月份与小时都是从0开始的,月份中的天数则是从1开始的,年又是从1900开始的,而java.util.Calendar则显得过于复杂,从下面介绍中会看到传统Java对日期、时间处理的不足。Java 8吸取了Joda-Time 库(一个被广泛使用的日期、时间库)的经验,提供了一套全新的日期时间库。
3.1 Date类
Java提供了Date类来处理日期、时间(此处的Date是指java.util包下的Date类,而不是java.sql包下的Date类),Date对象既包含日期,也包含时间。Date 类从JDK 1.0起就开始存在了,但正因为它历史悠久,所以它的大部分构造器、方法都已经过时,不再推荐使用了。
Date类提供了6个构造器,其中4个已经Deprecated (Java 不再推荐使用,使用不再推荐的构造器时编译器会提出警告信息,并导致程序性能、安全性等方面的问题),剩下的两个构造器如下。
Date():生成-一个代表当前日期时间的Date对象。该构造器在底层调用System.currentTimeMillis()获得long整数作为日期参数。
Date(long date):根据指定的long型整数来生成一个 Date对象。该构造器的参数表示创建的Date对象和GMT 1970年1月1日00:00:00之间的时间差,以毫秒作为计时单位。
总体来说,Date是-一个设计相当糟糕的类,因此Java官方推荐尽量少用Date的构造器和方法。如果需要对日期、时间进行加减运算,或获取指定时间的年、月、日、时、分、秒信息,可使用Calendar工具类。
3.2 Calender类
因为Date 类在设计上存在- - 些缺陷,所以Java 提供了Calendar 类来更好地处理日期和时间。Calendar是一个抽象类,它用于表示日历。
Calendar类本身是一个抽象类, 它是所有日历类的模板,并提供了一些所有日历通用的方法;但它本身不能直接实例化,程序只能创建Calendar子类的实例,Java本身提供了一个GregorianCalendar类,一个代表格里高利日历的子类,它代表了通常所说的公历。
Calendar类是一个抽象类,所以不能使用构造器来创建Calendar 对象。但它提供了几个静态getInstance(方法来获取Calendar 对象,这些方法根据TimeZone, Locale 类来获取特定的Calendar, 如果不指定TimeZone、Locale, 则使用默认的TimeZone、Locale 来创建Calendar。
3.3 Java8新增日期、时间包
java.time包包含如下常用类:
Clock:该类用于获取指定时区的当前日期、时间。该类可取代System类的currentTimeMillis()方法,而且提供了更多方法来获取当前日期、时间。该类提供了大量静态方法来获取Clock对象。
Duration:该类代表持续时间。该类可以非常方便地获取一段时间。
Instant:代表-一个具体的时刻,可以精确到纳秒。该类提供了静态的now()方法来获取当前时刻,也提供了静态的now(Clock clock)方法来获取clock对应的时刻。除此之外,它还提供了一系列minusXxx()方法在当前时刻基础上减去-段时间,也提供了plusXxx()方法在 当前时刻基础上加上一段时间。
LocalDate:该类代表不带时区的日期,例如2007-12-03。 该类提供了静态的now()方法来获取当前日期,也提供了静态的now(Clock clock)方法来获取clock对应的日期。除此之外,它还提供了minusXxx()方法在当前年份基础上减去几年、几月、几周或几日等,也提供了plusXxx()方法在当前年份基础上加上几年、几月、几周或几日等。
LocalTime:该类代表不带时区的时间,例如10:15:30。 该类提供了静态的now(方法来获取当前时间,也提供了静态的now(Clock clock)方法来获取clock对应的时间。除此之外,它还提供了minusXxx()方法在当前年份基础上减去几小时、几分、几秒等,也提供了plusXxx()方法在当前年份基础上加上几小时、几分、几秒等。
LocalDateTime:该类代表不带时区的日期、时间,例如2007-12-03T10:15:30。该类提供了静态的now()方法来获取当前日期、时间,也提供了静态的now(Clock clock)方法来获取clock对应的日期、时间。除此之外,它还提供了minusXxx()方法 在当前年份基础上减去几年、几月、几日、几小时、几分、几秒等,也提供了plusXxx()方法在当前年份基础上加上几年、几月、几日、几小时、几分、几秒等。
MonthDay:该类仅代表月日,例如--04-12. 该类提供了静态的now(方法来获取当前月日,也提供了静态的now(Clock clock)方法来获取clock对应的月日。
Year:该类仅代表年,例如2014. 该类提供了静态的now()方法来获取当前年份,也提供了静态的now(Clock clock)方 法来获取clock对应的年份。除此之外,它还提供了minusYears()方法在当前年份基础上减去几年,也提供了plusYears()方法在当前年份基础上加上几年。
YearMonth:该类仅代表年月,例如2014-04。该类提供了静态的now()方法来获取当前年月,也提供了静态的now(Clock clock)方法来获取clock 对应的年月。除此之外,它还提供了minusXxx()方法在当前年月基础上减去几年、几月,也提供了plusXxx()方法在当前年月基础上
加上几年、几月。
ZonedDateTime:该类代表一个时区化的日期、时间。
Zoneld:该类代表一个时区。
DayOfWeek:这是一个枚举类,定义了周日到周六的枚举值。
Month:这也是一个枚举类,定义了一月到十二月的枚举值。
使用实例:
4 Random 产生随机数
4.1 Random类专门用于生成--个伪随机数,它有两个构造器:一个构造器使用默认的种子(以当前时间作为种子),另一个构造器需要程序员显式传入一个long型整数的种子。
4.2 ThreadLocalRandom类是Java 7新增的一个类,它是Random的增强版。在并发访问的环境下,使用ThreadLocalRandom来代替Random可以减少多线程资源竞争,最终保证系统具有更好的线程安全性。
ThreadL ocalRandom类的用法与Random类的用法基本相似,它提供了一个静 态的crrent()方法来获取ThreadLocalRandom对象,获取该对象之后即可调用各种nextXxx()方法来获取伪随机数了。ThreadLocalRandom与Random都比Math的random()方法提供了更多的方式来生成各种伪随机数,可以生成浮点类型的伪随机数,也可以生成整数类型的伪随机数,还可以指定生成随机数的范围。关于Random类的用法如下程序所示。
以上是关于Java基础08内部类枚举类日期和时间MathRandom的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin基础(十四) 枚举类(enum)数据类(data)和密封类(sealed)与java的写法差异