Week03-Java学习笔记第三次作业
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 |
Week03-Java学习笔记第三次作业的更多相关文章
- 2019暑假Java学习笔记(三)
目录 面向对象 对象 构造方法 引用与对象实例 static final 封装 this 继承 super 方法重载与重写 多态 抽象类 接口 内部类 成员内部类 静态内部类 局部内部类 匿名内部类 ...
- Java学习笔记(三)——静态导入,package-info,Fall-through
[前面的话] 算是真正的放松了好几天时间,没有看任何书,没有任何任务,今天是过完年后的第一天上班时间,我又开始了我的学习之路,感觉还没有老,怎么心态越来越平静了,进入工作状态,就好好努力工作,新的一年 ...
- Java 学习笔记 ------第三章 基础语法
本章学习目标: 认识类型与变量 学习运算符的基本使用 了解类型转换细节 运用基本流程语法 一.类型(基本类型) 所谓基本类型,就是在使用时,得考虑一下数据用多少内存长度存比较经济,利用程序语法告诉JV ...
- Java学习笔记(三)
今天主要学习了ant ant概述 ant是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发.在实际软件开发中,有很多地方可以用到ant 开发环境: Sy ...
- java学习笔记(三)字符串
字符串String 创建方法: 一·通过new创建 String str1= new String("abc"); 二 直接创建 String str2="abc ...
- Java学习笔记(三)Java2D组件
一 概述 Java2D的一切都基于java.awt包中的Graphics2D类,它是Graphics的子类. 为了绘制图形,需要使用面板作为画布,例如使用JPanel作为画布,面板有一个paintC ...
- Java学习笔记(三)——封装、继承、多态
一.封装 概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 实现步骤: 修改属性的可见性——设为private. 创建getter/se ...
- Java学习笔记一:三步搭建Java开发环境
Java开发环境搭建 一:安装JDK: 1.下载地址:http://www.oracle.com/technetwork/java/javase/downloads 非常显眼的下载界面 2.点击下载后 ...
- JAVA学习笔记——(三)
今日内容介绍 1.引用类型变量的创建及使用 2.流程控制语句之选择语句 3.流程控制语句之循环语句 4.循环高级 01创建引用类型变量公式 * A: 创建引用类型变量公式 * a: 我们要学的Scan ...
随机推荐
- Pimpl Idiom /handle body idiom
在读<Effective C++>和项目源代码时,看到pImpl Idiom.它可以用来降低文件间的编译依赖关系,通过把一个Class分成两个Class,一个只提供接口,另一个负责实现该接 ...
- Django总结及Form组件
一.model常用操作 1.13个API查询:all,filter,get ,values,values_list,distinct,order_by ,reverse , exclude(排除),c ...
- windows8系统安装MongoDB 2.6.3配置服务启动
转自:http://winfan.net/655.html 1. 下载mongodb包2. 解压zip至 D:\MongoDB3. 创建目录 D:\MongoDB\data\db4. 创建日志目录 D ...
- HDOJ_1087_Super Jumping! Jumping! Jumping! 【DP】
HDOJ_1087_Super Jumping! Jumping! Jumping! [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- linux中相关服务不能访问的排错技巧
Linux相关服务不能访问的排错步骤,以HTTP服务为例: 一.服务端排查思路: 1.检查SELinux是否关闭(针对CentOS6系统) (1)临时关闭 setenforce 0 (2 ...
- javascript DOM dindow.docunment对象
一.找到元素: docunment.getElementById("id"):根据id找,最多找一个: var a =docunment.getElementById(&qu ...
- HashMap与ConcurrentHashMap、HashTable
(1)HashMap的线程不安全原因一:死循环 原因在于HashMap在多线程情况下,执行resize()进行扩容时容易造成死循环. 扩容思路为它要创建一个大小为原来两倍的数组,保证新的容量仍为2的N ...
- SpringBoot MockMVC
使用MockMvc,我们可以完成基于RESTful风格的SpringMVC的测试,我们可以测试完整的Spring MVC流程,即从URL请求到控制器处理,再到视图渲染都可以测试. @RunWith(S ...
- 谈谈对Canal(增量数据订阅与消费)的理解
概述 canal是阿里巴巴旗下的一款开源项目,纯Java开发.基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了mysql(也支持mariaDB). 起源:早期,阿里巴巴B2B公司 ...
- Java中遍历map的四种方法 - 转载
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...