Day 7 2020.3.8
Final关键字
package com.hong.Day007.Demo01;
/*
final关键字代表最终的、不可改变的
常见四种用法:
1.可以用来修饰一个类
格式:public fianl classs 类名称{}
含义:当前这个类不能有任何子类(太监类)(可以有父类,不能有子类)
2.可以用来修饰一个方法
格式:修饰符 final 返回值类型 方法名称(参数列表){方法体}
含义:当用fianl来修饰方法时,这个方法就是最终方法不能修改
3.还可以用来修饰一个局部变量
格式:修饰符 final 返回值类型 变量名 = 变量值
含义:当用fianl来修饰局部变量时,这个变量就是最终变量不能修改
(对于基本类型来说,不可变说的是变量当中的数据不可变
对于引用类型来说,不可变说的是变量当中的地址值不可变(数据值可以改变))
4.还可以用来修饰一个成员变量
含义:当用fianl来修饰成员变量时,这个变量就是最终变量不能修改
1.由于成员变量具有默认值,所以用了final之后必须手动赋值,不会再给默认值了
2.对于final的成员变量,要么使用直接赋值,要么通过构造方法赋值
3.必须保证类当中所有重载的构造方法,都最终会对final的成员变量进行赋值
*/
public class Demo01 {
}
四种权限修饰符
package com.hong.Day007.Demo01;
/*
java中有四种权限修饰符:
public > protected > (default) > private
同一个类 Yes Yes Yes Yes
同一个包 Yes Yes Yes No
不同包子类 Yes Yes No No
不同包非子类 Yes No No No
注意事项:(default)并不是关键字“default”,而是根本不写
*/
public class Demo02 {
}
内部类
package com.hong.Day007.Demo01;
/*
如果一个事物的内部包含另一个事物,那么这就是一个类内部包含另一个类。
分类:
1.成员内部类
定义格式:外部类名称$内部类名称
修饰符 class 类名称{
修饰符 class 类名称{...}
}
注意:内用外,随意访问;外用内,需要内部类对象
使用方法:
1.间接方法:在外部类的方法当中,使用内部类;然后main只是请用外部类的方法
2.直接方法:公式:
类名称 对象名 = new 类名称();
【外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称;】
3.如果出现了重名现象,那么格式是: 外部类名称.this.外部类成员变量名
==========================================================
2.局部内部类(包含匿名内部类)
定义格式:
修饰符 class 外部类名称{
修饰符 返回值类型 外部类方法名称(参数列表){
class 局部内部类名称{
}
}
}
注意:
1.如果希望访问所在方法的局部变量,那么这个局部变量必须是【有效final的】
2.定义一个类的时候,权限修饰符规则
1.外部类: public / (defualt)
2.成员内部类: public / protectted / (defualt) / private
3.局部内部类:什么都不能写
============================================================
3.匿名内部类
如果接口的 实现类(或者是父类的子类)只需要使用唯一的一次
那么这种情况下就可以省略掉该类的定义,而改为使用【匿名内部类】
定义格式:
接口名称 对象名 = new 接口名称() {
//覆盖重写所有抽象方法
};
注意事项:
1.匿名内部类,在【创建对象】的时候,只能使用唯一一次
2.匿名对象,在【调用方法】的时候,只能调用唯一一次
如果希望同一个对象,调用多次方法,那么必然要给对象起个名字
3.匿名内部类是省略了【实现类/子类名称】,但是匿名对象是省略了【对象名字】
*/
public class Demo03 {
}
新发红包案例(未完成)
接口:
package com.hong.Day007.Demo02;
import java.util.ArrayList;
public interface OpenMode {
/**
* 请将totalMoney分成count份,保存到ArrayList<Integer>,返回
* @param totalMoney 总金额为方便计算,已经转换为整数,单位为分
* @param totalCount 红包个数
* @return ArrayList<Integer> 元素为各个红包的金额值,所有元素的值累和等于总金额
*/
ArrayList<Integer> divide(int totalMoney,int totalCount);
}
操作界面:
package com.hong.Day007.Demo02;
/*
场景说明:
红包发出去之后,所有人都有红包,大家抢完了之后,最后一个红包给群主自己
红包分发的策略:
1.普通红包(平均):totalMoney / totalCount ,余数放在最后一个红包当中
2.手气红包(随机):最少1分钱,最多不超过平均数的两倍,余额越发越少
*/
public class Bootstrap {
public static void main(String[] args) {
}
}
Object类
Class Object
是类Object
结构的根。 每个班都有Object
作为超类。 所有对象(包括数组)都实现了这个类的方法。
equals(Object obj)
指示一些其他对象是否等于此。(重写后默认比较地址值)
toString()
返回对象的字符串表示形式。(重写后默认打印地址值)
Date类(日期<–>毫秒)
Data类的空参数构造方法(获取当前系统的日期和时间)
Data类的带参数构造方法(传递毫秒值,返回Data日期值)
getTime方法:把日期转换为毫秒
package com.hong.Day007.Demo02;
import java.util.Date;
/*
java.lang.Date:表示日期和时间的类
类 Date 表示特定的瞬间,精确到毫秒
毫秒值的作用:可以对时间和日期进行计算(可以把日期转换成毫秒,把毫秒转换成日期)
把日期转换为毫秒:
当前日期:2088-01-01
时间原点(0毫秒):1970年 1 月 1 日 00:00:00(英国格林威治)
注意:
中国属于东八区:
时间原点(0毫秒):1970年 1 月 1 日 08:00:00
把毫秒转换为日期:
1天 = 24 * 60 * 60 = 86400秒 = 86400 * 1000毫秒
*/
public class Demo01{
public static void main(String[] args) {
//获取当前系统时间到1970年1 月 1 日 00:00:00经历了多少毫秒
System.out.println(System.currentTimeMillis());
//Data类的空参数构造方法(获取当前系统的日期和时间)
getData();
//Data类的带参数构造方法(传递毫秒值,返回Data日期值)
System.out.println(changeData(0L));
//getTime方法:把日期转换为毫秒
Date date = new Date();
System.out.println(date.getTime());
}
//Data类的空参数构造方法(获取当前系统的日期和时间)
private static void getData() {
Date date = new Date();
System.out.println(date);
}
//Data类的带参数构造方法(传递毫秒值,返回Data日期值)
private static Date changeData(long a) {
Date date1 = new Date(a);
return date1;
}
}
DateFormat类(日期<–>文本)
DateFormat
是日期/时间格式化子类的抽象类,它以语言无关的方式格式化和分析日期或时间。 日期/时间格式化子类(如SimpleDateFormat
)允许格式化(即日期文本),解析(文本日期)和归一化。 该日期表示为一个Date
对象,或自1970年1月1日00:00:00 GMT以来的毫秒。
Date and Time Pattern | Result |
---|---|
“yyyy.MM.dd G ‘at’ HH:mm:ss z” | 2001.07.04 AD at 12:08:56 PDT |
“EEE, MMM d, ''yy” | Wed, Jul 4, '01 |
“h:mm a” | 12:08 PM |
“hh ‘o’‘clock’ a, zzzz” | 12 o’clock PM, Pacific Daylight Time |
“K:mm a, z” | 0:08 PM, PDT |
“yyyyy.MMMMM.dd GGG hh:mm aaa” | 02001.July.04 AD 12:08 PM |
“EEE, d MMM yyyy HH:mm:ss Z” | Wed, 4 Jul 2001 12:08:56 -0700 |
“yyMMddHHmmssZ” | 010704120856-0700 |
“yyyy-MM-dd’T’HH:mm:ss.SSSZ” | 2001-07-04T12:08:56.235-0700 |
“yyyy-MM-dd’T’HH:mm:ss.SSSXXX” | 2001-07-04T12:08:56.235-07:00 |
“YYYY-'W’ww-u” | 2001-W27-3 |
package com.hong.Day007.Demo02;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
`DateFormat`是日期/时间格式化子类的抽象类
作用:
格式化(也就是日期-->文本)、解析(文本-->日期)
成员方法:
String format(Data data) 按照指定的模式,把Data日期,格式化为符合模式的字符串
Data parse(String source) 把符合模式的字符串,解析为Data日期
DateFormat类是一个抽象类,无法直接创建对象使用,可以使用DateFormat类的子类(SimpleDateFormat)
构造方法:
SimpleDateFormat(String pattern)
用给定的模式和默认语言环境和日期格式符号构造
参数:
String pattern:传递指定格式
模式:(大小写区分)
y 年
M 月
d 日
H 时
m 分
s 秒
*/
public class Demo02 {
public static void main(String[] args) throws ParseException {
texi01();
texi02();
}
/*
使用DataFormat类中的方法format,把日期格式转化为文本
*/
private static void texi01() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
Date date = new Date();
String d = sdf.format(date);
System.out.