面向对象进阶
黑马程序员Java零基础视频教程(2022最新Java入门,含斯坦福大学练习题+力扣算法题+大厂java面试题)_哔哩哔哩_bilibili
0.5.方法概述
//三种访问权限
public class student {
String name;
private int age;
static char sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static char getSex() {
return sex;
}
public static void setSex(char sex) {
student.sex = sex;
}
}
//不添加修饰,可以直接.
//如果是static直接类名.
//如果是priveate,只能get或者set方法才能进行赋值
public class studenttest {
public static void main(String[] args) {
student.sex='男';
student s1 = new student();
s1.name="郝胜新";
s1.setAge(21);
//简单的调用,可以这么调用
System.out.println(new student.name);
}
}
一.static
1.静态成员变量
a1
public class a1 {
public static void main(String[] args) {
a2 name = new a2("郝胜新",21);
name.student = "大飞老师";
System.out.println(name.toString());
}
}
a2
public class a2 {
private String name ;
private int age;
public String student;
public a2() {
}
public a2(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "a2{" +
"name='" + name + '\'' +
", age=" + age +
", student='" + student + '\'' +
'}';
}
public a2(String name, int age, String student) {
this.name = name;
this.age = age;
this.student = student;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getStudent() {
return student;
}
public void setStudent(String student) {
this.student = student;
}
}
2.静态方法和工具类
工具类一般用private的构造方法,为了不让他创建对象
//工具类打印数组和求平均值
public class AyyayUtil {
private AyyayUtil(){
}
public static void printArr(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+" ");
}
}
public static void getAerage(float[] array) {
float sum = 0;
for (int i = 0; i < array.length; i++) {
sum += array[i];
}
System.out.println("平均分为"+sum/array.length);
}
}
测试类
public class TestDemo {
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5, 6, 7, 8};
float[] array2 = {1, 2, 3, 4, 5, 6, 7, 8};
AyyayUtil.printArr(array);
AyyayUtil.getAerage(array2);
}
}
注意事项:静态方法中,只能访问静态成员变量,和调用静态方法。
非静态方法可以访问所有的静态成员变量和静态方法
静态方法中没有this关键字
二.继承
1.子类能继承父类中的哪些内容?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YiD9vTLa-1663486103899)(E:\Typora\img\image-20220829092250821.png)]
- 创建一个子类对象,调用父类方法,不是逐级向上寻找,而是有一个虚方法表,把非private,fianl,static方法添加进去,然后直接调用,这样效率会高,如果有以上三个其中的一个,那么会向上逐级寻找
2.方法重写和注意事项机器要求
1.重写方法的名称,形参列表必须与父类中的一致
2.子类重写父类方法时,访问权限子类必须大于父类
3.子类重写父类方法时,返回值类型子类必须小于等于父类
4建议:重写的方法尽量和父类保持一致
5.只有被添加到虚方法表的中的方法才能被重写
3.this,super
this();
:使用本类的构造方法,一般用于数据的初始化。
package 面向对象进阶._829extend1;
public class student {
String name;
int age;
String school;
public student(String name, int age, String school) {
this.name = name;
this.age = age;
this.school = school;
}
//一般给数据初始化用的
public student() {
this(null,0,"科工大");
}
}
三.多态
1.对象的多种形态
多态的前提
1.有继承/实现关系
2.有父类引用指向子类对象
3.有方法的重写
多态的好处
1.使用父类型作为参数时,可以接受所有子类对象
2.体现多态的扩展性与便利
多态的弊端
1.不能使用子类的特有功能
解决方法
1.强制类型转换
最简单应用
public class Person {
private String Name;
private int Age;
public Person(String name, int age) {
Name = name;
Age = age;
}
public Person() {
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public int getAge() {
return Age;
}
public void setAge(int age) {
Age = age;
}
public void show(){
System.out.println("信息为:"+getName()+","+getAge());
}
}
class Admin extends Person{
@Override
public void show() {
System.out.println("管理员信息为:"+getName()+","+getAge());
}
}
class Student extends Person {
@Override
public void show() {
System.out.println("学生信息为:"+getName()+","+getAge());
}
}
class Teacher extends Person{
@Override
public void show() {
System.out.println("老师信息为:"+getName()+","+getAge());
}
}
package 面向对象进阶._230_duotai;
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.setName("张三");
student.setAge(21);
Teacher teacher = new Teacher();
teacher.setName("李四");
teacher.setAge(41);
Admin admin = new Admin();
admin.setName("王五");
admin.setAge(73);
register(student);
register(teacher);
register(admin);
}
public static void register(Person p){
p.show();
}
}
2.多态调用成员的特点
变量调用:编译看左边,运行也看左边
方法调用:编译看左边,运行看右边
编译的时候会看左边的父类中有没有这个方法,如果有编译成功,没有则编译失败
运行的时候,运行的是右边的对象的方法
package 面向对象进阶._830_duotai;
public class AnimalTest {
public static void main(String[] args) {
Animal a = new Dog();
System.out.println(a.name);--->动物
a.show();--->Dog--show
}
}
class Animal {
String name = "动物";
public void show(){
System.out.println("Animal--show方法");
}
}
class Dog extends Animal{
String name = "狗";
@Override
public void show() {
System.out.println("Dog--show方法");
}
}
class Cat extends Animal{
String name = "猫";
@Override
public void show() {
System.out.println("Cat--show方法");
}
}
多态的弊端,
Animal a = new Dog();
因为运行看右边,所以没办法调用Dog自己方法
解决办法:强转
Animal a = new Dog();
Dog b = (Dog) a ;-->强转,如果是从小范围向大范围转换,就不用强转,Animal要比Dog的范围要小,别转成别的类型,否则报错
正确的转换方法
Animal a = new Dog();
if (a instanceof Dog){
Dog d = (Dog) a;
}else if (a instanceof Cat){
Cat C = (Cat) a;
}else {
System.out.println("没有这个类型,转换失败");
}
遇到多态问题时,最好时从上往下写代码,
final
1.final修饰变量时,变量无法二次赋值
2.final修饰类时,方法无法被继承
3.final修饰方法时,方法无法被重写
权限修饰符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p0CJH7Kb-1663486103900)(E:\Typora\img\image-20220831094931292.png)]
代码块
{}里面的方法和变量,只能在{}中使用
static{}时用类时就运行一次,一般用于数据的初始化
public class test {
static ArrayList<String> list = new ArrayList<>();
static {
list.add("张三");
list.add("李四")
}
public static void main(String[] args) {
{
int a = 10;
int b = 20;
System.out.println(a);
System.out.println(b);
}
}
static{
System.out.println("静态代码块执行了");
}
}
调用main方法
test.main(null);
四.抽象类
1.抽象类不能实例化()抽象方法,无法调用。
2.可以有构造方法
3.抽象类的子类
要么重写抽象类中的所有抽象方法
要么是抽象类
五.接口
接口就是一种规则,是对行为的抽象
1.接口用关键字interface来定义
public interface 接口名{}
2.接口不能实例化
3.接口和类之间是实现关系,通过implements关键字表示
public class 类名 implments 接口名 {}
4.接口的子类(实现类)
要么重写接口中所有的抽象方法
要么是抽象类
注意1:接口和类的实现关系,可以单实现,也可以多实现
public class [类名] implements 接口名1,接口名2{}
注意2:实现类还可以在继承一个类的同时实现多个接口
public class [类名] extend [父类] implements 接口名1,接口名2{}
特点
成员变量
只能是常量
默认修饰符public static final
构造方法
没有
成员方法
默认修饰符:public abstract
简单实现
public interface Inter {
int a = 10;
//默认修饰符 public static final
void method();
}
public class Test implements Inter{
public static void main(String[] args) {
System.out.println(Inter.a);
}
@Override
public void method() {
System.out.println("method");
}
}
在接口中使用默认的方法:
格式:public default 返回值类型 方法名(){}
注意事项:
1.默认方法不是抽象方法,不强制重写。如果需要重写去掉default关键字
2.public可以省略,但是default不可以
3.如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写
public interface Inter {
default void method(){
System.out.println("我是一个默认方法");
}
}
六.内部类
在一个类里面,定义另外一个类
特点:
内部类可以直接访问外部类的成员,包括私有
外部类要访问内部类的成员必须创建对象
public class test1 {
String name;
int age;
public class neibulei{
String sonname;
String sonage;
}
}
public class temp {
public static void main(String[] args) {
//创建内部类对象
test1.neibulei method = new test1().new neibulei();
//调用内部类里的成员变量
System.out.println(method.sonname);
//快速调用
System.out.println(new test1().name);
}
}
其他的修饰方式:
private:其他类中就没有办法直接创建内部类的对象了
public class test1 {
String name;
int age;
private class neibulei{
String sonname;
String sonage;
}
}
怎么创建private修饰内部类的对象
public class test1 {
String name;
int age;
private class neibulei{
String sonname;
String sonage;
}
public neibulei makemethod(){
return new neibulei();
}
}
public class temp {
public static void main(String[] args) {
// test1.neibulei method = new test1().new neibulei();
// System.out.println(method.sonname);
test1 test1 = new test1();
Object o = test1.makemethod();
System.out.println(new test1().name);
}
}
注:给外部类创建一个方法,让方法返回一个内部类的对象,然后就可以创建一个内部类的对象了,但是返回值得用Object来接收
默认:
只能在本包内创建对象,其他包无法创建
test
public class Outer {
private int a = 10;
static class Inner{
private int a = 20;
public void show(){
int a = 30;
System.out.println(new Outer().a); //10
System.out.println(new Outer.Inner().a); //20
System.out.println(a); //30
}
}
}
static
静态成员变量得调用
public class Outer {
int a = 10;
static int b = 20;
//静态内部类
static class Inner{
//静态成员方法
public static void show1(){
System.out.println("非静态方法被调用了");
//调用外部类非静态成员变量
System.out.println(new Outer().a);
//调用外部类静态成员变量
System.out.println(b);
}
public void show2(){
System.out.println("静态方法被调用了");
}
}
}
public class Test {
public static void main(String[] args) {
//因为是非静态成员变量,所以得用对象调用
new Outer.Inner().show2();
//是静态成员变量,能直接调用
Outer.Inner.show1();
}
}
局部内部类
//卸载方法里面的内部类
1.将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部内部类
2.外界无法直接使用,需要在方法内部创建对象并使用
public class Outer1 {
int b =20;
public void show(){
int a = 10;
class inner{
String name;
int age;
public void mathod1(){
System.out.println("局部类的method1方法");
System.out.println(a);
System.out.println(name);
}
}
}
}
匿名内部类
匿名内部类本质上就是隐藏了名字的内部类
速记:new类名小括号中括号重写
整体是个对象!!!!
格式:
new 类名或者接口名(){
重写方法;
};
举例:
Inter inter = new Inter(){
//整体是个对象,中括号里面是一个类,没有名字的类,然后new一个中括号(没有名字得那个类/接口)对象,然后得告诉他new得是哪个类/接口对象,输入Inter,可以用 Inter类型来接收
public ovid show(){
}
}
测试:
public interface swim {
void swims();
}
public class Test {
public static void main(String[] args) {
swim s = new swim() {
@Override
public void swims() {
System.out.println("我是一个傻瓜");
}
};
s.swims();
}
}
拼图游戏(可视化)
1.JFrame
JFrame jFrame = new JFrame();
jFrame.setSize(800,800);//设置窗体大小
jFrame.setDefaultCloseOperation(3);//程序关闭方式
jFrame.setAlwaysOnTop(true);//一直在最上面
jFrame.setLayout(null);//关闭位置信息
jFrame.getContentPane()//获取内部窗体对象
jFrame.setVisible(true);//设置为可见窗口
Ctrl + Alt + M 快速创建方法
2.菜单设计
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Le3VCb8x-1663486103901)(E:\Typora\img\image-20220908090945401.png)]
由jMenuBar,JMenu,JMenuItem
jMenuBar是一个菜单对象
JMenu是功能
JMenuItem是每一条信息
JMenuItem->JMenu->jMenuBar逐级添加
private void initcaidan() {
//初始化菜单
this.setVisible(true);
//创建菜单对象
JMenuBar jMenuBar = new JMenuBar();
//创建菜单名字
JMenu jMenu1 = new JMenu("功能");
JMenu jMenu2 = new JMenu("关于我们");
//下拉菜单的条目
JMenuItem replay = new JMenuItem("重新游戏");
JMenuItem relogin = new JMenuItem("重新登陆");
JMenuItem closegame = new JMenuItem("关闭游戏");
JMenuItem wechat = new JMenuItem("本人微信");
//与选项关联
jMenu1.add(replay);
jMenu1.add(relogin);
jMenu1.add(closegame);
jMenu2.add(wechat);
//添加到菜单中
jMenuBar.add(jMenu1);
jMenuBar.add(jMenu2);
//把菜单放入界面中
this.setJMenuBar(jMenuBar);
}
3.添加图片
创建jframe对象时,创建的是一个外框,里面的框是getContentPane(),直接把照片添加到里面就行了,就不用把添加到JFrame对象中
private void initImage() {
//创建一个图片ImageIcon的对象
ImageIcon imageIcon = new ImageIcon("src/girl/Game/Image/taile.jpg");
//创建一个jLabel的对象(管理容器,管理图片的容器)
JLabel jLabel = new JLabel(imageIcon);
//指定图片的位置
jLabel.setBounds(0,0,201,201);
this.getContentPane().add(jLabel);
//把管理器添加到了界面中
}
4.时间
键盘监听
使用流程:创建一个JButton对象->给JButton设置大小->添加事件->JButton添加到JFrame内部
package girl.Game.Test;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
public class t4 extends JFrame implements ActionListener {
JButton jButton1 = new JButton("按键1");
JButton jButton2 = new JButton("按键2");
public t4() throws HeadlessException {
this.setSize(500,500);
this.setLayout(null);
this.setDefaultCloseOperation(2);
this.setAlwaysOnTop(true);
jButton1.setBounds(0,0,100,200);
jButton2.setBounds(200,0,100,200);
jButton1.addActionListener(this);
this.getContentPane().add(jButton1);
this.getContentPane().add(jButton2);
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
System.out.println("按钮已经点击");
if (source==jButton1){
jButton1.setBounds(0,0,100,100);
}else if (source == jButton2){
Random random = new Random();
int i = random.nextInt(500);
jButton2.setBounds(i,i,100,100);
}
}
}
鼠标监听
package girl.Game.Test;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class t5 extends JFrame implements MouseListener, ActionListener {
public t5() throws HeadlessException {
this.setSize(500,500);
this.setDefaultCloseOperation(3);
this.setLayout(null);
this.setAlwaysOnTop(true);
this.setVisible(true);
JButton jButton = new JButton();
jButton.setBounds(100,100,100,100);
jButton.addActionListener(this);
jButton.addMouseListener(this);
this.getContentPane().add(jButton);
}
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("单击");
}
@Override
public void mousePressed(MouseEvent e) {
System.out.println("按下不松");
}
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("划入");
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("划出");
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void actionPerformed(ActionEvent e) {
}
}
动作(键盘)监听
package girl.Game.Test;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
// 键盘监听
public class t6 extends JFrame implements KeyListener {
public t6() throws HeadlessException {
this.setSize(500,500);
this.setDefaultCloseOperation(3);
this.setLayout(null);
this.setAlwaysOnTop(true);
this.setVisible(true);
this.addKeyListener(this);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("按下不松");
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("松开按键");
int keyCode = e.getKeyCode();
System.out.println(keyCode);
if (keyCode == 65){
System.out.println("按的是A");
}else {
System.out.println("按的不是A");
}
}
}
其他
//清除所有
this.getContentPane().removeAll();
//刷新
this.getContentPane().repaint();
//关闭虚拟机
System.exit(0);
弹窗
System.out.println("弹出微信");
//创建一个弹窗
JDialog jDialog = new JDialog();
//设置大小
jDialog.setSize(300,300);
//设置弹窗总在上面
jDialog.setAlwaysOnTop(true);
//设置句中
jDialog.setLocationRelativeTo(null);
// jDialog.setTitle("本人微信");
//天窗不关闭,游戏没有办法操作
jDialog.setModal(true);
JLabel jLabel = new JLabel("没有帅哥");
jLabel.setBounds(100,100,100,100);
jDialog.getContentPane().add(jLabel);
jDialog.setVisible(true);
输入框
字符串
1.StringBuffer
2.StringBuilder
//1.创建一个StringBuilder容器的对象
StringBuilder sb = new StringBuilder("初始化字符串");
//2.可以添加任何类型,都会转变为字符串
sb.append(11);
sb.append('你');
//3.反转字符串
sb.reverse();
System.out.println(sb);
//4.toString,上面打印的是sb,sb是一个容器类型是StringBuilder,经过toString他才能变成String类型的字符串
String str = sb.toString();
System.out.println(str);
练习:写一个方法要求返回一个按照 [1,2,3,4,5,6,7,8,9,10] 返回的方法
public static String method(int [] array){
StringBuilder sb = new StringBuilder("[");
for (int i = 0; i < array.length; i++) {
if (i != array.length - 1){
sb.append(array[i]);
sb.append(",");
}else {
sb.append(array[i]);
}
}
sb.append("]");
return sb.toString();
}
3.StringJoiner
.StringBuilder太麻烦了,拼接,和[ ]那就用StringJoiner
两种方法
public StringJoiner(间隔符号)
public StringJoiner(间隔符号,开始符号,结束符号)
七.常用API
Math
//向上取整
Math.ceil(double a);
//向下取整
Math.floor(double a);
//圆周率
Math.E;
//四舍五入
Math.round(float a);
//a的b次幂
Math.pow(a,b);
//a的平方根
Math.sqrt(double a)
//a的立方根
Math.cbrt(double a)
//取一个[0.0,1.0)之间的随机数
Math.random();
System
//停止程序
System.exit(0);
//显示时间(距1970年的毫秒)
System.currentTimeMillis();
//copy数组
System.arraycopy(数据源数组,起始索引,目的地索引,起始索引,拷贝个数)
int [] arry = new int[]{1,2,3};
int [] arry2 = new int[3];
//参数:1:据源数组,2:原数组第几个索引开始copy.3:拷贝到哪个数组,4:拷贝到目标数组的第几个索引,5:拷贝的长度
//4会覆盖原数组
System.arraycopy(arry,0,arry2,0,3);
Runtime
Runtime.getRuntime();
Data
//创建对象,指定一个时间,0L是0毫秒,是距离1970年0毫秒
Date date = new Date(0L);
//打印时间
System.out.println(date);//Thu Jan 01 08:00:00 CST 1970
//修改时间
date.setTime(1000L);
System.out.println(date);//Thu Jan 01 08:00:01 CST 1970
//获得距离1970年距离的毫秒数
long time = date.getTime();
System.out.println(time);//1000
SimpleDateFormat
1.日期对象—>字符串
public final String format(Date date)
//默认无参SimpleDateFormat
SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
Date date = new Date();
String format = simpleDateFormat.format(date);
System.out.println(format);//22-9-16 下午1:10
//有参
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EE");
Date date = new Date();
String format = simpleDateFormat.format(date);
System.out.println(format);//2022年09月16日 13:17:03 星期五
2.字符串—>日期对象
public Date parse (String source)
String str = "2022-9-16 13:19:18";
//创建的对象要与字符串格式相同
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date parse = simpleDateFormat.parse(str);
System.out.println(parse);
//转换初恋的出生日期
String str = "2000-11-11";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date parse = simpleDateFormat.parse(str);
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy年MM月dd日");
String format = simpleDateFormat1.format(parse);
System.out.println(format);
//秒杀活动
Scanner scanner = new Scanner(System.in);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
System.out.print("在10秒内秒杀,输入1确认秒杀:");
long l = System.currentTimeMillis();
Date date = new Date(l);
String next = scanner.next();
long l1 = System.currentTimeMillis();
String format = simpleDateFormat.format(date);
if ((l+10000)>l1){
System.out.println("秒杀成功");
}else {
System.out.println("秒杀失败");
}
System.out.println("您的秒杀时间为"+format);
Calendar
Calendar代表了系统当前的时间的日历对象,可以单独修改、获取时间中的年、月、日
细节:Calendar是一个抽象类,不能直接创建对象
public static Calendar getInstance(); //获取当前时间的日期对象
public final Date getTime(); //获取日期对象
public final setTime(Date date) //给日期设置日期对象
public long getTimeInMillis() //拿到毫秒值
public void setTimeInmillis(long millis) //给日历设置时间毫秒值
public int get(int field) //获取日期中的某个字段信息
public void set(int field,int value) //修改日期中的某个字段信息
public void add(int field,int amount) //为某个字段添加减少指定的值
Calendar instance = Calendar.getInstance();//获取当前时间的日期对象
Date time = instance.getTime();//获取日期对象
System.out.println(new SimpleDateFormat("yyyy年MM月dd日").format(time));
Arrays
Arrays.sort(shuzu);
Arrays.
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(“yyyy年MM月dd日 HH:mm:ss”);
System.out.print(“在10秒内秒杀,输入1确认秒杀:”);
long l = System.currentTimeMillis();
Date date = new Date(l);
String next = scanner.next();
long l1 = System.currentTimeMillis();
String format = simpleDateFormat.format(date);
if ((l+10000)>l1){
System.out.println(“秒杀成功”);
}else {
System.out.println(“秒杀失败”);
}
System.out.println(“您的秒杀时间为”+format);
### Calendar
Calendar代表了系统当前的时间的日历对象,可以单独修改、获取时间中的年、月、日
细节:Calendar是一个抽象类,不能直接创建对象
```java
public static Calendar getInstance(); //获取当前时间的日期对象
public final Date getTime(); //获取日期对象
public final setTime(Date date) //给日期设置日期对象
public long getTimeInMillis() //拿到毫秒值
public void setTimeInmillis(long millis) //给日历设置时间毫秒值
public int get(int field) //获取日期中的某个字段信息
public void set(int field,int value) //修改日期中的某个字段信息
public void add(int field,int amount) //为某个字段添加减少指定的值
Calendar instance = Calendar.getInstance();//获取当前时间的日期对象
Date time = instance.getTime();//获取日期对象
System.out.println(new SimpleDateFormat("yyyy年MM月dd日").format(time));
Arrays
Arrays.sort(shuzu);