学Java有感(一)

 一.前言

  近几周来,我学习了Java的有关课程,并完成了老师布置的3次课后习题。对于这三次作业的情况,我想谈谈我的看法。

二.作业过程

第一周作业主要是Java的简单应用,参数的输入输出,MATH函数的运用,循环语句,判断语句等一些基础的知识,特别的像C语言,给我一种换了一个编译器的感觉。还有三个特别概念的应用:类,对象,方法(函数)。具体介绍我会在下面的内容写出来。总的来说,这周的作业就是一些简单的练习,为了熟悉Java这种新语言。

而第二周的作业就有所不同,具体点,就是对象和方法的应用,题目会给出几个参数并有数值上的限制,还会要求你写几种方法,各种方法的调用共同完成这题目的要求。第二次作业的难度也有所提高,不只是简单的看题目的结果,而是需要你自己想方法设计这个程序,运用你所学的知识,分析各种可能的情况来解决问题。

举个列子来说

eg:输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法。

要求:Main类中必须含有如下方法,签名如下:

public static void main(String[] args);//主方法 
public static boolean isLeapYear(int year) ;//判断year是否为闰年,返回boolean类型 
public static boolean checkInputValidity(int year,int month,int day);//判断输入日期是否合法,返回布尔值
public static void nextDate(int year,int month,int day) ; //求输入日期的下一天

对于这道题,通过审题,我们可以知道需要有三个数据的输入:年,月,日。并且这三个数据都是int型,也有各自的合法范围。而这道题的难点在于如何就你所输年月日的下一天。在这里你需要考虑很多,比如满日进月,满月进年,闰年,闰月等等。这个题目还有特殊的要求,也算是一种提示。编写不同的方法,通过之间的调用来完成。对于如何求改日期的下一天,我用的方法比较复杂,我是把所有的情况都考虑进去,运用if,else if,else等语句解决了问题。(当然还有更简单的方法)

我的部分代码如下

public static void nextDate(int year,int month,int day){
    if(month==12&&day==31){
        year=year+1;
        month=1;
        day=1;
        }
    else if(month==2&&day==28){
        if(isLeapYear(year)){
            day=29;
            }
        else{
            month=3;
            day=1;
        }
        }
    else if((month==1&&day==31)||(month==2&&day==29)||(month==3&&day==31)||(month==4&&day==30)||(month==5&&day==31)||(month==6&&day==30)||(month==7&&day==31)||(month==8&&day==31)||(month==9&&day==30||month==10&&day==31)||(month==11&&day==30)){
        month=month+1;
        day=1;
    }
    else{
        day=day+1;
    }
    System.out.print("Next date is:"+year+"-"+month+"-"+day);
}
}
通过完成这次的作业,我对类,对象,方法的理解更深了。
再来说说第三周,第三周的作业给我最大的感觉就是Java博大精深!就我的理解来说,第一种就是熟悉,第二周是类里面方法的运用,而第三周就是类之间的运用。还有一种新概念的运用:uml图。关于uml图的介绍,大家可以自行百度。按照我的理解,就是运用表格这种简单明了的方式,把类,对象,方法这三种元素以及它们的公开,私有等属性来表示出来,方便别人去理解你的程序。
关于uml图我来举个列子

这个图里面的-,+还有个#是用来表示该属性或方法的可见性的。具体来说

-:表示private 私有属性;

+:表示public 公共属性;

#:表示protected(friendly)中等;

这个表格就表示Employee类里三个私有的对象和一个公有的方法。

再回到第三次作业,同样的,我也举个例子:

 

定义一个代表一元二次方程ax2​​+bx+c=0的类QuadraticEquation,其属性为三个系数a、b、c(均为私有属性),类中定义的方法参考main方法中的代码。main方法源码:

 

import java.util.Scanner;

public class Main {
	public static void main(String[] args){
		Scanner input = new Scanner(System.in);

	    double a = Double.parseDouble(input.next());
	    double b = Double.parseDouble(input.next());
	    double c = Double.parseDouble(input.next());
	    
	    if(a == 0){
	    	System.out.println("Wrong Format");
	    	System.exit(0);
	    }
	    
	    //create a QuadraticEquation object
	    QuadraticEquation equation = new QuadraticEquation(a, b, c);
	    //get value of b * b - 4 * a * c
	    double discriminant = equation.getDiscriminant();
	    
	    System.out.println("a=" + equation.getA() +
	    		",b=" + equation.getB() + 
	    		",c=" + equation.getC()+":");

	    if (discriminant < 0) {
	      System.out.println("The equation has no roots.");
	    }
	    else if (discriminant == 0)
	    {
	      System.out.println("The root is " + 
	    		  String.format("%.2f", equation.getRoot1()));
	    }
	    else // (discriminant >= 0)
	    {
	      System.out.println("The roots are " + 
	    		  String.format("%.2f", equation.getRoot1()) 
	        + " and " +  String.format("%.2f", equation.getRoot2()));
	    }
	}
}

class QuadraticEquation{
		//your code
}

 

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        double a = Double.parseDouble(input.next());
     double b = Double.parseDouble(input.next());
     double c = Double.parseDouble(input.next());
     if(a == 0){
         System.out.println("Wrong Format");
         System.exit(0);
     }
     //create a QuadraticEquation object
     QuadraticEquation equation = new QuadraticEquation(a,b,c);
     //get value of b * b - 4 * a * c
     double discriminant = equation.getDiscrtminant(a,b,c);
    
     System.out.println("a=" + equation.getA() +
             ",b=" + equation.getB() +
             ",c=" + equation.getC()+":");

     if (discriminant < 0) {
     System.out.println("The equation has no roots.");
     }
     else if (discriminant == 0)
     {
     System.out.println("The root is " +
              String.format("%.2f", equation.getRoot1()));
     }
     else
     {
     System.out.println("The roots are " +
              String.format("%.2f", equation.getRoot1())
     + " and " + String.format("%.2f", equation.getRoot2()));
     }
    
    }
}
class QuadraticEquation{
    QuadraticEquation(double a,double b,double c)
{
A=a;
B=b;
C=c;
}
    private double A,B,C,Root1,Root2;
    public double getRoot1() {
        double root1=(-B+Math.sqrt(B*B-4*A*C))/2*A;
        return root1;
    }
    
    public double getRoot2() {
        double root2=(-B-Math.sqrt(B*B-4*A*C))/2*A;
        return root2;
    }
    
    
    public double getA() {
        return A;
    }
    public void setA(double a) {
        A = a;
    }
    public double getB() {
        return B;
    }
    public void setB(double b) {
        B = b;
    }
    public double getC() {
        return C;
    }
    public void setC(double c) {
        C = c;
    }
    public static double getDiscrtminant(double a,double b,double c){
        double x;
        x=b*b-4*a*c;
        return x;
    }
}

 

答案不唯一。

总结:

通过这三次的作业,我加深了对Java的理解,了解到了一个新的知识层面。如果要让我来点评一下这三次作业,我觉得它们更像一个个阶梯。第一次作业主要介绍的类,方法,对象;第二次作业则跟深一步,要求你学会在类里面新建并运用方法;最后的第三步,则是让你新建类,不同的类里面有不同的方法,不同的类之间方法的调用,传参等等。一步一步,由浅至深,让你理解Java它本身独特的特性,并让你喜欢上这个简单的明了的特性。

在这三次作业中我也遇到了很多的问题,接下来由我一一为大家来说明,看你有没有遇到。

1.类,对象,方法

按照我的理解,类你可以理解为一个大的统称,比如说:人,树,车,狗等等;而对象则是具体到它们之间的每一个,比如一个叫张三的人,一条叫小白的狗,一棵特指的树;而方法就是这个特指的对象干了什么事,比如张三去上厕所,小白去吃饭..这样的话是不是很好理解?

2.如何创建类

在Java中类呗规定用class来创建

比如:class Name;这样就新建了一个叫Name的类。当然在class前面你还可以有修饰比如;public。在这里要注意,类的名字必须是以驼峰方式来命名,就是首字母大写。

3.如何创建对象

创建对象的格式:[public|private|protected] [static] [final] 类型 方法名(形参){

        方法体;

        return表达式;}

其中如果是viod修饰,则改方法不用返回值,若不是的的话则需要return一个值(不能返回表达式);

4.如何定义属性

定义属性的格式:[ public | private | protected ] [ static ] [ final ] 类型 成员名

在这里我附上一些特殊的类型:

Boolean类型,成员变量的默认值是false。

Int类型,成员变量的默认值是0。

Double类型,成员变量的默认值是0.0。

String类型,成员变量的默认值是null。

Char类型,成员变量的默认值是\u0000

你们可能会发现,在属性和方法里面都有一个static,这里就有一个新知识,静态和非静态。

静态变量:从属于类,可以在不同的对象里面调用

OO思想在我理解来,就是方便修改以前的代码,因为随着时代快速的发展,你前几个月的程序,或许到现在就不能使用了,随之而来产生的思想就是面向对象思想。

面向对象:

一种基于面向过程的新编程思想,顾名思义就是该思想是站在对象的角度思考问题,我们把多个功能合理放到不同对象里,强调的是具备某些功能的对象。
具备某种功能的实体,称为对象。面向对象最小的程序单元是:类。面向对象更加符合常规的思维方式,稳定性好,可重用性强,易于开发大型软件产品,有良好的可维护性。
在软件工程上,面向对象可以使工程更加模块化,实现更低的耦合和更高的内聚。(在此注明非本人所写,为官方概念,只做引用)

它有三大特征:1:封装(Encapsulation) 2:继承(Inheritance) 3:多态(Polymorphism)具体我就不解释了,大家可以自行百度。

面向对象和面向过程最大的区别就是上面的三大特征。在此我经查询资料而知:面向对象并不绝对的优于面向过程!

对于面向对象这个思想来说,我有很深的体悟,因为老师布置的三次作业,第二次与第三次之间有着很深的联系,因为第三次作业是一个综合作业,可以用的第二次作业当中的很多代码,而我因为自身的编译,导致很多代码不能运用在新的题目当中,只能重新编写。十分苦恼,所以大家一定要注意自己的程序的设计。

四.测试的理解与实践

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

如果让我来设计测试程序,我会依照题目,从一些常例到特例,以及编译速度等方向来测试代码,以求让代码完美的满足题目要求。

五.课程建议

建议老师多指点一些网站去学习Java有关知识。

 

 

posted @ 2020-04-05 19:17  与代码的不解之缘  阅读(155)  评论(0)    收藏  举报