最近花时间写个订票系统,以前用C写过,因为在学java,所以就像写个试试,写完了让人一看,人家直接说没有必要看,完全没有面向对象的思想,全是面向过程的思想,我就很不明白,到底什么是面向对象,书上的完全不着实际,网上的代码很多是一些课程设计之类的,暂时看不懂,所以很纠结,该怎么办?

解决方案 »

  1.   

    个人的理解:面向对象的理解是个漫长的过程,你即使告诉自己在设计一个系统的时候尝试将任何事物看做是一个对象来做,当在真正实践的过程中依然会觉得无从下手。
    首先一点,面向对象是会用到很多面向对象的高级特性的,多态、封装、继承这三个核心概念需要大量的编程才能够真正理解,应当先把java的基本功打扎实;
    其次一点,强迫自己继承、封装,套用设计模式也是没用的,因为没有真正理解,抛开书本的东西,自己设计的时候就傻了。设计是建立在大量的实践基础之上的。从细节开始,培养复用、面向接口编程、模块化、对象化的编程思维。
    等到积累了足够多经验之后,再从宏观角度去思考什么是面向对象。
      

  2.   

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

  3.   

    谁告诉你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语言”。
      

  4.   

    谁告诉你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语言”。
    目前还没有面向对象的概念,看一下下面这个代码(这个是从新写的,第一个别人说完全不是面向对象..): 暂时没有订票,退票不知道写的怎么样...import java.util.*;class Line{
    protected String trainNum;  //班次
    protected String date; //日期
    protected String startCity; //起点
    protected String toCity; //终点
    protected String startTime; //起始时间
    protected String toTime; //到达时间
    protected int seatAmount; //座位数量
    protected double ticketPrice; //票价

    public Line(){}

    public String getLineNum(){return this.trainNum;}
    public String getStartCity(){return this.startCity;}
    public String getToCity(){return this.toCity;}
    public String getDate(){return this.date;}
    public String getStartTime(){return this.startTime;}
    public String getToTime(){return this.toTime;}
    public int getSeatAmount(){return this.seatAmount;}
    public double getTicketPrice(){return this.ticketPrice;}

    }class Users extends Line {
    private String userName; //用户姓名
    private int seatNum; //车票座位号
    private Scanner input = new Scanner(System.in);
    Querying qy = new Querying();
    //Booking bk = new Booking();

    public Users(){
    super();
    }

    public String getUserName(){
    return this.userName;
    }
    public int getSeatNum(){
    return this.seatNum;
    }
    public void inputMenuChoice(int choice){
    System.out.print("请选择操作: ");
    choice = input.nextInt();
    }
    public void inputName(String name){
    System.out.print("输入姓名: ");
    name = input.nextLine();
    }
    public void inputStartCity(String Startcity){
    System.out.print("输入起点: ");
    startCity = input.nextLine();
    }
    public void inputToCity(String toCity){
    System.out.print("输入终点: ");
    toCity = input.nextLine();
    }
    }class Terminal{
    private static int linesAmount = 0; //路线数量
    private static ArrayList<Line> lines = new ArrayList<Line>(linesAmount + 1);
    private static int usersAmount = 0; //用户数量
    private static ArrayList<Users> users = new ArrayList<Users>(usersAmount + 1);

    public Terminal(){}

    public void creatLine(Line line, String tN,String sC, String tC, String d, String sT, String tT, int sA, double tP){ //创建路线
    line.trainNum = tN;
    line.startCity = sC;
    line.toCity = tC;
    line.date = d;
    line.startTime = sT;
    line.toTime = tT;
    line.seatAmount = sA;
    line.ticketPrice = tP;
    linesAmount++;
    lines.add(line);
    }

    public int getLineAmount(){return linesAmount;}
    public ArrayList<Line> getLines(){return lines;}
    public int getUsersAmount(){return usersAmount;}
    public ArrayList<Users> getUsers(){return users;}

    public int confirmName(String name, int index){
    if(users.get(index).getUserName().compareTo(name) == 0){
    return index;
    }
    return -1;
    }

    public int confirmSTcity(String startCity, String toCity,int index){
    if(lines.get(index).getStartCity().compareTo(startCity) == 0 &&
    lines.get(index).getToCity().compareTo(toCity) ==0){
    return index;
    }
    return -1;
    }

    public void printLineHead(){
    System.out.printf("%10s%9s%14s%14s%10s%10s%7s%11s\n", 
    "班   次","日   期","始   发   站","终   点   站","始发时间","到达时间","座位量","票      价");
    }

    public void printTicketHead(){
    System.out.printf("%10s%10s%9s%14s%14s%10s%10s%7s%11s\n", 
    "姓    名","班   次","日   期","始   发   站","终   点   站","始发时间","到达时间","座位号","票    价");
    }
    public void printLineWithIndex(int i){
    System.out.printf("  %-6s%-7s%-10s%-10s%-10s%-9s%-7d%-7.2f\n",
    lines.get(i).trainNum,lines.get(i).date,lines.get(i).startCity,lines.get(i).toCity,
    lines.get(i).startTime,lines.get(i).toTime,lines.get(i).seatAmount,lines.get(i).ticketPrice);
    }

    public void printTicketWithIndex(int index){
    System.out.printf("  %-7s%-6s%-7s%-10s%-10s%-10s%-9s%-7d%-7.2f\n",
    users.get(index).getUserName(),users.get(index).getLineNum(),users.get(index).getDate(),
    users.get(index).getStartCity(),users.get(index).getToCity(),users.get(index).getStartTime(),
    users.get(index).getToTime(),users.get(index).getSeatNum(),users.get(index).getTicketPrice());
    }
    }

    class QueryPage{
    public QueryPage(){
    }

    public void showQueryPage(){
    System.out.println("     *****查询系统***** ");
    System.out.println(" 1-----> 全部路线查询");
    System.out.println(" 2-----> 起终点查询");
    System.out.println(" 3-----> 用户名查询");
    System.out.println(" 0-----> 退出");
    }
    }

    class Querying{ //查询
    private BookingSystem bs = new BookingSystem();
    private Users us = new Users();
    private QueryPage qp = new QueryPage();
    private QueryTotalLinesInfo qtLI = new QueryTotalLinesInfo();
    private QueryLineInfoByCity qLIBC = new QueryLineInfoByCity();
    private QueryTicketInfoByUser qLIOU = new QueryTicketInfoByUser();
    private int queryChoice;

    public Querying(){}

    public void querying(){
    qp.showQueryPage();
    while(true){
    us.inputMenuChoice(queryChoice);
    switch(queryChoice){
    case 1:
    qtLI.getTotalLinesInfo();
    qp.showQueryPage();
    break;
    case 2:
    qLIBC.queryLineInfoByCity();
    qp.showQueryPage();
    break;
    case 3:
    qLIOU.queryTicketInfoByUser();
    qp.showQueryPage();
    break;
    default:
    bs.startFromHere();
    qp.showQueryPage();
    break;
    }
    }
    }
    }class QueryTotalLinesInfo extends Terminal{
    private Terminal tm = new Terminal();

    public QueryTotalLinesInfo(){
    }

    public void getTotalLinesInfo(){
    System.out.println( " ***全部路线信息如下***");
    tm.printLineHead();
    for(int index = 0; index < tm.getLineAmount(); index++){
    tm.printLineWithIndex(index);
    }
    System.out.println();
    }
    }class QueryLineInfoByCity extends Terminal{
    private Terminal tm = new Terminal();
    private Users us = new Users();
    private QueryPage qp = new QueryPage();

    public QueryLineInfoByCity(){
    }

    public void queryLineInfoByCity(){
    String startCity = null;
    us.inputName(startCity);
    String toCity = null;
    us.inputToCity(toCity);
    System.out.println(" ***路线  " + startCity + " 至  " + toCity + " 信息如下***");
    for(int index = 0; index < tm.getUsersAmount(); index++){
    if(tm.confirmSTcity(startCity, toCity, index) >= 0 ){
    tm.printLineHead();
    tm.printLineWithIndex(tm.confirmSTcity(startCity, toCity, index));
    }
    }
    qp.showQueryPage();
    }
    }class QueryTicketInfoByUser extends Terminal{
    private Terminal tm = new Terminal();
    private Users us = new Users();

    public QueryTicketInfoByUser(){
    }

    public void queryTicketInfoByUser(){
    String inputName = null;
    us.inputName(inputName);
    System.out.println(" ***用户  " + inputName + " 所购车票的信息如下***");
    tm.printTicketHead();
    for(int index = 0; index < tm.getUsersAmount(); index++){
    if(tm.confirmName(inputName, index) >= 0){
    tm.printTicketWithIndex(tm.confirmName(inputName, index));
    }
    }
    System.out.println();
    }
    }public class BookingSystem {
    private Terminal tm = new Terminal();
    private Users us = new Users();
    Querying qy = new Querying();
    private int pageChoice;

    public BookingSystem(){
    }

    public void initLines(){ 
    Line line0 = new Line();
    Line line1 = new Line();
    tm.creatLine(line0, "K000", "Hefei", "Beijing", "12/07", "08:30", "09:30", 50, 34.0);
    tm.creatLine(line1, "K111", "Shanghai", "Hefei", "21/07", "09:45", "11:00", 50, 50.5);
    }

    public void startFromHere(){
    String pageString =   " *****欢迎来到火车订票系统***** \n" 
    + " 1-----> 查询\n"
    + " 2-----> 订票\n" 
    + " 3-----> 退票\n" 
    // + " 4-----> 增加路线\n"
    + " 0-----> 退出\n";
    System.out.println(pageString);
    while(true){
    us.inputMenuChoice(pageChoice);
    switch(pageChoice){
    case 1:
    qy.querying();
    break;
    case 2:
    // us.booking();
    break;
    case 3:
    // us.returning();
    break;
    // case 4:
    // System.out.println(" ***暂未开放***\n");
    // Ticket ticket = Ticket.incTicket();
    // tk.assignInfoForTicket(ticket);
    // break; 
    case 0:
    System.out.println("\n ***谢谢使用***");
    System.exit(0);
    }
    }
    }

    public static void main(String[] args){
    BookingSystem bs = new BookingSystem();
    bs.initLines();
    bs.startFromHere();
    }
    }
      

  5.   

    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、数据结构与算法不能忽视,大公司必考。
      

  6.   

    少用继承吗? 但是写java程序,却不知道面向对象,还是无法理解这么语言的,再说,后期的这些流行技术,它们也仅仅是技术,思想不是那么容易领略的,所以,希望你们能帮我分析分析,有点我要承认,我确实有点为了面向对象二面向对象了.....
      

  7.   

    一、关于继承:后期的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的初始容量大概是多少,又是如何扩充的,扩充之后产生了什么垃圾,如何被回收?
      

  8.   

    [quote ]其它基本上是组合、1--N关系,或者生成Spring代理对象等等?
     
    错能详细讲讲吗?
    其它基本上是组合、1--N关系,或者生成Spring代理对象等等?
     
    创建String和StringBuffer对象,在静态区、堆区、栈区分别创建了什么,各占多少字节?为什么JDK要重写String的hashcode,并把String声明为final?StringBuffer的初始容量大概是多少,又是如何扩充的,扩充之后产生了什么垃圾,如何被回收?
      

  9.   

    [quote ]其它基本上是组合、1--N关系,或者生成Spring代理对象等等
     
    错能详细讲讲吗?
    其它基本上是组合、1--N关系,或者生成Spring代理对象等等?
     
    创建String和StringBuffer对象,在静态区、堆区、栈区分别创建了什么,各占多少字节?为什么JDK要重写String的hashcode,并把String声明为final?StringBuffer的初始容量大概是多少,又是如何扩充的,扩充之后产生了什么垃圾,如何被回收?
      

  10.   

    谁告诉你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语言”。
    目前还没有面向对象的概念,看一下下面这个代码(这个是从新写的,第一个别人说完全不是面向对象..): 暂时没有订票,退票不知道写的怎么样...import java.util.*;class Line{
    protected String trainNum;  //班次
    protected String date; //日期
    protected String startCity; //起点
    protected String toCity; //终点
    protected String startTime; //起始时间
    protected String toTime; //到达时间
    protected int seatAmount; //座位数量
    protected double ticketPrice; //票价

    public Line(){}

    public String getLineNum(){return this.trainNum;}
    public String getStartCity(){return this.startCity;}
    public String getToCity(){return this.toCity;}
    public String getDate(){return this.date;}
    public String getStartTime(){return this.startTime;}
    public String getToTime(){return this.toTime;}
    public int getSeatAmount(){return this.seatAmount;}
    public double getTicketPrice(){return this.ticketPrice;}

    }class Users extends Line {
    private String userName; //用户姓名
    private int seatNum; //车票座位号
    private Scanner input = new Scanner(System.in);
    Querying qy = new Querying();
    //Booking bk = new Booking();

    public Users(){
    super();
    }

    public String getUserName(){
    return this.userName;
    }
    public int getSeatNum(){
    return this.seatNum;
    }
    public void inputMenuChoice(int choice){
    System.out.print("请选择操作: ");
    choice = input.nextInt();
    }
    public void inputName(String name){
    System.out.print("输入姓名: ");
    name = input.nextLine();
    }
    public void inputStartCity(String Startcity){
    System.out.print("输入起点: ");
    startCity = input.nextLine();
    }
    public void inputToCity(String toCity){
    System.out.print("输入终点: ");
    toCity = input.nextLine();
    }
    }class Terminal{
    private static int linesAmount = 0; //路线数量
    private static ArrayList<Line> lines = new ArrayList<Line>(linesAmount + 1);
    private static int usersAmount = 0; //用户数量
    private static ArrayList<Users> users = new ArrayList<Users>(usersAmount + 1);

    public Terminal(){}

    public void creatLine(Line line, String tN,String sC, String tC, String d, String sT, String tT, int sA, double tP){ //创建路线
    line.trainNum = tN;
    line.startCity = sC;
    line.toCity = tC;
    line.date = d;
    line.startTime = sT;
    line.toTime = tT;
    line.seatAmount = sA;
    line.ticketPrice = tP;
    linesAmount++;
    lines.add(line);
    }

    public int getLineAmount(){return linesAmount;}
    public ArrayList<Line> getLines(){return lines;}
    public int getUsersAmount(){return usersAmount;}
    public ArrayList<Users> getUsers(){return users;}

    public int confirmName(String name, int index){
    if(users.get(index).getUserName().compareTo(name) == 0){
    return index;
    }
    return -1;
    }

    public int confirmSTcity(String startCity, String toCity,int index){
    if(lines.get(index).getStartCity().compareTo(startCity) == 0 &&
    lines.get(index).getToCity().compareTo(toCity) ==0){
    return index;
    }
    return -1;
    }

    public void printLineHead(){
    System.out.printf("%10s%9s%14s%14s%10s%10s%7s%11s\n", 
    "班   次","日   期","始   发   站","终   点   站","始发时间","到达时间","座位量","票      价");
    }

    public void printTicketHead(){
    System.out.printf("%10s%10s%9s%14s%14s%10s%10s%7s%11s\n", 
    "姓    名","班   次","日   期","始   发   站","终   点   站","始发时间","到达时间","座位号","票    价");
    }
    public void printLineWithIndex(int i){
    System.out.printf("  %-6s%-7s%-10s%-10s%-10s%-9s%-7d%-7.2f\n",
    lines.get(i).trainNum,lines.get(i).date,lines.get(i).startCity,lines.get(i).toCity,
    lines.get(i).startTime,lines.get(i).toTime,lines.get(i).seatAmount,lines.get(i).ticketPrice);
    }

    public void printTicketWithIndex(int index){
    System.out.printf("  %-7s%-6s%-7s%-10s%-10s%-10s%-9s%-7d%-7.2f\n",
    users.get(index).getUserName(),users.get(index).getLineNum(),users.get(index).getDate(),
    users.get(index).getStartCity(),users.get(index).getToCity(),users.get(index).getStartTime(),
    users.get(index).getToTime(),users.get(index).getSeatNum(),users.get(index).getTicketPrice());
    }
    }

    class QueryPage{
    public QueryPage(){
    }

    public void showQueryPage(){
    System.out.println("     *****查询系统***** ");
    System.out.println(" 1-----> 全部路线查询");
    System.out.println(" 2-----> 起终点查询");
    System.out.println(" 3-----> 用户名查询");
    System.out.println(" 0-----> 退出");
    }
    }

    class Querying{ //查询
    private BookingSystem bs = new BookingSystem();
    private Users us = new Users();
    private QueryPage qp = new QueryPage();
    private QueryTotalLinesInfo qtLI = new QueryTotalLinesInfo();
    private QueryLineInfoByCity qLIBC = new QueryLineInfoByCity();
    private QueryTicketInfoByUser qLIOU = new QueryTicketInfoByUser();
    private int queryChoice;

    public Querying(){}

    public void querying(){
    qp.showQueryPage();
    while(true){
    us.inputMenuChoice(queryChoice);
    switch(queryChoice){
    case 1:
    qtLI.getTotalLinesInfo();
    qp.showQueryPage();
    break;
    case 2:
    qLIBC.queryLineInfoByCity();
    qp.showQueryPage();
    break;
    case 3:
    qLIOU.queryTicketInfoByUser();
    qp.showQueryPage();
    break;
    default:
    bs.startFromHere();
    qp.showQueryPage();
    break;
    }
    }
    }
    }class QueryTotalLinesInfo extends Terminal{
    private Terminal tm = new Terminal();

    public QueryTotalLinesInfo(){
    }

    public void getTotalLinesInfo(){
    System.out.println( " ***全部路线信息如下***");
    tm.printLineHead();
    for(int index = 0; index < tm.getLineAmount(); index++){
    tm.printLineWithIndex(index);
    }
    System.out.println();
    }
    }class QueryLineInfoByCity extends Terminal{
    private Terminal tm = new Terminal();
    private Users us = new Users();
    private QueryPage qp = new QueryPage();

    public QueryLineInfoByCity(){
    }

    public void queryLineInfoByCity(){
    String startCity = null;
    us.inputName(startCity);
    String toCity = null;
    us.inputToCity(toCity);
    System.out.println(" ***路线  " + startCity + " 至  " + toCity + " 信息如下***");
    for(int index = 0; index < tm.getUsersAmount(); index++){
    if(tm.confirmSTcity(startCity, toCity, index) >= 0 ){
    tm.printLineHead();
    tm.printLineWithIndex(tm.confirmSTcity(startCity, toCity, index));
    }
    }
    qp.showQueryPage();
    }
    }class QueryTicketInfoByUser extends Terminal{
    private Terminal tm = new Terminal();
    private Users us = new Users();

    public QueryTicketInfoByUser(){
    }

    public void queryTicketInfoByUser(){
    String inputName = null;
    us.inputName(inputName);
    System.out.println(" ***用户  " + inputName + " 所购车票的信息如下***");
    tm.printTicketHead();
    for(int index = 0; index < tm.getUsersAmount(); index++){
    if(tm.confirmName(inputName, index) >= 0){
    tm.printTicketWithIndex(tm.confirmName(inputName, index));
    }
    }
    System.out.println();
    }
    }public class BookingSystem {
    private Terminal tm = new Terminal();
    private Users us = new Users();
    Querying qy = new Querying();
    private int pageChoice;

    public BookingSystem(){
    }

    public void initLines(){ 
    Line line0 = new Line();
    Line line1 = new Line();
    tm.creatLine(line0, "K000", "Hefei", "Beijing", "12/07", "08:30", "09:30", 50, 34.0);
    tm.creatLine(line1, "K111", "Shanghai", "Hefei", "21/07", "09:45", "11:00", 50, 50.5);
    }

    public void startFromHere(){
    String pageString =   " *****欢迎来到火车订票系统***** \n" 
    + " 1-----> 查询\n"
    + " 2-----> 订票\n" 
    + " 3-----> 退票\n" 
    // + " 4-----> 增加路线\n"
    + " 0-----> 退出\n";
    System.out.println(pageString);
    while(true){
    us.inputMenuChoice(pageChoice);
    switch(pageChoice){
    case 1:
    qy.querying();
    break;
    case 2:
    // us.booking();
    break;
    case 3:
    // us.returning();
    break;
    // case 4:
    // System.out.println(" ***暂未开放***\n");
    // Ticket ticket = Ticket.incTicket();
    // tk.assignInfoForTicket(ticket);
    // break; 
    case 0:
    System.out.println("\n ***谢谢使用***");
    System.exit(0);
    }
    }
    }

    public static void main(String[] args){
    BookingSystem bs = new BookingSystem();
    bs.initLines();
    bs.startFromHere();
    }
    }

    这个好像运行不了!!!
      

  11.   

    谁告诉你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语言”。

    有个疑问,malloc函数使用后,是否需要在javaBeanTest()里的最后边做free操作?不free会内存泄漏的吧?
      

  12.   

    main函数结束时,自动free。如果下面还有好多的代码,而又用不到这个对象,就需要手动free。