首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

面向对象,该如何解决

2013-08-06 
面向对象最近花时间写个订票系统,以前用C写过,因为在学java,所以就像写个试试,写完了让人一看,人家直接说

面向对象
最近花时间写个订票系统,以前用C写过,因为在学java,所以就像写个试试,写完了让人一看,人家直接说没有必要看,完全没有面向对象的思想,全是面向过程的思想,我就很不明白,到底什么是面向对象,书上的完全不着实际,网上的代码很多是一些课程设计之类的,暂时看不懂,所以很纠结,该怎么办?
[解决办法]
 就我理解的面向对象,就是说你要去办一件,你自己不去亲自动手,而是叫一个人帮你办。而其中的你就是主方法,而去办那件事的人,就是类。也就是说你把基本上所有的方法,要实现的内容都放在类,需要什么,就用主方法去调用,去实现那个类。(或许说的不是很准确,希望你原谅,呵呵)
[解决办法]
你可以先大致讲讲你的程序结构和流程
[解决办法]
面向对象最重要的就是要分清类职责和方法职责。先将订票系统作用例分析(用例图),根据用例将职责分开,设计类,定义类职责。将相关的数据与行为(方法)组织在一个类中。类定义好后就是定义方法职责,确认方法可见域。
[解决办法]
个人的理解:面向对象的理解是个漫长的过程,你即使告诉自己在设计一个系统的时候尝试将任何事物看做是一个对象来做,当在真正实践的过程中依然会觉得无从下手。
首先一点,面向对象是会用到很多面向对象的高级特性的,多态、封装、继承这三个核心概念需要大量的编程才能够真正理解,应当先把java的基本功打扎实;
其次一点,强迫自己继承、封装,套用设计模式也是没用的,因为没有真正理解,抛开书本的东西,自己设计的时候就傻了。设计是建立在大量的实践基础之上的。从细节开始,培养复用、面向接口编程、模块化、对象化的编程思维。
等到积累了足够多经验之后,再从宏观角度去思考什么是面向对象。
[解决办法]
我以前也是写C的,很难扭转到面向对象。我现在的办法是自己不写东西,因为一写就是C的思路。我大量看CODE,看多了貌似能有点感觉
[解决办法]

引用:
我以前也是写C的,很难扭转到面向对象。我现在的办法是自己不写东西,因为一写就是C的思路。我大量看CODE,看多了貌似能有点感觉

谁告诉你C语言不能面向对象了?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/**普通的JavaBean对象
 * */
struct UserInfo{
int id;
char *userName;
char *password;
};
/**以Json形式输出对象
 * */
void printJsonStr(struct UserInfo *userInfo){
printf("UserInfo{id:%d,userName:%s,password:%s}\n",userInfo->id,userInfo->userName,userInfo->password);
}
/**构造函数
 * */
struct UserInfo *newUserInfo(int id,char *userName,char *password){
struct UserInfo *userInfo=(struct UserInfo*)malloc(sizeof(struct UserInfo));
userInfo->id=id;
userInfo->userName=userName;
userInfo->password=password;
return userInfo;
}
/**构造长度为len的字符串
 * */
char *newString(int len){
return (char*)malloc(sizeof(char)*len);
}
void javaBeanTest(){


struct UserInfo *userInfo=NULL;
int id;
char *userName=newString(20);
char *password=newString(20);
printf("请输入id:\n");
scanf("%d",&id);
printf("请输入用户名:\n");
scanf("%s",userName);
printf("请输入密码:\n");
scanf("%s",password);
userInfo=newUserInfo(id,userName,password);
printf("您的个人信息:\n");
    printJsonStr(userInfo);
}
void main(){
void javaBeanTest();
javaBeanTest();
}


面向对象,该如何解决


另外,利用typedef、typeof、宏替换、函数指针等等,完全可以模拟封装、继承、多态、泛型;只是大部分人错误的以为“看完《谭浩强》就等于学过C语言”。

[解决办法]
class Users extends Line,用户和航线没有任何联系,不能extends,inputMenuChoice()之类的方法也不要放到Users里边;另外,不要“为了面向对象而面向对象”,你的extends用的太多了,实际开发中都是MVC模式、Dao+JavaBean的模式,基本上都要先画出JavaBean之间的ER图,然后再写Dap、service、action、前台等等,继承、实现的官方的API比较多,整体架构也是追求“多组合,少继承”;“面向对象”相关的练习先跳过去吧,你做这个系统已经走了不少弯路,进度尽量往前赶,学Java类库、IO、Jsp、Servlet、SSH框架,然后做个web版的订票系统出来;不要刻意的培养“复用、面向接口编程、模块化、对象化的编程思维”了,没有用的。面试的话,人家还是主要看你是不是熟悉MVC的开发流程;熟悉MVC的每个模块的代码怎么写,比你懂多少思想来的实际;另外,面向过程也不能忽视,因为,有些大公司还有可能出个类似于本人的头像的笔试题让你写,这东西全是面向过程的,你写出来才人家才认可你。所以你现在要练什么?两点:
1、尽快掌握MVC、SSH、Jsp、Ajax之类的流行技术。
2、数据结构与算法不能忽视,大公司必考。

[解决办法]
一、关于继承:后期的MVC、SSH技术,用到的继承屈指可数,我目前只见到3个:
继承HibernateTemplete
继承ActionSupport
继承Juqery的extends:fn
其它基本上是组合、1--N关系,或者生成Spring代理对象等等
二、关于复用:函数就是一种“代码复用”,单从函数的角度来讲,C语言复用性能和Java抗衡,但是后期会学到反射机制、泛型编程这两个强大武器,Java的复用性就远大于C语言了。
三、关于“模块化”:其实C语言也有模块化,只不过更偏向底层,如:


 * */
int **initTwoArray(int m,int n){
int i=0,*oneArray='\0',j=0;
int **array=(int **)malloc(m*sizeof(int *));
for(;i<m;i++){
oneArray=(int *)malloc(n*sizeof(int));
for(j=0;j<n;j++){
*(oneArray+j)=0;
}
array[i]=oneArray;
}
return array;
}


而Java呢,一个 new int[m][n]就搞定了,因为Sun已经帮你在底层做了很多事情,你可以直接"利用他的模块"来完成你想要的功能。
四:关于对象化思维,比如毕向东视频里边的“冰箱”的例子,初学的时候我们可能都同意视频里边的写法:

public class Fridge {
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
/**
 * 冰箱具有“打开”的功能
 */
public void open(){
System.out.println("打开"+name);
}
/**
 * 冰箱具有“关闭”的功能
 */
public void close(){
System.out.println("关闭"+name);


}
}


但以上写法在实际项目开发中是不合理的,项目开发中一般这么写:

public class Fridge {
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}
/**
 *操作冰箱的类,使得数据和操作分离
 *
 */
class OperateFridge{
public static void open(Fridge f){
System.out.println("打开"+f.getName());
}
public static void close(Fridge f){
System.out.println("关闭"+f.getName());
}
}

进度赶进度吧,关于其他的一些设计思想,遇到了再说。顺便提一下,你现在还处于面向对象的初级阶段,越是学到最后你越会发现,要想透彻的理解Java语言,只有从内存的角度去看Java,单单拥有"面向对象,模块化,代码复用、设计模式"等等是不够的,比如一个经典的面试题,很多人讨论,但很少有人能完全说出来:
创建String和StringBuffer对象,在静态区、堆区、栈区分别创建了什么,各占多少字节?为什么JDK要重写String的hashcode,并把String声明为final?StringBuffer的初始容量大概是多少,又是如何扩充的,扩充之后产生了什么垃圾,如何被回收?

热点排行