201521123077 《Java程序设计》第3周学习总结

时间:2022-08-01 08:16:16

1. 本周学习总结

201521123077 《Java程序设计》第3周学习总结

201521123077 《Java程序设计》第3周学习总结

2. 书面作业

Q1.代码阅读

public class Test1 {
private int i = 1;//这行不能修改
private static int j = 2; public static void main(String[] args) {
geti();
Test1getj();
} public static void geti() {
System.out.println(i);
} public static void getj() {
System.out.println(j);
} }

Q:以上代码可否编译通过?哪里会出错?为什么?尝试改正?

如果创建3个Test1对象,有内存中有几个i,几个j?请分析原因?

A:以上代码不可以编译通过,在main方法中输出i的值的时候会出错,因为i是成员变量,即实例变量,是要有实例生成的时候才可以用的。改正如下: 201521123077 《Java程序设计》第3周学习总结

如果创建了3个Test1对象,内存中会有三个i,而却只有一个j,因为j是一个类变量,它是与类相对应的而不是类的实例相对应,同一个类实例化生成的多个对象也只会有一个共同的类变量。

Q2.构造函数有什么用?其编写格式是什么?如果一个类不写构造函数,它有构造函数吗?如果一个类中只有带参的构造函数,它有没有不带参数的默认构造函数?

构造函数用来初始化一个类的对象。

编写格式是:

1.方法名要与类名严格一致 2.它没有返回值,也不能用void来修饰

因为在语言使用者编写自己的类时,在类的内部,方法可能被命名为任意名字,故所有名字都是不安全的,于是java选择延续了这种机制,即限定构造器为与类名同名的无返回类型说明的特殊方法。

当一个类没有编写任何构造方法的时候,java语言会自动为其添加一个默认的无参构造器,只要在类中编写了一个构造方法,就不会再生成无参构造器。

Q3.使用java.lang.Math类的函数时,为什么不需要new?如果new Math()会产生什么错误?分析原因?

因为Math类的所有方法和变量都是static修饰的,所以我们使用的时候无需实例化对象。

如果尝试实例化对象就会看到ide的提示:Math的构造器不可见

因为开发者将Math的构造器用private修饰了,限定了在类的外部无法调用,也没有在源文件中找到例如利用某个public static方法内部引用构造器的“单例”用法,所以我们无法实例化一个Math类。

Math类开发者注释:Don't let anyone instantiate this class.=-=

Q4.什么是重载?什么是构造函数重载?在java.lang.Math类中举出1个函数重载的例子?怎么才能区分两个重载函数?

方法重载就是通过对同名的一组方法设计不同的参数类型从而让它们能够通过传进来的参数的类型不同而自动选择执行的具体方法的实用技巧,在使用者看来仿佛是一个方法“智能”地针对不同的情况表现出了不同的行为。

构造函数同理,即这组方法都是参数类型不同的构造方法

abs函数文档:

201521123077 《Java程序设计》第3周学习总结

abs函数测试

201521123077 《Java程序设计》第3周学习总结

可以看到,同一个名字的方法,由于传入参数类型的不同表现出了不同的处理行为。

区分两个不同的重载函数只能通过参数类型而不是返回类型。

Q5.final修饰的变量不能改变,为什么如下代码可以正常运行?

final int[] NUMBS= {1,2,3,4,5};
NUMBS[2] = 1;

final作用于类变量的时候,不能改变的是引用,类似指针一样的概念,不变的是指针的指向,而不是指针指向的内容,而数组算是一种特殊的类。

Q6.阅读代码EmployeeTest.java,回答:

1.为什么其属性均为private?这样设计有什么好处?
2.为Employee类增加一个无参构造函数,调用其有参构造函数,设置name为雇员1, salary为3000, hireDay的年月日为2017年3月5日。(粘贴代码)
3.为Employee类再增加一个有参构造函数,参数只有name与salary,hideDay为当前日期。(粘贴代码)

1.防止雇员的信息被轻易修改

2.代码如下

public Employee()
{
//雇员1, salary为3000, hireDay的年月日为2017年3月5日。
this("雇员1", 3000.0, 2017, 3, 5);
}

3 .代码如下

public Employee(String n, double s) {
name = n;
salary = s;
Calendar calendar = Calendar.getInstance();
hireDay = calendar.getTime();
}

Q7.编写函数public static boolean isMondayToFriday()

功能:判断今天如果是周一到周五,直接输出如“上班时间”并返回true,否则输出“休息时间”。

提示:使用LocalDateTime, DayOfWeek

public static boolean isMondayToFriday()
{
LocalDateTime now = LocalDateTime.now();
DayOfWeek dayOfWeek = now.getDayOfWeek();
System.out.println(dayOfWeek);
if(dayOfWeek!=DayOfWeek.SATURDAY && dayOfWeek!=DayOfWeek.SUNDAY)
{
System.out.println("上班时间");
return true;
}
System.out.println("休息时间");
return false;
}

3. PTA实验总结及码云上代码提交记录

3.1本周Commit历史截图

201521123077 《Java程序设计》第3周学习总结

3.2 实验总结

第一题:

 IDE的自动生成功能很方便,可以节省很多时间

第二题:

合理使用初始化块和静态块可以实现很多重复性工作,还可以做到类似赋予实例对象唯一ID之类的功能

第三题:

toString方法是基类Object的方法,重写该方法可以让我们输出时自动转换为设定的形式      

多态思想可以让我们写出适应多个互相联系的类的通用方法,极大地提高了程序灵活性和效率