系列文章目录
第一章 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天,大家可以挑适合自己的使用
总结
本文讲述了关于方法 的知识,关于数组 的知识,对于万年历进行方法 的改进。关于数组的练习题会在下篇文章给出,敬请期待!