zoukankan      html  css  js  c++  java
  • 20155227 2016-2017-2 《Java程序设计》第四周学习总结

    20155227 2016-2017-2 《Java程序设计》第四周学习总结

    教材学习内容总结

    继承

    • 继承

    继承是Java程序设计语言面向对象的又一重要体现,允许子类继承父类,避免重复的行为定义。
    Java只支持单继承,不支持多继承,即子类只能继承一个父类,但是支持多层继承。继承的出现提高了代码的复用性,也让类与类之间产生了关系,提供了多态的前提。

    • extends

    在Java中,使用关键字extends来表示类与类之间的继承关系。如:

    public class Magician extends Role
    {
        public void fight()
        {
            System.out.println("魔法攻击");
        }
    

    表示Magician扩充Role的行为,即继承后者的行为。也就是类Role中有定义的程序代码,类Magician因为继承而都拥有了。而fight()为Magician扩充的Role没有的行为。

    • private

    private成员也会被继承,不过子类无法直接存取,必须通过父类提供的方法存取。

    is-a(是一种)关系

    子类只能继承一个父类,这种子类父类之间的关系就是is-a关系。
    检查语法逻辑是否正确,方式是从=右边往左读:判断右边是不是一种左边。

    强制让后者是一种前者:

    Role role1=new SwordsMan();SwordsMan swordsman=(SwordsMan) role1;
    

    多态

    多态指的是使用一个接口,操作多种类型的数据。例如以下代码中,既可以通过Role操作SwordsMan对象,也可以通过Role操作Magician对象。

    public class RPG2
    {
        public static void main (String[] args)
        {
            SwordsMan swordsMan = new SwordsMan();
            swordsMan.setName("Justin");
            swordsMan.setLevel(1);
            swordsMan.setBlood(200);
    
            Magician magician = new Magician();
            magician.setName("Moinca");
            magician.setLevel(1);
            magician.setBlood(100);
    
            showBlood(swordsMan);   //SwordsMan是一种Role
            showBlood(magician);
        }
        static void showBlood(Role role)   //声明为Role类型
        {
            System.out.printf("%s 血量 %d%n",role.getName(), role.getBlood());
        }
    }
    

    重新定义行为

    • 重新定义父类中某个方法时,子类必须撰写与父类方法中相同的签署。可以在子类中某个方法前使用@Override要求编译程序检查该方法是不是真的重新定义了父类中某个方法,如果不是会引发编译错误。
    • 对于父类中的方法权限,只能扩大不能缩小。

    抽象方法 抽象类

    • 抽象方法:某方法区块中没有任何程序代码操作,用abstract表示该方法为抽象方法,不用撰写{}区块,直接";"结束即可
    • 抽象类:内含抽象方法的类,一定要在class前标示abstract,表示类定义不完整,不能用来生成实例。

    protected

    • 被声明为protected的成员,相同包中的类可以直接存取,不同包中的类可以在继承后的子类直接存取。
    • private、无关键字、protected、public权限依次递增。

    构造函数

    • 类有继承关系时,会先进行父类定义的初始流程,再进行子类定义的初始流程。
      父类中可以重载多个构造函数,如果子类构造函数中没有制定执行父类中哪个构造函数,默认会调用父类中无参数构造函数。

    • this()和super()只能择一调用,并且要写在构造函数第一行执行。

    final

    class或方法被声明为final,表示这是最后一个,不会再有子类或子类不可以重新定义方法。

    Object

    java.lang.Object是最上层父类,Java中所有对象一定是一种Object。

    接口

    • 接口是一种特殊的类,里面全部是由全局常量(static final)和公共的抽象方法所组成。
    • 接口中的方法没有操作时一定得是公开且抽象的。
    • 类要操作接口必须用implements关键字。
    • 接口的数据成员,只允许被public, static, final修饰。
      接口的方法成员,只允许被public, abstract修饰。
    • 操作某接口时,对接口中定义的方法有2种处理方式,一是操作接口中定义的方法,二是再度将该方法标示为abstract.
    • 接口中的public abstract可以省略,但要注意:接口中的方法必须是“抽象方法”,不能有方法体,允许省略public及abstract关键字
    • 接口中可以使用extends继承接口,并且可以继承多个接口
      接口不能继承一个抽象类,却可以通过extends同时继承于多个接口。

    解决需求变化

    增加新的需求,原有的程序无需修改,只需针对新需求撰写程序,就是有弹性、具可维护性的程序。

    枚举常数

    使用enum:enum定义了特殊的类,继承自java.lang.Enum,由编译程序处理。

    匿名内部类

    临时继承某个类或操作某个接口并建立实例,由于这类子类或接口操作类只使用一次,不需要为这些类定义名称,可以使用匿名内部类。

    教材学习中的问题和解决过程

    • 1问题

    如果子类构造函数中没有指定执行父类中哪个构造函数,默认会调用父类中无参数构造函数,那要怎样指定调用哪个函数呢?

    • 1解决方案

    如果想执行父类中某构造函数,可以使用super()指定,要注意this()与super()只能选择一个调用,而且一定要在构造函数一一行执行。

    • 2问题

    第七章一开始就提到“别滥用继承”,继承不是可以提供很多方便吗?为什么不能多用?

    • 2解决方案

    带着疑问开始看第七章,看到第一个例子,“所有东西都会游泳”,如果不停地使用继承的方法,程序架构就越来越不合理,越来越没有弹性。这是因为Java中智能继承一个父类,所以更强化了“是一种”关系的限制性。继承是牵一发而动全身的东西,所以要慎用。这就解决了我关于“为什么不能滥用继承”的疑问。

    代码调试中的问题和解决过程

    • 1问题

    在编写继承相关的代码的时候不能调用父类的代码,无法编译成功。

    • 1解决方案

    在同一project下把父类编写之后,在编写人物代码时只要写了public class xxxxxx extends Role{} 它就会自动的调用父类Role的代码。

    代码托管

    • 代码提交过程截图:

    • 代码量截图:

    上周考试错题总结

    上周错的题还挺多的,但是很可惜有的错题记不住了。

    • 错题1:System.out.println(“”+52+25);的结果是(5225);System.out.println(52+25+“”);的结果是(77)。
    • 总结:考试的时候其实不太清楚“”+是什么意思,考完之后编译了一遍发现答案是5225,感觉很奇怪,看了狄维佳同学的博客之后才清楚。原来是因为System out println(""+i);等价于System.out.println(i.toString());。public String toString()返回该对象的字符串表示。通常,ToString()方法会返回一个“以文本方式表示”此对象的字符串。因此在本题中以字符串形式输出5225。
    • 错题2:“30”转化为byte类型的30的语句是(Byte.parseByte(“30”);)
    • 总结:查询API文档可知,java.lang.Byte.parseByte()方法的作用是:将字符串参数转换为带符号的十进制数。

    其他(感悟、思考等,可选)

    通过这两章的学习,我对继承、多态和接口有了初步的了解。这些概念都是Java对象之间的一种关系。一周的时间虽然看完了书,写完了博客也照着书上敲了许多代码,但要消化这些知识还远远不够,所以还依赖于以后代码的实践与真正的应用。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 10/10 1/1 20/20
    第二周 98/108 1/2 20/40
    第三周 401/509 1/3 15/55
    第四周 700/1209 1/4 20/75

    尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
    耗时估计的公式
    :Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

    参考:软件工程软件的估计为什么这么难软件工程 估计方法

    参考资料

  • 相关阅读:
    UML——六大关系整理
    C#编写Windows 服务
    Centos7下lamp环境搭建的小笔记
    awk命令分析日志的简单笔记
    ssrf小记
    关于cookie的一些学习笔记
    xssbypass小记
    xss挑战赛小记 0x03(xssgame)
    xss挑战赛小记 0x01(xsstest)
    ubuntu下安装LAMP环境遇到的一些小问题
  • 原文地址:https://www.cnblogs.com/guyanlin/p/6574848.html
Copyright © 2011-2022 走看看