JAVA集中学习第一周学习记录(下)

系列文章目录

第一章 JAVA集中学习第一周学习记录(上)
第二章 JAVA集中学习第一周项目实践
第三章JAVA集中学习第一周学习记录(下)



前言

本文主要讲述高强度学习Java后,对第一周学习内容的总结(下)
做下自我介绍:
在下乃攸攸太上,自称是不世出的大英雄,其实是二次元死宅家里蹲。目前在高强度集中被老师从大脑提取大三上在大学学习的Java知识,提取完了会告诉你们的。


方法以及数组的基础知识

1.方法的介绍

方法一段功能代码的组合,减少代码的重用性(只要一个单词后面带小括号,就是方法)

1.1 使用方法的步骤

第一步、定义一个方法

位置: 在类的里面,其他方法的外面

定义语句:
[权限修饰符][方法修饰符][返回值类型]方法名(‘参数列表’){
//方法体(功能代码)
[return 返回值;]
}

例:

public static int getmax(int a, int b){
        if (a < b){
            //如果b比a大,返回b
            return b;
        }
        else {
            //如果a比b大(或相等),返回a
            return a;
        }
    }

权限修饰符(四种): public公有的、protected受保护的、default默认的(可不写)、private私有的

方法修饰符: ‘无’默认的、static静态的、final最终的、abstract抽象的、synchronized同步的、native本地的

返回值类型:
1、有返回值类型:所有变量类型都可以作为返回值类型
2、无返回值类型:只有构造方法没有返回值
3、返回值类型为空:void,表示着一段功能的结束

方法名: 标识符(命名规则:首字母小写,后面单词首字母大写),一般选择动词。方法名不要缩写

参数列表: 传需要变的量,功能代码中不确定的因素,可变的因素。定义时是形参

方法体: 在大括号里,要实现的功能

返回值: 与返回值类型相同

第二步、使用这个方法

位置: 在类的里面,其他方法的里面

调用语句:
方法名(实参);

例:

    public static void main(String[] args) {
        System.out.println(getmax(5, 6));
    }

1.2 方法的重载

定义: java程序中,同一个类下,方法名相同,参数列表不同(参数类型,位置,个数其中之一不同就行),与返回值和修饰符无关。(两个方法或两个以上,叫做方法间的互为重载)

提示: 权限修饰符,方法修饰符,返回值三个都无关,只有参数列表不同,方法名相同就算重载

重载的意义:
拟合不同数据类型的函数,方便程序员

下面思考题请先自行思考,再看答案
思考:Scanner类的next()函数为什么不重载?


例:nextInt()接受int —— next()接受String
Scanner没有参数,所以不能进行重载。

思考:无参方法能否重载?


如果规定是无参,与返回值修饰符无关,改权限修饰符可能进行重载吗?
修饰符包括权限修饰符和方法修饰符,重载与他们都无关。
所以无参方法只要是无参就是完全一样了。
如果有 ‘无参’ 与 ‘有参数’ 的同名方法算重载。

Scanner获取的字符串,无法正确得到成果的原因是什么?
代码:

	public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        login("张三");
        String name = scanner.next();
        login(name);
    }
    public static void login(String string){
        if (string=="张三"){
            System.out.println("right");
        }
        else
            System.out.println("wrong");
    }

输出结果:
在这里插入图片描述
提示:绿色的张三为我的输入

答案解析:
计算机内存四个部分:栈区,堆区,常量池,方法区
'=='比较内存地址同不同,两个张三的地址不一样
基本数据类型存在栈里
引用数据类型存在堆里,栈里存(在堆里的)地址
方法里的"字符常量"存在常量池里
堆的地址和常量池的地址不一样,so不一样
常量池: 相同的东西不创建第二个,所以45行能正常运行

2.数组的介绍

学习数组的原因: 随着程序的复杂,存储相同数据类型的信息变多了。
数组是一种变量,是一种引用数据类型。是一种容器。可以一次性存储很多的信息。

1、声明数组:数组类型[] 数组名;或数组类型 数组名[];
2、分配空间:数组名 = new 数组类型[空间长度];

1+2、初始化(声明+分配): 数组类型[] 数组名 = new 数组类型[空间长度];(一个数组要么初始化、要么声明数组和分配空间)
3、赋值数组:
(1)静态赋值:
数组类型[] 数组名 = {数组内容};(空间长度等于数组内容的多少)
数组类型[] 数组名 = new int[]{数组内容};
(2)动态赋值:
数组类型[] 数组名 = new int[元素个数];
数组下标从0开始,最大下标为(元素个数-1)
(3)默认赋值:
整型默认为0,double为0.0,boolean为false,String为null
4、使用数组:
数组名[下标];
补充说明
数组类型[下标]—元素
数组的空间长度一旦固定,不可改变,多了浪费,少了报错

使用方法改进万年历项目

1.未加方法的代码

    public static void main(String[] args) {
        System.out.println("enter year");
        Scanner scanner = new Scanner(System.in);
        int year = scanner.nextInt();
        System.out.println("enter month");
        int month = scanner.nextInt();

        int count = 0;
        int sum = 0;

        if (month == 1 || month == 3 || month ==5 || month == 7 || month == 8 || month == 10 || month == 12)
            count += 31;
        else if (month == 4 || month == 6 || month ==9 || month == 11)
            count += 30;
        else {
            if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
                count += 29;
            else
                count += 28;
        }

        for (int i = 1900; i < year; i++){
            if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
                sum += 366;
            else
                sum += 365;
        }

        for (int i = 1; i < month; i++){
            if (i == 1 || i == 3 || i ==5 || i == 7 || i == 8 || i == 10 || i == 12)
                sum += 31;
            else if (i == 4 || i == 6 || i ==9 || i == 11)
                sum += 30;
            else {
                if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
                    sum += 29;
                else
                    sum += 28;
            }
        }

        int wd = (sum + 1) % 7;
        System.out.println("一\t二\t三\t四\t五\t六\t日");
        for (int i = 1; i < wd; i++)
            System.out.print("\t");
        for (int i = 1; i <= count; i++){
            System.out.print(i + "\t");
            if ((sum + i) % 7 == 0)
                System.out.println();
        }
    }

2.改进思路

大家可以发现以下两部分代码有两次重用,我们可以使用方法来减少代码的重用性

		if (month == 1 || month == 3 || month ==5 || month == 7 || month == 8 || month == 10 || month == 12)
            count += 31;
        else if (month == 4 || month == 6 || month ==9 || month == 11)
            count += 30;
        else {
            if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
                count += 29;
            else
                count += 28;
        }
		if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
                count += 29;
            else
                count += 28;

我们可以将这两段代码写为方法,改后的方法如下:

	public static int getPingRunMonth(int year){
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
            return 29;
        else
            return 28;//判断是平年润年在方法调用行加337
    }

    public static int getDaysOfMonth(int month, int year){
        if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
            return 31;
        else if (month == 4 || month == 6 || month == 9 || month == 11)
            return 30;
        else
            return getPingRunMonth(year);
            //count += getPingOrRun(year)?29:28;
    }

2.改进后代码

public class JJY0720 {
    public static void main(String[] args) {
        System.out.println("enter year");
        Scanner scanner = new Scanner(System.in);
        int year = scanner.nextInt();
        System.out.println("enter month");
        int month = scanner.nextInt();

        int count = 0;
        int sum = 0;

        count += getDaysOfMonth(month, year);

        for (int i = 1900; i < year; i++)
            //366 - 29 = 337(润年减二月天数)365 - 28 = 337(屏年减二月天数)
            sum += 337 + getPingRunMonth(i);
            //count += getPingOrRun(year)?366:365;

        for (int i = 1; i < month; i++)
            sum += getDaysOfMonth(i, year);

        int wd = (sum + 1) % 7;
        System.out.println("一\t二\t三\t四\t五\t六\t日");
        for (int i = 1; i < wd; i++)
            System.out.print("\t");
        for (int i = 1; i <= count; i++){
            System.out.print(i + "\t");
            if ((i + sum) % 7 == 0)
                System.out.println();
        }
    }

    /**
     * 定义一个方法,用来判断平润年
     */
    public static int getPingRunMonth(int year){
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
            return 29;
        else
            return 28;//判断是平年润年在方法调用行加337
    }

    public static boolean getPingOrRun(int year){
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
            return true;
        else
            return false;
    }

    public static int getDaysOfMonth(int month, int year){
        if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
            return 31;
        else if (month == 4 || month == 6 || month == 9 || month == 11)
            return 30;
        else
            return getPingRunMonth(year);
            //count += getPingOrRun(year)?29:28;
    }
}

getPingOrRun和getPingRunMonth是不同的方法来实现判断2月是29天还是28天,大家可以挑适合自己的使用


总结

本文讲述了关于方法 的知识,关于数组 的知识,对于万年历进行方法 的改进。关于数组的练习题会在下篇文章给出,敬请期待!

  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值