学Java有感(二)

一.前言

又过去了三周,我完成了老师布置了三次PTAjava作业,再来谈谈这三次作业的感受。

二.作业过程

在这三周的学习中,我们具体学了类的三点特性:封装,继承和多态。在第一周的作业中,具体应用了类的继承。先来简单谈谈类的继承,它的主要目的是为了使用继承可以减少代码的冗余。

具体格式如下:

[public] class SubClass extends SuperClass{
  //类体的定义}
它有几点注意事项

1.子类继承父类中非private的成员变量和成员方法,同时,注意构造方法不能被子类继承。

2.定义类时若缺省extends关键字,则所定义的类为java.lang.Object类的直接子类。

3.单根继承原则:每个类只能继承一个类

举个例子

class Shape{

Shape(){
System.out.println("Constructing Shape");
}
public double getArea(){
return 0.0;
}
}
class Circle extends Shape{
private double radius;
Circle(){
System.out.println("Constructing Circle");
}
public Circle(double radius){
super();
System.out.println("Constructing Circle");
this.radius=radius;
}

在上面的代码中,我们首先新建了Shap类,并在里面构造了一个无参的构造方法Shape(),而在Shape类的下面,我们构造了一个新类Circle,其中在他的类名字后面,我加了一个单词extends,这个就表示Circle类继承于Shape。子类Circle继承Shape类所有的属性和方法(但不包括private成员)。

再来说说第二次作业,第二次作业主要是运用了类的多态,什么是多态,在我的理解看来,多态就是在子类中重写父类的方法(注意是重写不是重载)。

讲到这里,我们就来区分一下重写和重载

重写

重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。

举例如下

abstract class Shape{

public abstract double getArea();
public abstract boolean validate();

}
class Circle extends Shape{
private double radius;
Circle(){
super();
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public double getArea(){
return Math.PI*getRadius()*getRadius();
}
public boolean validate(){
if(radius<=0){
return true;
}
return false;
}
}

在上面代码中,我们先找到父类Shape,在其中,我们新建了两个方法但是方法中并没有具体内容,再来看子类Circle。它的里面我们会发现有两个方法名字和父类的一样,不同的是子类中的方法有具体内容,而父类中的没有。这就叫做重写。

重载

重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。

每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表

举个例子

public String test(int a,String s){

System.out.println("test3"); return "returntest3"; }

public String test(String s,int a){

System.out.println("test4"); return "returntest4"; }

这里有两个方法名相同的的方法,但是方法里面的的参数调换了位置,这就叫做重载。

总的来说,第二次的作业有点难度,学了很久才学会。

最后我们来说一说第三次作业,第三次作业可谓是类这里的集成,它覆盖类的三大特性的全部,比较困难。还引出了一个新的知识点:抽象类。

抽象类

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。

由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。

父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。

在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。

举个例子

abstract class Shape{
private String name;
public Shape(){
}
public Shape(String name){
this.name=name;
}

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract double getArea();
public abstract boolean validate();
public String toString() {
return String.format("%.2f", getArea())+" ";
}
}
class Circle extends Shape{
private double radius;
Circle(){
super();
}
public Circle(double radius) {
super();
this.radius=radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public double getArea(){
return Math.PI*getRadius()*getRadius();
}
public boolean validate(){
if(radius<=0){
return false;
}
return true;
}
}

由此代码可以看出,我们新建了一个抽象类(abstract)Shape,并且在里面有两个抽象方法getArea和validate,在它的子类Circle中,实现了父类的所有抽象方法。这就是抽象类。

总的来说,这三次作业难度明显高于上三次作业,并且我们学的的知识也更加的多了,解决一道题,不再说抬手直接写,需要你自己分析题目中所给出的类图,分析每一个方法它的作用是什么,平均做完每次作业花费的时间在2-3天,甚至有的题太难而完不成。

三.OO设计心得

开闭原则

开闭原则的英文全称是Open-Close Principle, 简称OCP。

这里所说的软件实体包括:项目中按照一定逻辑规则划分的模块、类、抽象类以及方法。

开放封闭有两个含义,一个是对于拓展是开放的,另一个是对于修改是封闭的。一个软件在生命周期内总要面对需求的变化,那么对于开发者来说怎么处理变化的需求,在实际当中往往是新需求一来,我们就要把类重新改一遍, 这显然是令人头疼的。开闭原则告诉我们的是,尽量通过扩展软件的实体来实现变化,而不是通过修改已有的代码来完成变化。 可以说开闭原则是对软件实体的未来变化的一种约束性的原则。(采于网络)
单一职责

单一职责按照我的理解是一对一,每个类都有它自己所要实现的方法,每个方法都有它自己的作用,它们一个面对一个,使整个工作变得更加的有条不紊,便捷高效。

四.测试的理解

对于程序设计来说,测试当然是十分重要的一环。一个完美的代码,应该满足用户所提出的各种问题,并且高效,快速的完成。

对于Junit来测试代码是可行的。

五.课程建议

建议老师布置的题量可以少一点,难度增大。通过做一道难题融会贯通。

猜你喜欢

转载自www.cnblogs.com/77bb/p/12814475.html