Week03-Java学习笔记第三次作业

时间:2024-01-15 17:02:56

Week03-面向对象入门

1.本周学习总结

初学面向对象,会学习到很多碎片化的概念与知识。尝试学会使用思维导图将这些碎片化的概念、知识点组织起来。请使用工具画出本周学习到的知识点及知识点之间的联系。步骤如下:

1.1 写出你认为本周学习中比较重要的知识点关键词

答:本周学习的知识点:类管理机制-包、完全限定名、类路径、类与对象、封装性修饰符(public、private、无修饰符)

  • 学习如何在指定目录下加载相应的.claas文件,在不同的目录下甚至在.jar文件中加载.class文件。(-cp参数)。
  • 如何定义一个类(类名,属性,方法),创建对象。变量中存放对象的引用,使用这个引用可以调用对象的属性和方法。

    1.2 用思维导图或者Onenote或其他工具将这些关键词组织起来。

    Week03-Java学习笔记第三次作业

2.书面作业

1.以面向对象方式改造数据结构作业'有理数'(重点)

1.1 截图你主要代码(需要在程序中出现你的学号和姓名)并粘贴程序的git地址。

git地址:https://gitee.com/jmu201621123003/JavaLearn.git

代码主要截图:

Week03-Java学习笔记第三次作业

Week03-Java学习笔记第三次作业

Week03-Java学习笔记第三次作业

Week03-Java学习笔记第三次作业

1.2 对比你的代码与历程的代码,说明面向对象编程与面向过程编程有何区别?

答:

  • 面向过程编程:主要组成有函数和main函数,函数用来实现各个功能。
  • 面向对象编程:主要考虑类的设计和对象,对象是重要点。

2.构造函数与初始化块

2.1 结合PTA 5(构造函数与toString)说明构造函数有什么用?其函数格式有何特征?

答:

1、 构造函数可以对定义的类进行初始化操作,可以对类的各个属性进行初始化。

2、 函数格式可以分为有参和无参两种形式。而构造函数的特点是:函数名与类名相同,且函数没有返回类型(注意:无返回但不是void).

如:Person无参构造函数为

	public Person()
{
System.out.println("This is constructor");
System.out.printf("%s,%d,%s,%d%n", name,age,gender,id);
}

与Person有参构造函数

public Person(String name,int age, boolean gender) {
this.name = name;
this.gender = gender;
this.age = age; }

**2.2 如果一个类不写构造函数,它有构造函数吗?如果一个类中只有带参的构造函数,它有没有不带参数的默认构造函数? **

答:类不定义构造函数时,系统会默认有一个无参构造方法。当类中有带参构造函数时它不存在无参的构造函数,这时需要自己定义一个无参的显示构造函数。否则编译会报错。

2.3 查看String类的源代码,找出3个看得懂的String类的构造函数,并使用自己的话描述这3个构造函数的区别。

答:

  • String() 创建一个空的字符串对象。
public String() {
this.value = new char[0];
}
  • String(char[] value) 用一个字符数组来创建一个String对象
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
  • String(byte[] bytes,int offset,int length)通过byte数组,从offset开始,总共length长的字节构造字符串对象
private static void checkBounds(byte[] bytes, int offset, int length) {
if (length < 0)
throw new StringIndexOutOfBoundsException(length);
if (offset < 0)
throw new StringIndexOutOfBoundsException(offset);
if (offset > bytes.length - length)
throw new StringIndexOutOfBoundsException(offset + length);
}

区别:String()与另外两个相比,没有传入参数。

2.4 结合PTA(构造函数与初始化块)说明初始化块与构造函数的异同。并说明,初始化块与构造函数谁先执行?初始化块与静态初始化块有何不同,谁先执行?

答:在PTA(构造函数与初始化块)题中

1、先执行静态初始化块(由static修饰)

 static{
System.out.println("This is static initialization block");
}

2、 在执行初始化块(无修饰符)

{   id=cout;
System.out.printf("This is initialization block, id is %d%n",id);
cout++;
}

3、 最后执行构造函数

public Person()
{
System.out.println("This is constructor");
System.out.printf("%s,%d,%s,%d%n", name,age,gender,id);
}

最后执行结果为:

This is static initialization block

This is initialization block, id is 0

This is initialization block, id is 1

This is initialization block, id is 2

Person [name=c, age=10, gender=false, id=2]

Person [name=b, age=12, gender=true, id=1]

Person [name=a, age=11, gender=false, id=0]

异同:静态初始化块和静态变量都加载到系统的过程中,静态初始化块只执行一次,执行在类的第一次使用时,而有一个对象就执行一次构造函数和初始化块(无修饰符)。

3.代码分析:Math类

3.1 使用java.lang.Math类的方法时,为什么不需要new出一个Math对象,然后调用该对象上相应的方法?

答:Math类是jdk提供的工具类(但不是静态类),其构造器私有化,就无法创建对象。如下源代码

 public final class Math {
/**
* Don't let anyone instantiate this class.
*/
private Math() {}

Math类中的方法都是静态方法(都定义为static)。静态方法在累加载时已经申明,不参与对象实例化过程,与对象创建无关。

3.2 如果new Math()会产生什么错误?尝试阅读Math类源代码,分析原因。

答:编译器会一直报错, Math cannot be resolved to a variable。Math类中的方法都是静态方法(都定义为static)。

一个方法是静态的,它就属于整个类,可以通过类型直接引用,即通过类名.方法直接访问,无需new。(参考百度知道)。

如Math类中的方法

public static final double PI = 3.14159265358979323846;

public static double sin(double a) { return StrictMath.sin(a); }

3.3 进一步:你觉得什么样的对象需要new出来才能用,调用什么方法时不必创建相应对象就可以使用?

答:当一个方法没有被定义为static时,就需要new一个使用对象来调用该方法。当方法声明为static时就可以不用创建相应的对象。

4.重载Overload

4.1 什么是重载?什么是构造函数重载?怎么才能区分两个重载的方法?

答:

  • 重载:在同一个类中,方法名或函数名相同,但参数类型不同或参数数量不同、参数顺序不同。
  • 构造函数重载:在同一个类中,有多个同名但参数类型、数量不同的构造函数。
  • 区分:当一个重载的方法被调用时,Java 在调用方法的参数和方法的自变量之间寻找匹配。在一些情况下,Java 的自动类型转换也适用于重载方法的自变量。构造函数使用时通过new来调用。(参考JAVA 方法重载和构造函数重载 )

4.2 在java.lang.Math类中举出1个方法重载的例子?

答:如

 public static int round(float a) {
if (a != 0x1.fffffep-2f) // greatest float value less than 0.5
return (int)floor(a + 0.5f);
else
return 0;
}
public static long round(double a) {
if (a != 0x1.fffffffffffffp-2) // greatest double value less than 0.5
return (long)floor(a + 0.5d);
else
return 0;
}

以上两个函数返回类型和参数类型不同,但函数名相同。

5. 代码阅读: final

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

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

答:

  • final基本语法:

    对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
  • 但引用变量(即地址)被final修饰之后,虽然不能再指向其他对象,但是它指向的对象的内容是可变的。

6. Java8中的时间日期类:编写函数public static boolean isMondayToFriday()

功能:判断今天如果是周一到周五,返回true,返回false。main函数中调用该函数,如果为true则输出“工作日+姓名学号”,否则输出"休息+姓名学号"。

截图:关键代码。

提示:使用LocalDateTime, DayOfWeek类

答:没来得及打,后续会亲自去编写....

7.封装

7.1 结合PTA(形状),请用自己的话简单总结一下面向对象中封装是什么意思?有何好处?

答:

  • 封装就是将类的属性设置为私有化,但类中的方法可以被公有调用访问私有属性。将类的属性用private修饰。
  • 好处:

    (1) 隐藏类的实现细节;

    (2) 让使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制

    逻辑,限制对属性的不合理操作;

    (3) 便于修改,增强代码的可维护性;

    (引用百度)

7.2 和封装有关的关键字有哪些?

答:private、public、protected。

8. 结对编程实践(未完成,0分)

答:

  • 结对对象:周文华
  • 题目:构造函数与初始化块
  • 感想:在这题中,我们仍延续上次的方式,先各自进行尝试,有问题再互相讨论。在该题中,虽有提示使用static关键字,但我仍然有些摸不着头脑,对于id的初始化和后续不同对象的不同id如何变化还是很困惑。通过和队友的讨论,互相学习,我知道了static的具体用法。我的解法是:先在Person类中定义一个static的基本int型的变量cou。在实例化初始块中将static变量cout的值赋给id,再对cout进行加加操作,使得每个person对象在调用时,都能再次加载实例化初始块,从而使得cout的值能完成加一操作。(在此过程中,仍出现第一次id为1,但打印每个对象时,每个对象的id却都为1)。在此次解题中,队友给我的帮助比较多,很多是我再询问,很惭愧。很感谢我的队友。

    -照片:Week03-Java学习笔记第三次作业

3. 码云及PTA

3.1. 码云代码提交记录

在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图


Week03-Java学习笔记第三次作业

3.2 截图PTA题集完成情况图

需要有两张图(1. 排名图。2.PTA提交列表图)

  • 提交列表

    Week03-Java学习笔记第三次作业
  • 排名表

    Week03-Java学习笔记第三次作业

3.3 统计本周完成的代码量

周次 总代码量 新增代码量 总文件数 新增文件数
3 446 308 8 4