Week03-面向对象入门
1.本周学习总结
初学面向对象,会学习到很多碎片化的概念与知识。尝试学会使用思维导图将这些碎片化的概念、知识点组织起来。请使用工具画出本周学习到的知识点及知识点之间的联系。步骤如下:
1.1 写出你认为本周学习中比较重要的知识点关键词
答:本周学习的知识点:类管理机制-包、完全限定名、类路径、类与对象、封装性修饰符(public、private、无修饰符)
- 学习如何在指定目录下加载相应的.claas文件,在不同的目录下甚至在.jar文件中加载.class文件。(-cp参数)。
- 如何定义一个类(类名,属性,方法),创建对象。变量中存放对象的引用,使用这个引用可以调用对象的属性和方法。
1.2 用思维导图或者Onenote或其他工具将这些关键词组织起来。
2.书面作业
1.以面向对象方式改造数据结构作业'有理数'(重点)
1.1 截图你主要代码(需要在程序中出现你的学号和姓名)并粘贴程序的git地址。
git地址:https://gitee.com/jmu201621123003/JavaLearn.git
代码主要截图:
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)。在此次解题中,队友给我的帮助比较多,很多是我再询问,很惭愧。很感谢我的队友。
-照片:
3. 码云及PTA
3.1. 码云代码提交记录
在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
3.2 截图PTA题集完成情况图
需要有两张图(1. 排名图。2.PTA提交列表图)
- 提交列表
- 排名表
3.3 统计本周完成的代码量
周次 | 总代码量 | 新增代码量 | 总文件数 | 新增文件数 |
---|---|---|---|---|
3 | 446 | 308 | 8 | 4 |