第二阶段Blog
三次作业所学
经过这三次作业,我对对象与类的应用有了更深度的了解,基本掌握了类的继承,多态与封装,还学会了接口的使用。封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。接口是实现多态的一种重要方法。
第四次作业(7-2)题
本题要求根据所给的类图来设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31],从而实现函数功能。说实话,如果可以只定义一个类DateUtil来实现程序功能的话,是非常简单的。若定义这几个类,从类图上看这几个类之间有聚合的关系,并非是用extends的那种父类与子类的继承,而是一个类的对象做为另一个类的数据成员,让后一个类来调用前一个类的public方法。例如class Month {
private int value;
private Year year;}
class Day {
private int value;
private Month month;
}
等,从而实现方法从类Year—>Month—>Date—>DateUtil一级级的调用。之后就是在各个类中按要求完善方法函数即可。
曾遇到的错误
1.忘了加终止程序的语句System.exit(0);从而导致错误。
2.测试两个日期之间相差的天数必须创建两个DateUtil对象,不然无法完成。
3.在计算两日期差值时,我默认后输入的日期大于前输入的日期导致出错。
4.计算日期差时应使用date = date.getPreviousNDays(1)与 date = date.getNextNDays(1);的方法,也可以计算出日期之间的年份,月份,日期之差,在计算总年份之差,用private static final int[] days = { 0,31,59,90,120,151,181,212,243,273,304,334,365};
这种方法更为抽象,极其容易出错,并且使得程序更复杂,不建议使用。
附图
第五次作业(7-5)题
本题要求与上题一样,如果只需完成程序功能,将上体代码复制粘贴即可。但通过本题与上一题的类图比较,发现本题是用类DateUtil来聚合类Year、Month、Day,而并非上一题的一级级聚合。书写代码时,只需对第四次作业(7-2)题的代码稍加改动即可,例如class DateUtil {
Year year;
Month month;
Day day;
int mon_maxnum[] = {31,28,31,30,31,30,31,31,30,31,30,31};
public DateUtil(){
}
public DateUtil(int y, int m, int d){
this.day = new Day(d);
this.month = new Month(m);
this.year = new Year(y);
}
。
曾遇到的错误
应为我是对7-2的代码直接进行改动,所以我来谈谈在改动中遇到的错误,首先要先将类Year,Date,Month中类的调用等删去,接着要修改方法调用的对象,不然很容易报错。方法的内容中有关于对象的方法的调用的话也需要修改。
附图
题目集4(7-2)、题目集5(7-4)两种日期类聚合设计的优劣比较
很明显,作业7-5的日期类聚合设计更为优异,应为本题 用类DateUtil来聚合类Year、Month、Day,聚合度更高,属于高内聚低耦合型,减少了类内部对其他类的调用,除类DateUtil外的每一个类都能独立的完成自己的功能。而作业7-2的类的一级级的调用更容易出现错误,应为它的每一个模块都无法独立的完成自己的功能,过于依赖模块外部的代码,牵一发而动全身,每一个类都需调用另一个类完成功能。不利于模块的重用与移植。总而言之,我们再写代码的时候最好不要让不同的模块之间有太多的牵连,这样不但会使模块独立性降低,在查找问题时也会更加的困难。
第四次作业(7-3)题
本题要求编写程序,实现图形类的继承,并定义相应类对象并进行测试。根据题目按选择输出的要求,用switch语句比较合适,然后先将类与继承类的框架写出。如
class Shape{
public Shape() {
}
public double getArea() {
return 0.0;
}
}
class Circle extends Shape{
private double radius;
public Circle()
{ }
},然后在子类中重写父类的public double getArea() {
return 0.0;
}方法即可。
曾遇到的错误
- 忘记对父类中方法的重写,出现逻辑错误。
- 应对类Shape中方法返回值设为double,并返回一个double。
附图
第六次作业第五题
题目要求从键盘首先输入三个整型值(例如a b c),分别代表想要创建的Circle、Rectangle及Triangle对象的数量,然后根据图形数量继续输入各对象的属性值。在我看来,本题主要包括正则表达式的基础运用及ArrayList 应用 要求创建的各个图形对象均存储在 ArrayList类型的列表中,可能会用到的方法如下(仅 作提示): add()、addAll()、toArray(),此外,还可能用到 Arrays 类或者 Collections 类。如
String s = input.nextLine();
String []str = s.split(" ");
ArrayList<Shape> list = new ArrayList<Shape>();
int i = Integer.parseInt(str[0]);
int a = Integer.parseInt(str[1]);
int b = Integer.parseInt(str[2]);
for(int j=0;j<i;j++) {
double radius = Double.parseDouble(str[j+3]);
Circle circle = new Circle(radius);
list.add(circle);
}
曾遇到的错误
- 类的声明时曾出现错误,父类与子类间的相互声明出错,导致程序报错。
- 应为链表的原因,创建对象与调用方法的语句很容易写混。要保持细心。
- 排序时用Collection。sort();更为方便。
附图
第六次作业第7-6题
该题目在Main类的主方法中分别定义一个圆类对象及矩形类对象(其属性值由键盘输入),使用接口的引用分别调用圆类对象及矩形类对象的求面积的方法,直接输出两个图形的面积值。(要求只保留两位小数)。本题主要考察接口的调用,据我所知,接口的关键字:interface 接口格式:interface 接口名 { }实现接口的关键字是:implements 表示实现接口的格式:class 类名 implements 接口名 { }接口不能创建对象;接口没有构造方法;因为接口是提供给类使用,当非抽象类去实现一个接口时,必须把接口中所有方法都实现。接口也不能实例化。甚至可以说接口本身就是一个很特殊的类。
例如interface GetArea {
public double getArea(); //计算面积
}
class Circle implements GetArea{
double radius;
public Circle() {}
public Circle(double radius) {
this.radius = radius;
}
public void setRadius(double radius){
this.radius = radius;
}
public double getRadius(){
return this.radius;
}
public double getArea() {
return Math.PI*radius*radius;
}
}
曾遇到的错误
1.忘了加终止语句System.exit(0);。
正则表达式分析总结
import java.util.regex.*
String regex = "[1-9]\\d{4,14}";
Scanner input = new Scanner(System.in);
String str = input.nextLine();
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
if(matcher.matches()) {
System.out.println("你输入的QQ号验证成功");
}
这是最简单的关于正则表达式的使用,正则表达式由字面值字符和特殊符号组成,regex类中的Pattern,Matcher类的调用也是必不可少的,在我看来正则表达式一半的功夫在于能否正确的写出正则表达式的语句,如\d表示一位数字,\w表示单词字符等,注意,括号在正则表达式中是特殊字符,用于对模式分组。为了在正则表达式中表示字面值,必须使用\\
。不能随便放空白符到正则表达式。这些没有捷径,只有实打实的记住才可以,然后在反复的练习。同时正则表达式往往和字符串紧密相连,所以我们还要掌握替换和拆分字符串,我们有split(regex,limit)方法,在此方法中,limit参数确定模式匹配多少次。如果其小于等于0,这该方法等同于split(regex),如果其大于0,模式最多匹配limit-1次。在默认的情况下,所有的量词符都是贪婪的。它们会经可能的匹配多次。我们可以通过在后面添加问号来改变量词符的默认行为。有时正则表达式还会跟列表扯上关系,ArrayList类型的列表中的方法如下: add()、addAll()、toArray(),此外,还可能用到 Arrays 类或者 Collections 类。
题目集5(7-4)中Java集合框架应用的分析总结
本题要求编写程序统计一个输入的Java源码中关键字(区分大小写)出现的次数,其中涉及到了Map集合的运用。Map集合是
将键映射到值的对象。它可以put(K key,V value):添加元素。void clear():移除所有的键值对元素。booleancontainsKey(Object key):判断集合是否包含指定的键
boolean containsValue(Object value):判断集合是否包含指定的值
boolean isEmpty():判断集合是否为空。此外还有获取功能和长度功能。此外还可以获取所有键值对对象的集合
遍历键值对对象的集合,获取到每一个键值对对象
根据键值对对象找键和值。部分代码如下StringBuilder ss=new StringBuilder();
Map<String, Integer> map=new HashMap<String, Integer>();
String []key= { "abstract","assert","boolean","break","byte","case","catch",
"char","class","const","continue","default","do","double","else",
"enum","extends","false","final","finally","float",
"for","goto","if","implements","import","instanceof",
"int","interface","long","native","new","null","package",
"private","protected","public","return","short","static",
"strictfp","super","switch","synchronized","this","throw",
"throws","transient","true","try","void","volatile","while"
};
总结
经过这三次作业,我深深的了解到我对于java语言的学习不过刚刚起步,首先是我做作业的时长问题,毫不夸张的说每一道题都是我几乎花一天的时间慢慢磨出来的,每次我机会都是直接先写代码,在根据报错不断改进,代码的框架是在不断的改正中摸索出来的。这显然并非一个好习惯,也反映出我的基础知识并不扎实诉讼费是似是非是,一知半解,可以写,但不太清楚为什么这么写,这是我的缺陷,尤其在遇上难题,如那正则表达式的题目时,这一点表现的淋漓尽致。同时,我对现在动辄几百行的代码有了恐惧之心,不得不说,我对代码一步步化简的能力有待提升,或者说,有时我完成了两个不同的功能,但当我想将这两个功能整合到一起时就会报错,很显然,说来说去还是知识点没有记牢,所以我需要夯实Java学习的基础,同时在多进行逻辑思考,希望有一天能快速的写出正确而简洁的代码。

浙公网安备 33010602011771号