“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情”
引言
学习java的方法:先理解了方法与方法之间的关系,主要是他们之间的执行顺序和调用关系。 通过一个练习加强理解,进而继续理解类与类的关系,最后理解包与包的关系。
编程来源于生活,理解了生活,就理解编程。
I 预备知识: 方法
方法:用来表示对象的功能,它依赖于对象而存在。方法是动作,一般使用动词来声明。
1.1 定义语法
修饰符 返回值 方法名(参数列表){
return 值 //值的类型一定要与返回值的类型匹配
}
方法没有返回值,使用void关键字占位。
1.2 调用语法
方法名 (值1,值2);
方法调用的传值,值的类型应与定义对应位置类型一致;
1.3 形参和实参
形参:在方法定义时,存在于参数列表中的变量。
作用:用来接收来自实参所传递的值。
实参:在方法调用时,存在参数列表的值或变量。
作用:传值给形参。
java只有一种传值方式,就是值传递。
II 写代码的顺序
-
先写子类,再写父类;先写方法的调用,再写方法的定义。
-
定义参数时,优先考虑八大基本数据类型。
-
当定义变量的需求过多,优先考虑数组类型。
-
定义方法:根据逻辑定义功能
III UML
UML主要用于沟通,是大家熟悉认同的语言而已。面向对象分析和设计来源于设计者的头脑,重点是设计者的思想和理念。
比如,决定一张照片的好坏是后面的头脑而不是器材。
在画UML 图的类图(Class Diagram)时,要先了解一下类的3种关系。
UML使用类图表示类,接口以及关联。类图用于静态建模,类图由3部分组成(类名,属性,操作)。
3.1 类的3种关系
在UML中,事物之间相互联系的方式(无论是逻辑上的还是物理上的)都被建模为关系。在面向对象的建模中,有3中重要的关系:依赖
,关联
和泛化
。
- 依赖(dependency)是使用关系。说明一个事物使用另一个事物的信息和服务。
例如,水管依赖热水器,对它们所运送的水进行加热。
- 关联(association)是实例之间的结构关系。类之间的关联关系大多用来表示变量实例持有着其他对象的引用。
其中,还有聚合与组合都是关联的一种特殊形式。聚合它意味着整体和部分的关系;而组合是一种特殊的聚合形式。
例如,一个房间是由墙和一些其他事物组成的,墙上可以嵌套门和窗,管道可以穿通墙体。
- 泛化(generalization),把一般类连接到较为特殊的类,也称为超类和子类关系,称为is-a-kind-of关系。
例如,观景窗是一种带有固定的大窗格的窗户,庭院是一种带有向两边开的窗格的窗户。
3.2 使用UML的场景
- 作为草图-与他人交流设计方案,来指导更详细的设计或编码人员进行开发
- 作为编程蓝图和详细设计指导
- 作为系统结果的road map ,这种脉络图可以使开发者快速找到类之间的依赖关系,并提供系统结构的参考。
- 作为代码的逆向工程图——帮助代码维护人员,阅读、分析和检查代码,快速了解代码结构。
- 在理论、工具和可用性方面处于发展阶段:把UML作为编程语言,即基于UML模型驱动(MDA),用UML全程建模,完成软件系统可执行规格说明,代码自动生成。
3.3 关于UML的保留和舍弃
养成舍弃UML图的习惯,最好,养成不要把图建立在能长期保存的介质上的习惯。在一个白板或一个草稿纸上画它们,经常擦掉白板或舍弃草稿纸。
原则上不使用Case工具或画图工具,这些工具只用一次即可,你的大多数UML图都是短命的。
但有一些图保存下来是非常有用的:
- 表现你的系统中一个通用设计解决方案图
- 记录了复杂的协议,难以通过代码了解的图
- 提供了比较少涉及到的系统范围的“路标图“的图
- 记录了比代码更易表述的设计意图的图。
3.4 敏捷开发工程
- 定义用例:需求分析可能包括人们如何使用应用的情节或场景
- 定义领域模型:面向对象的分析关注领域的概念,属性和关联来形成OOA结果领域模型(domain model),在领域模型中展示重要的领域对象。
- 分配对象职责,并绘制交互图:ood关注软件对象的定义-它们的职责和协作。
注:顺序图(sequence diagram)是描述协作的常见表达方式,它展示了软件对象之间的消息流,和由消息引起的方法调用。
- 定义设计类:使用设计类来表示有效类定义的静态视图,重点描述类的属性和方法。
IV 案例(试卷系统)
使用方法之间的调用关系,来完成一个试卷系统。该试卷系统有试卷Paper类,Choice抽象类,以及Choice的两个子类MultChoice和SingleChoice类。 实现一个可以在控制台录入当选题和多选题,并答题的系统。 他们之间的UML由于较简单,就不画了。具体可参照下面的代码实现。
4.1 提供用户输入管道(Scanner)
import java.util.Scanner;
Scanner sc=new Scanner(System.in);
long nextLong()
阻塞方法,用户必须输入数据,程序才继续执行
String next()
从控制台读取字符串(不允许带空白:\t ;)
String nextLine()
从控制台读取字符串(允许带空白)
注:在使用nextLine时,需要独立创一个管道,否则,nextLine()就会将上次的输入的回车记录为用户输入的字符串。
所有的方法都直接或者间接的被main方法调用;main方法是应用程序的入口点。
4.2 代码实现
- 试卷系统中的选择题的抽象类
package com.csuinfosoft.paper;
/**
*
* @author 张坤楠
* @date 上午8:47:11
* 试卷系统中的选择题的抽象类
*/
public class Choice {
private String question;//题干
private String a;//选项A
private String b;//选项B
private String c;//选项C
private String d;//选项D
private double score;//分数
public Choice() {
this(null, null, null, null, null, 0.0);
}
public Choice(String question, String a, String b, String c, String d,
double score) {
this.question = question;
this.a = a;
this.b = b;
this.c = c;
this.d = d;
this.score = score;
}
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this.question = question;
}
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
public String getC() {
return c;
}
public void setC(String c) {
this.c = c;
}
public String getD() {
return d;
}
public void setD(String d) {
this.d = d;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
}
- 多选题的实体类
package com.csuinfosoft.paper;
/**
*
* @author 张坤楠
* @date 下午2:30:45
* 多选题的实体类
*/
public class MultChoice extends Choice{
private char[] correctAnswer;
private char[] answer;
public MultChoice() {
this(null, null, null, null, null, 0.0, null, null);
}
public MultChoice(String question, String a, String b, String c, String d,
double score,char[] correctAnswer,char[] answer) {
super(question, a, b, c, d, score);
this.correctAnswer=correctAnswer;
this.answer=answer;
// TODO Auto-generated constructor stub
}
public char[] getCorrectAnswer() {
return correctAnswer;
}
public void setCorrectAnswer(char[] correctAnswer) {
this.correctAnswer = correctAnswer;
}
public char[] getAnswer() {
return answer;
}
public void setAnswer(char[] answer) {
this.answer = answer;
}
}
- 单选题的实体类
package com.csuinfosoft.paper;
/**
*
* @author 张坤楠
* @date 下午2:32:46
* 单选题的实体类
*/
public class SingleChoice extends Choice{
private char correctAnswer;
private char answer;
public SingleChoice() {
this(null,null,null,null,null,0.0,'\0','\0');
}
public SingleChoice(String question, String a, String b, String c,
String d, double score,char correctAnswer,char answer) {
super(question, a, b, c, d, score);
this.correctAnswer=correctAnswer;
this.answer=answer;
// TODO Auto-generated constructor stub
}
public char getCorrectAnswer() {
return correctAnswer;
}
public void setCorrectAnswer(char correctAnswer) {
this.correctAnswer = correctAnswer;
}
public char getAnswer() {
return answer;
}
public void setAnswer(char answer) {
this.answer = answer;
}
}
- 试卷实体
package com.csuinfosoft.paper;
/**
*
* @author 张坤楠
* @date 下午2:34:43
* 试卷实体
*/
public class Paper {
private Choice[] singleChoice;
private Choice[] multChoice;
private double score;
public Paper() {
this(null,null,0.0);
// TODO Auto-generated constructor stub
}
public Paper(Choice[] singleChoice, Choice[] multChoice,double score) {
this.singleChoice = singleChoice;
this.multChoice = multChoice;
this.score=score;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public Choice[] getSingleChoice() {
return singleChoice;
}
public void setSingleChoice(Choice[] singleChoice) {
this.singleChoice = singleChoice;
}
public Choice[] getMultChoice() {
return multChoice;
}
public void setMultChoice(Choice[] multChoice) {
this.multChoice = multChoice;
}
}
- 试卷系统
package com.csuinfosoft.paper;
import java.util.Scanner;
import java.util.Arrays;
/**
*
* @author 张坤楠
* @date 下午2:37:23
* 试卷系统
*/
public class PaperSystem {
public static void main(String[] args){
for(;;){
//输出菜单
menu();
int num=getNumMenu();
boolean flag=validata(num);
if(!flag){
System.out.println("您的输入有误");
continue;
}
process(num);
}
}
public static void process(int num){
if(num==2){
System.exit(0);
}
Choice[] singleChoice=getSingleChoice();
Choice[] multChoice=getMultChoice();
//生成试卷
//获取试卷总分
double score=getScoreAll(singleChoice,multChoice);
Paper paper=getPaper(score,singleChoice,multChoice);
System.out.println("您的分数:"+exam(paper));
}
public static double exam(Paper paper){
Choice[] m=paper.getMultChoice();
Choice[] s=paper.getSingleChoice();
for(int i=0;i
更多内容请关注公众号:iOS逆向