java课程总结blog

一,前言
这个学期的java课程即将接近尾声,在这里我对本学期的java学习进行总结。这个学期的PTA作业除了电梯的迭代问题(算法比较难)和最后一次的统计关键字题目有些难度外,其他都在可接受范围内,一般每次的PTA作业题量都在3-5题左右,题目都很有针对性很有收获。PTA主要围绕现面向对象编程,抽象类设计、继承和接口等知识点展开与每一阶段的学习内容相匹配,帮助我们更好理解课程内容、知识。实验也是围绕面向对象程序编程展开,每两周一次,在前一次的实验基础上进行迭代,最后一次的实验考察了我们对javafx的使用,整体上实验部分环环相扣,难度适中时间也很充裕,除了实验提交系统比较难使用。线上课程压力不大,对大部分的知识都进行了讲解,线下课程课程也是通俗易懂。
二,面向对象技术总结
在这个学期的学习中我发现java和C语言的很大的不同。
1)封装性使用private关键字将类的属性设为私有,禁止外部直接访问。例如,创建一个Circle类,可以在不知道面积如何计算的情况下,求出圆的面积。这和我们现实世界是相吻合的。有时我们只需要知道怎么使用某个东西,并不需要知道这个东西内部是如何工作的。
2)继承则是从已存在的类中定义新的类,java不允许多重继承,一个java类只能直接继承自一个父类,而多重继承可以通过接口实现。
3)接口可以理解为一种特殊的抽象类,支持多重接口的实现
静态方法可以继承但是不能复写。
4)多态意味着父类型的变量可以引用子类型的对象,将一个子类的实例转换为一个父类的变量,这个是上转型,而当一个父类的实例要转换为其子类变量(下转型)则要显示转换
5)抽象类是一种不能被实例化的类,它通常用于定义一些通用的属性和方法,供子类继承和实现。抽象类适用于“is-a”关系(如Circle是Shape),接口适用于“can-do”关系(如Shape可以Draw)。
6)异常是运行时错误,异常处理使得程序可以处理运行时错误,并继续正常的执行以及try-catch-finally结构的使用。一般用关键字throw抛出一个异常。
7)javaFX是开发javaGUI程序的新框架,每个javaFX程序定义在一个继承自javafx.application.Application的类中。
下面根据PTA和实验等平时作业中的具体示例深入了解java这些特性:
1)第一个例子是拿PTA中雨刷程序功能扩展设计的例子来详细说明。这个题目是同时有两个雨刷系统,通过输入框的数字选择不同的雨刷系统,并进行操作。在这个题目中,两个雨刷系统具有共同的控制杆,刻度盘和雨刷。这里我们就可以定义一个父类,然后两个不同的雨刷系统继承自这个父类 ,这个例子很好地展示了java中的继承和开闭原则。通过一个抽象类,可以实现代码的拓展。

点击查看代码
 private int speed;

    public Brush() {

    }

    public Brush(int speed) {
        this.speed = speed;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }
这里体现了面向对象程序设计的三大支柱之一封装性,不想被用户直接知晓的属性可以定义成private,要想对这个属性进行操作,需要通过public的getter和setter
点击查看代码
        System1 system
        Lever lever;
        Brush brush = new Brush(0);
        Dial dial;
        if (choice == 1) {
            system = new firstSystem();
            lever = new Lever(1, 4);
            dial = new Dial(1, 3);
        } else if(choice==2){
            system = new secondSystem();
            lever = new Lever(1, 5);
            dial = new Dial(1, 5);
这个代码里还体现了多态的用法,System1类是firstSystem和secondSystem的共同父类,将子类的对象赋值给父类,体现了多态的使用。
点击查看代码
 @Override
    public int dealSpeed(int leverpos, int dialpos) {
        switch (leverpos) {
            case 1:
                return 0;
            case 2:
                switch (dialpos) {
                    case 1:
                        return 4;
                    case 2:
                        return 6;
                    case 3:
                        return 12;
                    default:
                        return 0;
                }
            case 3:
                return 30;
            case 4:
                return 60;
            default:
                return 0;
        }
    }
在子类的雨刷器中可以复写父类的方法(@Override)。

2)第二个例子是航空货运的PTA题目,本题要求根据真实的航空货运管理系统,从键盘依次输入填写订单需要提供的信息,然后分别生成订单信息报表及货物明细报表。

点击查看代码
abstract class Pay {
    public abstract double pay(double amount);
    public abstract String payment();
}
支付方式做成接口,符合开闭原则,要增加支付方式直接实现Pay接口即可
点击查看代码
abstract class Person {
    protected String name;
    protected String telephone;
    protected String address;

    public Person(String name, String telephone, String address) {
        this.name = name;
        this.telephone = telephone;
        this.address = address;
    }

    // Getter和Setter方法
    public String getAddress() { return address; }
    public void setAddress(String address) { this.address = address; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getTelephone() { return telephone; }
    public void setTelephone(String telephone) { this.telephone = telephone; }
}
因为这个题目中涉及不同的人,但是这些人都有地址,姓名,电话等,我们就可以将其抽象为一个抽象类,Recipient(收件人)和Sender(发件人)都继承自Person,避免重复编写相同代码,子类也可以通过重写父类方法或添加新功能进行扩展。

3)第三个例子是最后一次PTA的谷仓容积问题,要求把已经建好的谷仓按照谷仓容积大小进行递增排序,这里我使用了if-else来根据输入的数字确定不同的谷仓类型,然后用ArrayList的add()添加所有不同类型的谷仓,最后使用Collections.sort()方法对ArrayList中的谷仓容积大小进行排序。这个问题考察了列表的使用方法和Comparator和Comparable的使用方法,使用Comparable接口和Comparator可以对List进行自然排序

点击查看代码
 ArrayList<Double> list=new ArrayList<>();
        ArrayList<AbstractGranary> list1=new ArrayList<>();
        double length= sc.nextDouble();
        while(length>0){
            list.add(length);
             length= sc.nextDouble();
        }
        for(int i=0;i< list.size();i++){
            if(list.get(i)>=20){
                CylinderGranary cylinderGranary=new CylinderGranary(height, list.get(i));
                list1.add(cylinderGranary);
            }else if(list.get(i)>=15){
                CubeGranary cubeGranary=new CubeGranary(height,list.get(i));
                list1.add(cubeGranary);
            }else if(list.get(i)>=5){
                ConeGranary coneGranary=new ConeGranary(height, list.get(i));
                list1.add(coneGranary);
            }else{
                continue;
            }
        }
        Collections.sort(list1,new GranaryComparator());

4)第四个例子是关键字这道题,这道题考察了我们对集合框架和正则表达式的掌握情况

点击查看代码
  int[] count = new int[keywords.size()];

        // 更合理的分词:先按非字母数字下划线等分隔,再trim处理
        String[] tokens = code.split("[^a-zA-Z_$0-9]+"); 
        
        for (String token : tokens) {
            token = token.trim();
            if (token.isEmpty()) {
                continue;
            }
            for (int i = 0; i < keywords.size(); i++) {
                if (keywords.get(i).equals(token)) {
                    count[i]++;
                    break;
                }
            }
        }

        for (int i = 0; i < keywords.size(); i++) {
            if (count[i] > 0) {
                System.out.println(count[i] + "\t" + keywords.get(i));
            }
        }
采用 List keywords = new ArrayList<>();加入所有的关键字,然后通过正则表达式将输入代码的注释部分删除,然后按照关键字及数量按照关键字升序进行排序输出

| 封装 | 安全性、模块化、内部实现与外部调用解耦 |
| 继承 | 代码复用、层次化组织、基于父类扩展功能 |
| 多态 | 接口统一、可替换性、新增功能不影响现有代码 |
不足
对于我来说,javaFX的知识,异常处理和集合框架等掌握的可能比较薄弱。javaFX平时也没有特意下功夫去学,做实验时要用到哪个就上网查询使用方法,同学讲解时也没有很搞懂怎么操作,这导致之后用javaFX做航空系统时导致需要花费很多时间。异常处理在一般的PTA题目,实验中出现时我一般用if-else判断的比较多。集合框架中对列表(ArrayList和LinkedList)的使用频率很高,对这一块的掌握尚可,但是其他的Map,Set等掌握不够。在之后的学习中还会用到,所以这一块的知识也不应该忽视。

三,采坑心得
在学习java的过程中,也走了不少弯路,总结了一些自己的经验教训。

  • 合理的分层能让系统更易维护、扩展和测试。 在写代码前一定要明确写几个类,类与类之间的关系是什么,类的作用是什么。
  • 写代码时应仔细观察输入,检查输入是否一一对应,有没有多出的换行符没有处理,导致对应不上
  • 在处理请求时,添加异常处理机制(try-catch-finally的应用),捕获并处理非法输入,避免程序崩溃。
  • 找出类中重复的代码,将其提取成独立的方法或者类,提高代码的复用性
  • 注重代码的规范和注释,方便之后的检查和修改
  • 写完一个代码后应该对这个代码进行优化,想想有没有更方便快捷的方法能提高代码的复用性,和减少类之间的耦合,增强内聚性
  • 遇到复杂的算法问题时不能退缩,应该积极勇敢的解决问题,静下心来分析问题。

四,改进建议及总结
总的来说,面象对象程序设计这门课程难易结合,线上线下紧密结合,让我收获颇多。我完成了从C语言的“面向过程”到java的“面向对象”的思维转变,掌握了封装、继承、多态等核心特性,并能够独立开发一个小型的JavaFX应用(航空货运系统)。课程中的PTA作业与实验项目锻炼了我的编码能力与问题解决能力,而踩坑经历则让我深刻理解了“代码质量”和严谨性的重要。
这学期也让我充分意识到编程需要耐心和毅力,半途而废只会一事无成。在未来的学习中,我会保持更加热情,积极的态度投入软件工程的学习。

posted @ 2025-06-21 23:25  陈琴红  阅读(24)  评论(0)    收藏  举报