Java第十一课

1 Java语言包和工具包

1.1 回顾:

1) 面向对象:类和对象概念;关系,区别;类中的成员;对象的定义等等
2) 面向对象特征: 抽象 封装 继承 多态(编译时多态(重载) 运行时多态(继承 接口))
3) 其他面向对象: 抽象类,接口(特征?) ,访问修饰符(成员) ,static,final, 构造方法,方法的重载,方法的重写
4) Java中的异常处理:处理的方式? Try-catch-finally[主动处理] ,throws[我知道会发生异常,但是我们不处理,谁调用这个方法就给谁去处理,会出现在函数(方法)声明的部分],throw[主动抛出异常,认为满足某个条件就应该是一个异常了]

这里写图片描述

常见的异常类型:NullPointerException/ClassCastException…
5) 语言包:
包装类:Byte/Short/Character(char)/Integer(int)/Long/Float/Double/Boolean/

这里写图片描述

6) Math数学有关: Math.PI Math.random() Math.ceil() …

1.2 Java语言包:

1.2.1 String类: 不变性

这里写图片描述
这里写图片描述

怎么解释不变性:

这里写图片描述

问题:

这里写图片描述

1.2.2 StringBuilder:

这里写图片描述
这里写图片描述

以后进行字符串拼接的时候,优先选择使用append方法;

1.2.3 StringBuffer:

这里写图片描述

问题:StringBuffer/StringBuilder和String直接如何转换

这里写图片描述

问题:StringBuffer和StringBuilder相比,为什么支持线程同步?

这里写图片描述
这里写图片描述

1.2.1 Object

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

1.2.2 Class:

这里写图片描述

package usb;

public class Cat {
    private String name;
    private String sex;
    private int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Cat [name=" + name + ", sex=" + sex + ", age=" + age + "]";
    }

}
package usb;

public class Test {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {

        // ① 如何得到一个Class类的对象
        // Class.forName static的方法
        // 参数是完整的包名+类名
        Class cla1 = Class.forName("day11.Cat");

        // 实例方法 newInstance
        // newInstance 得到对应的那个 ("day11.Cat")中那个类的对象
        Object obj = cla1.newInstance();
        // 使用一个关键字类判断 某个对象是否属于特定的类
        if (obj instanceof Cat) {
            Cat c = (Cat) obj;
            c.setName("加菲猫");
            c.setAge(20);
            c.setSex("女");
            System.out.println(c);
        }

        // ② 得到一个Class类的对象
        Class cla2 = Cat.class;

        Object obj2 = cla2.newInstance();
        // 使用一个关键字类判断 某个对象是否属于特定的类
        if (obj2 instanceof Cat) {
            Cat c = (Cat) obj2;
            c.setName("加菲猫");
            c.setAge(20);
            c.setSex("女");
            System.out.println(c);

        }

        // ③ 通过对象来的
        Cat cat = new Cat();
        Class cla3 = cat.getClass();
    }

}

应用场景: 我们以后会遇到如果别人只提供一个字符串给你,类似: 包名+类名的方式 ;但是需要我们执行调用这个包中的属性和方法,甚至构造方法; 这些东西的调用和执行应该该是动态的,不是固定的;

这里写图片描述

我们如果想通过外部的方法来获取或者调用类内部的属性以及方法等,可以使用Class类的对象来实现(x光机器):
动态获取某个类内部的细节代码:

package usb;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Scanner;

public class Test {
    public static void main(String[] args)
            throws ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

        System.out.println("请输入您要创建那个类的对象,请输入类名类(eg:day11.Cat)");
        Scanner input = new Scanner(System.in);
        String str = input.nextLine();

        // TODO Auto-generated method stub
        // ① 如何得到一个Class类的对象
        // Class.forName static的方法
        // 参数是完整的包名+类名
        Class cla1 = Class.forName(str);

        // 调用用cla1对象的方法
        Method[] methods1 = cla1.getMethods();
        // 遍历数组
        for (Method method : methods1) {
            // getModifiers 修饰符
            System.out.println(method.getModifiers() + "," + method.getName() + "," + method.getParameterCount());
        }

        System.out.println("**********************************");
        // 调用用cla1对象的方法
        Method[] methods2 = cla1.getDeclaredMethods();
        for (Method method : methods2) {
            // getModifiers 修饰符
            System.out.println(method.getModifiers() + "," + method.getName() + "," + method.getParameterCount());

            // 如果我们知道这个类的方法,能不能调用这个类的方法呀?
            method.invoke(null, null);

        }

    }

}

上面的代码会比较难理解,包括其他的方法我们还没有做实践,也是简单的介绍了一下Class,再后续的课程中,我会再解释器使用场景(反射 =>框架,JDBC通用代码)
小结:Class类对象的创建方式有几种?
1) Class.forName(“完整的包名和类名”);
2) 类型.class
3) 某个类的对象.getClass();
这里写图片描述

1.2.3 System:

这里写图片描述

static long currentTimeMillis()
返回当前时间以毫秒为单位。
static void exit(int status)
终止当前正在运行的java虚拟机。
static void gc()
运行垃圾收集器

这里写图片描述

1.3 Java工具包:

1.3.1 Java.util.Date:

这里写图片描述
这里写图片描述

package day11;

import java.util.Date;

public class TestDate {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        // java.util.Date 当前时间now
        Date now = new Date();
        // 输出
        System.out.println(now);

        // 已经过时的 我们课堂不做介绍
        // Date now1 = new Date("");

        // Date now1 = new Date(System.currentTimeMillis());
        // Date now1 = new Date(2323232323L);

        // 了解一些常见的方法 getxx setxx
        // 其他方法自己注意下
        int month = now.getMonth();

        // 这里的月份要注意一下
        System.out.println("month :" + month);

        long miseconds = now.getTime(); //System.currentTimeMillis

    }

}

1.3.2 Java.util.Calendar

这里写图片描述
这里写图片描述

import java.util.Calendar;

public class TestCalendar {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        // 是一个抽象类 不能直接实例化
        Calendar now = Calendar.getInstance();

        System.out.println(now);
        System.out.println(now.toString());

        // 只想得到now时间对应的年月日 参数应该是一个常量值
        int year = now.get(Calendar.YEAR);

        System.out.println("year: " + year);

        // 这里的month和Date是一致的记得,赋值-1(3 =>2) 获取(2 +1)
        int month = now.get(Calendar.MONTH);

        System.out.println("month :" + (month + 1));

        // 日期
        int date = now.get(Calendar.DATE);
        int date1 = now.get(Calendar.DAY_OF_MONTH);
        System.out.println(date + ", " + date1);




    }

}

问题:Date和Calendar是否可以转换?

这里写图片描述

1.3.3 综合练习:

从控制台输入一个时间值: 格式自定义 ,建议格式: 2018-03 ,然后根据用户的输入,我们打印这个月的月历出来; (已知条件: 1900-1-1 是星期1 -Date) ;可以用Date或者Calendar;

这里写图片描述
这里写图片描述

大家要解决的问题:
从控制台接收进来的字符串,如何转换为Date(Calendar格式) ;可以用到: SimpleDateFormat ;
如何确定这个月有多少天,并打印出来(格式)
分析以及操作步骤:
从控制台接收一个字符串: 2018-03的格式; (有的同学 先输入2018,在输入03);
将接收到的字符串转换为calendar格式(Date) ; SimpleDateFormat 将字符串和Date转换工具;
要确定这个月的第一天是星期几(一周的第一天),这个月一共有多少天需要打印?
按照一定的格式进行打印:

package day11;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;

public class PrintMonthCalendar {

    public static void main(String[] args) throws ParseException {
        // TODO Auto-generated method stub

        Scanner input = new Scanner(System.in);
        System.out.println("请输入年和月份: (eg: 2018-03)");
        String input_date = input.nextLine();

        // 要注意,我们的input_Date中存放的是一个字符串

        // Calendar Date

        // 有没有一种办法能将 input_date字符串 =>转换为 calendar
        // ?好像没找到
        // 能不能将String->Date->Calendar?

        SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM");

        // parse 将字符串转换为Date对象
        Date date = simple.parse(input_date);

        // 设置calendar的时间和date一致(转换)
        Calendar calendar = Calendar.getInstance();

        // 如何
        calendar.setTime(date);

        // 打印看看
        System.out.println(calendar);

        // 确定 calendar 对象的月份的第一天是星期几(应该是一周的第几天 第一天是星期日 ....)
        int weekday = calendar.get(Calendar.DAY_OF_WEEK);
        System.out.println("这个月的第一天是: 一周的第几天:  " + weekday);

        // 这个月有几天(以前月份的判断我们要确定是否是闰年?)
        int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        System.out.println("这个月有几天:  " + days);

        // 打印星期头格式
        System.out.println("日\t一\t二\t三\t四\t五\t六");

        // 打印空格(制表符 \t)
        for (int i = 1; i < weekday; i++) {
            System.out.print("\t");

        }
        // 打印的是这个月的每一天
        for (int i = 1; i <= days; i++) {
            System.out.print(i + "\t");

            // 日期其实是变的 3-1 /3-2/3-3 ....
            calendar.set(Calendar.DAY_OF_MONTH, i);

            // 换行的条件
            if (calendar.get(Calendar.DAY_OF_WEEK) == 7) {
                System.out.println();
            }
        }

    }

}

简单的封装:

1.3.4 SimpleDateFormat(辅助):

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

参考代码(封装后的代码):

package day11;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;

public class PrintMonthCalendar {

    /**
     * 输入时间格式
     * 
     * @return 输入的时间
     */
    public static String inputDate() {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入年和月份: (eg: 2018-03)");
        String input_date = input.nextLine();

        // 要注意,我们的input_Date中存放的是一个字符串
        return input_date;

    }

    /**
     * 将字符串转换为Calendar对象
     * 
     * @param input_date
     *            满足 2018-03格式的字符串
     * @return Calendar对象
     * @throws ParseException
     *             如果解析失败
     */
    public static Calendar convertCalendar(String input_date) throws ParseException {

        SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM");

        // parse 将字符串转换为Date对象
        Date date = simple.parse(input_date);

        // 设置calendar的时间和date一致(转换)
        Calendar calendar = Calendar.getInstance();

        // 如何
        calendar.setTime(date);

        // 打印看看
        // System.out.println(calendar);
        return calendar;
    }

    /**
     * 打印功能的实现
     * 
     * @param calendar
     */
    public static void printDate(Calendar calendar) {

        int weekday = calendar.get(Calendar.DAY_OF_WEEK);
        int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

        // 打印星期头格式
        System.out.println("日\t一\t二\t三\t四\t五\t六");

        // 打印空格(制表符 \t)
        for (int i = 1; i < weekday; i++) {
            System.out.print("\t");

        }
        // 打印的是这个月的每一天
        for (int i = 1; i <= days; i++) {
            System.out.print(i + "\t");

            // 日期其实是变的 3-1 /3-2/3-3 ....
            calendar.set(Calendar.DAY_OF_MONTH, i);

            // 换行的条件
            if (calendar.get(Calendar.DAY_OF_WEEK) == 7) {
                System.out.println();
            }
        }
    }

    public static void main(String[] args) throws ParseException {
        // TODO Auto-generated method stub

        String input_date = inputDate();

        Calendar calendar = convertCalendar(input_date);

        printDate(calendar);
    }

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值