面向对象先修:Java入门

时间:2021-12-05 17:23:10

16061201张进

学习总结

在C语言和数据结构的基础上,在上暑期的面向对象Java先修课程时,熟悉语言的速度明显加快了很多。Java和C在很多基础语法上非常相似,比如基本的数据类型,循环以及条件分支语句,数组的遍历等。但是两者在思想上是截然不同的,C是面向过程性的:一般操作步骤将问题分解为连续的小问题,然后使用函数逐步实现,数据在函数之间想换传递,坏处是数据很多时候是公有的,很多函数都有改变某个数据的能力,当一旦出现关于数据的bug的时候,难以确定是哪一个部分导致数据出错,而面向对象的Java语言的封装性则能够应对这种问题,在Java中,数据一般是类的私有类型,一般声明方式;

    private 数据类型 变量名称
//example
private double scale;

而如果要访问一个类的数据时,常常是依靠类中的方法

    public double getScale()
{
return this.scale;
//this引用类中成员变量scale;
}

要修改成员变量时则建立一个新的方法。
在利用C语言基础入门以后,开始了解Java语言中新的特性(继承、对象、类、接口)。个人认为类的概念是广义的集合,包含一些数据类型的变量以及方法,数学中集合的概念是相同性质的元素在一起的团体,所以可以将类看成具有相同成员变量和方法的对象的集合,由此引出了面向对象编程的概念。“类”是整体的抽象,而个体是实例,两者关系如同“人类”和某个具体的人。Java中使用“.”调用对象的方法。Java语言提供了丰富的库,在使用时可以依据API(应用程序接口)查询类中的方法,比如在官方关于String的总结中对于各种方法的作用以及返回值描述非常清楚。在很多过程中直接调用已经写好的方法而不用自己重写,如ArrayList类中的sort方法就是优化后的快速排序。
在类中一般会有构造器(constructor),构造器和类同名,构造器没有返回值(不同于一般的方法),在使用new调用构造器时会将实例域中初始化(需要传入参数)

第一次作业主要涉及的是使用类和对象,初步使用继承,熟悉了测试数据的使用

public class NewCharSet extends CharSet{
private int times=0;
public NewCharSet(char[] charSet){
super(charSet);
times++;
}
public int getServiceTimes()
{
this.times++;
return times;
}
}

继承是Java的三大特性之一,在编写相同性质的代码时使用继承能够避免重复代码(重复代码维护性不高,在修改的时候需要修改很多代码,容易出错)。在继承中子类能够拥有父类非private的代码,并且能有自己的属性和方法(概念类似于生物学中的继承)。
在第二次课堂上学习了Java的接口(Interface),涉及关键词interface以及implements,接口就是整合不同类型相同功能方法的工具。

public interface Geometry {
public double getVolume();
public String toString();
}

实现接口类的声明:

public class Box implements Geometry{...}

在第二次作业中将字符串集合和字符集合中相同的方法构造到了一个接口中,实际实践中发现类的种类少并且概念差别大时使用接口不一定能简化程序。
在接口使用中注意Interface中方法形式参数的类型

//接口基本功能
public void myToString(Object s);//打印字符/字符串集合
public void mySort();//对于字符/字符串进行排序
public boolean myFind(Object alpha);//判断一个字符/字符串是否在字符集合/字符串集合中
public int subSet(Object set);//判断一个字符集合/字符串集合是否是另外一个几何的子集

如果形参类型不同,则使用类Object(所有类的超类)

第三次以及第四次作业则涉及到文件操作、正则表达式的使用、HashMap以及hashcode以及Map映射。
文本读取两种方法:

  • 使用scanner读取文本中的内容
//导入对应的包
import java.util.Scanner;
import java.io.File;
//以文件路径为参数创建File类对象,在以此为参数创建Scanner的in对象
//Scanner是Java中读取键盘输入和文件的流的一个类
Scanner in = new Scanner(new File("in.txt"));
while(true)
{
//...
//hasNextLine方法判断文件是否读到末尾,是则返回false
if(in.hasNextLine==false)
break;
}
  • 使用BufferedReader
//import java.io.BufferedReader;
BufferedReader br = new BufferedReader(new File("in.txt"));
//br.readLine()方法读取文件的中的一行

在进行单词分割的时候使用正则表达式

    //将数字和字母分割出来:特别注意分割产生的空字符串
String [] wordArrTemp = readline.split("[^0-9A-Za-z]+");

将单词和频数分别存储到两个数组中是C语言中比较容易实现的算法,但是Java中有一个构造好的Map映射类

    //map.get(Key) = value,取对应Key的Value值,如果不存在则返回null
//map.put(Key,Value),将对应的Key和Value值存入映射中

在对于映射进行遍历的时候可以使用迭代:

Iterator

1.Iterator(迭代器)可以简单理解为遍历
2.Iterator 是java中的接口,有三种方法:hasNext()迭代器中是否有下一个元素,next()返回迭代器中的下一个元素,remove()

    Iterator iterator  = list.iterator();
//iterator是一个对象,list中的iterator是关于list的一个方法
while(iterator.hasNext())
{
//list中存储的是字符串
String string = iterator.next();
//do something
}

第四次作业:最开始我使用的是String[]类来存储二元短语,但是在使用hashmap的时候发现对于两个数组,即使数组中存储的内容完全一样,但是还是作为两个不同的对象,所以不能判断内容相同的数组是相同的Key。之后重写了String数组类,重写了hashCode和equals方法,了解了Override的使用。

其他细节

入门过程中相关的资料

  1. 编程问答网站:*、CSDN
  2. 搜索引擎:Google
  3. 书籍:《Java核心编程卷一》

课程内容

面向对象三门课程介绍,java简介,Java基础语法,类和对象,Java特性:继承和封装,使用接口,Java编程效率(方法调用和类的使用),简单debug,计算程序运行时间,Map映射等。

教学评价

  1. 面向对象先修课程再课堂上教学的内容比较少,主要知识点是从课堂例题和课后自学得来。而网络上和各种Java学习书籍资源非常丰富,往往在短时间内无从下手,如果老师或是助教在已经学完了面向对象的基础上能够推荐一些优秀的入门书籍或是网络上的资源则对于入门新手可能会有帮助。另外在学习的过程中发现*是一个非常好的编程解疑网站。
  2. 在进行课后练习的时候,助教发布的GuideBook在某些细节上经常存在二义性,而二义性在编程中是应该尽量避免的,所以导致很多同学刚写完程序,新发布的文档思路又发生了改变,又需要修改或是重写。个人认为不应该在理解文档这个方面提高课程难度,课后直接发布最终版更好。