20145216史婧瑶《Java 程序设计》第4周学习总结

20145216 《Java程序设计》第4周学习总结

教材学习内容总结

第六章 继承与多态

6.1 何谓继承

  • 继承基本上就是避免多个类间重复定义共同行为。
  • 在Java中,继承时使用extends关键字,private成员也会被继承,只不过子类无法直接存取,必须通过父类提供的方法来存取(如果父类愿意提供访问方法的话)。如:
    public class SwordsMan extends Role
    {
      public void fight()
         {
           System.out.println("挥剑攻击");
         }
    }
    
  • 继承范例:
    public class RPG1
    {
      public static void main(String[] args)
        {
           demoSwordsMan1();
           demoMagician1();
        }
    
      static void demoSwordsMan1()
        {
           SwordsMan1 swordsMan1 = new SwordsMan1();
           swordsMan1.setName("Justin");
           swordsMan1.setLevel(1);
           swordsMan1.setBlood(200);
           System.out.printf("剑士:(%s,%d,%d)%n",swordsMan1.getName(),swordsMan1.getLevel(),swordsMan1.getBlood());
        }
    
      static void demoMagician1()
        {
           Magician1 magician1 = new Magician1();
           magician1.setName("Monica");
           magician1.setLevel(1);
           magician1.setBlood(100);
           System.out.printf("魔法师:(%s,%d,%d)%n",magician1.getName(),magician1.getLevel(),magician1.getBlood());
        }
    }
    
  • 继承的好处:若你要将name、level、blood改为其他名称,那就只要修改Role.java就可以了,只要是继承Role的子类都无须修改。
  • 在Java中,子类只能继承一个父类,继承有个重要的关系,就是子类与父类间会有is-a的关系,中文称为“是一种”的关系。
  • 检查多态语法逻辑是否正确,方式是从=右边往左读;右边是不是一种左边呢(右边类型是不是左边类型的子类)?如果不是就会编译失败,如果加上扮演(Cast)语法,编译程序就让程序代码通过编译,不过后果得自行负责,也就是扮演失败,执行时会抛出ClassCastException。
  • 多态就是使用单一接口操作多种类型的对象。
  • 在继承父类之后,定义与父类中相同的方法部署,但执行内容不同,这称为重新定义。如:

父类:

    public class Role3
    {
      ...
      public void fight()
        {
           //子类要重新定义fight的实际行为
        }
    }

子类:

    public class SwordsMan3 extends Role3
    {
       public void fight()
       {
          System.out.println("挥剑攻击");
       }
    }
  • 如果在子类中某个方法前标注@Override,表示要求编译程序检查,该方法是不是真的重新定义了父类中某个方法,如果不是的话,就会引发编译错误。
  • 如果某方法区块中真的没有任何程序中代码操作,可以使用abstract标示该方法为抽象方法,该方法不用撰写{}区块,直接“;”结束即可。
  • 子类如果继承抽象类,对于抽象方法有两种做法: 一种做法是继续标示该方法为abstract;另一种做法就是操作抽象方法。

6.2 继承语法细节

  • 被声明为protected的成员,相同包中的类可以直接存取,不同包中的类可以在继承后的子类直接存取。如:

父类:

    public abstract class Role5
    {
       protected String name;
       protected int level;
       protected  int blood;
       ...略
    }

子类:

    public class SwordsMan5 extends Role5
    {
       ...
       public String toString()
       {
            return String.format("剑士 (%s,%d,%d",this.name,this.level,this.blood);
       }
    }
  • Java中有public、protected与private三个权限关键字,但实际上有四个权限范围:
  • 在Java中,如果想取得父类中的方法定义,可以在调用方法前,加上super关键字。如:
    public class SwordsMan6 extends Role6
    {
       ...
       @Override
       public String toString()
       {
           return "剑士" + super.toString();
       }
    }
    
  • 重新定义方法要注意,对于父类中的方法权限,只能扩大但不能缩小。
  • 如果子类构造函数中没有指定执行父类中哪个函数,默认会调用父类中无参数构造函数。
  • this()与super()只选择一调用,而且一定要在构造函数第一行执行。
  • 如果class前使用了final关键字定义,那么表示这个类是最后一个了,不会再有子类,也就是不能被继承。定义方法时,也可以限定该方法为final,这表示最后一次定义方法了,也就是子类不可以重新定义final方法。
  • 在Java中,子类只能继承一个父类,如果定义类时没有使用extends关键字指定继承任何类,那一定是继承java.lang.Object。

第七章 接口与多态

7.1 何谓接口

  • 对于“定义行为”,在Java中可以使用interface关键字定义。如:

    public interface Swimmer1
    {
        public abstract void swim();
    }
    
  • 接口可以用于定义行为但不定义操作。
  • 类要操作接口,必须使用implements关键字。操作某接口时,对接口中定义的方法有两种处理方式:一是操作接口中定义的方法;二是再度将该方法标示为abstract。如:(第二种方法)
    public abstract class Fish1 implements Swimmer1
    {
        protected String name;
        public Fish1(String name)
        {
            this.name = name;
        }
    
        public String getName()
        {
            return name;
        }
        @Override
        public abstract void swim();
    }
    
  • 以Java的语意来说,继承会有“是一种”关系,操作接口则表示“拥有行为”,但不会有“是一种”的关系。
  • 在Java中,类可以操作两个以上的类,也就是拥有两种以上的行为。如:
    public class Seaplane3 implements Swimmer1,Flyer3
    {
        private String name;
        public Seaplane3(String name)
        {
            this.name = name;
        }
        @Override
        {
            System.out.printf("海上飞机 %s 在飞%n",name);
        }
        @Override
        public void swim()
        {
            System.out.printf("海上飞机 %s 航行海绵%n",name);
        }
    }
    
  • 在Java中,类可以同事继承某个类,并操作某些接口。如:
    public class FlyingFish3 extends Fish1 implements Flyer3
    {
        public FlyingFish3(String name)
        {
            super(name);
        }
    
        @Override
        public void swim()
        {
            System.out.println("飞鱼游泳");
        }
    
        @Override
        public void fly()
        {
            System.out.println("飞鱼会飞");
        }
    }
    
  • 在Java中,接口可以继承自另一个接口,也就是继承父接口行为,再在子接口中额外定义行为。如:

父类:

    public class Boat4 implements Swimmer1
    {
        protected String name;
        public Boat4(String name)
        {
            this.name = name;
        }

        @Override
        public void swim()
        {
            System.out.printf("船在水面 %s 航行%n", name);
        }
    }

子类:

    public class Submarine4 extends Boat4 implements Diver4
    {
        public Submarine4(String name)
        {
            super(name);
        }

        @Override
        public void dive()
        {
            System.out.printf("潜水艇 %s 潜行%n",name);
        }
    }

7.2 接口语法细节

  • 在Java中,可使用interface来定义抽象的行为与外观,如接口中的方法可声明为public abstract。
  • 接口中的方法没有操作时,一定得是公开且抽象。
  • 在接口中枚举常数,一定要使用=指定值。并且接口枚举常数一定是public static final。
  • 接口可以继承别的接口,也可以同时继承两个以上的接口,同样也是使用extends关键字,这代表了继承父接口的行为。
  • 如果有临时继承某个类或操作某个接口并建立实例的需求,而这类子类或接口操作类只使用一次,不需要为这些类定义名称,这是可以使用匿名内部类来解决这个需求。匿名内部类的语法为:
    new 父类()|接口(){
             //类本体操作
    };
    
  • enum实际上定义了类,而enum中枚举的常数,实际上是public static final,且为枚举类型实例,无法撰写程序直接实例化枚举类型,因为构造函数权限设定为private,只要类中才可以实例化。如:
    import static java.lang.System.out;
    
    public class EnumGame
    {
        public static void main(String[] args)
        {
            play(EnumAction.RIGHT);
            play(EnumAction.UP);
        }
    
        public static void play(EnumAction action)
        {
            switch (action)
            {
                case STOP:
                    out.println("播放停止动画");
                    break;
                case RIGHT:
                    out.println("播放向右动画");
                    break;
                case LEFT:
                    out.println("播放向左动画");
                    break;
                case UP:
                out.println("播放向上动画");
                    break;
                case DOWN:
                out.println("播放向下动画");
                    break;
            }
        }
    }
    

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

问题:

在结合教材、视频和老师博客中的学习指导学习了第六、七章后,发现对于老师给出的思考题——接口与抽象类的区别还是不太清楚。

解决过程:

通过上网百度,我终于弄明白了接口与抽象类的区别,以下是我根据查找的资料总结的二者区别:

  • 语法层面上的区别

    1、抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract方法;
    
    2、抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
    
    3、一个类只能继承一个抽象类,而一个类却可以实现多个接口。
    
  • 设计层面上的区别
    1、抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象;抽象类是对整个类整体进行抽象,包括属
    性、行为,但是接口却是对类局部(行为)进行抽象。
    
    2、对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接
    口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。
    

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

问题:

由于教材中的很多范例代码的类名都相同,于是我在类名后编上了号,结果自己敲完代码后出现如图所示错误:

解决过程:

经过反复查看错误代码,我发现该代码中的声明类型(Role)没有与父类的类名(Role1)保持一致,于是我做了以下修改:

最后运行得到正确结果:

总结:

给类名编号后虽然解决了类名重复的问题,但是在敲代码时特别容易出错,因为很多程序代码都是相关联的,必须始终保持创建时的类名和引用时的名称一致,所以在敲代码时一定要细心,并且要先弄懂每行代码的含义,这样才能尽量避免代码中的错误。

本周代码托管截图

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

本周主要学习了继承与接口的相关知识点,虽然内容较多,对我来说也有一定难度,但是经过对教材的反复研读与琢磨,还是可以慢慢理解和掌握的,当然我也有过因为理解不了代码的含义而烦躁的时候,也想过直接按照书上的代码敲,放弃理解不懂的内容,但是静下心来,还是决定要好好学这门课,其实教材的讲解很详细,代码实例也都与我们所熟悉的内容相关,比如第六章是游戏中的角色,第七章是开发一个海洋乐园游戏,还有类图以及其他的图片解释,这些都方便了我的理解,所以,尽管在学习Java的过程中有许多困难,但是只要自己不放弃就能一一解决问题。

学习进度条

  代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 4500行 30篇 350小时 能将java运用自如 
第一周 150/150 2/2 15/15 学习了与java相关的基础知识 
第二周 200/350 1/3 20/35
学习了java的基本语法

 第三周  450/800  1/4 25/60 
学习了对象和封装的相关知识

 第四周 687/ 1487  1/5 30/90 
学习了继承与接口的相关知识

参考资料

时间: 2024-10-10 18:19:42

20145216史婧瑶《Java 程序设计》第4周学习总结的相关文章

20145216史婧瑶《信息安全系统设计基础》第十一周学习总结

20145216史婧瑶<信息安全系统设计基础>第十一周学习总结 教材内容总结 第八章 异常控制流 平滑:指在存储器中指令都是相邻的. 突变:出现不相邻,通常由诸如跳转.调用.和返回等指令造成. 异常控制流ECF:即这些突变. 关于ECF: 1.ECF是操作系统用来实现I/O.进程和虚拟存器的基本机制 2.应用程序通过使用一个叫做陷阱或者系统调用的ECF形式,向操作系统请求服务 3.ECF是计算机系统中实现并发的基本机制 4.软件异常机制--C++和Java有try,catch,和throw,C

20145216史婧瑶《信息安全系统设计基础》第3周学习总结

20145216史婧瑶<信息安全系统设计基础>第3周学习总结 教材学习内容总结 十六进制表示法C表示法以0x或0X开头的数字常量为十六进制进制转换常用进制:二进制(B),十进制(D),八进制(O或者Q),十六进制(H) 转换为二进制-十六进制相互转换,二进制的四位数字对应十六进制的一位数字. 同理,二进制与八进制的转化是三位对应一位. 但是通常情况下,进制转换都以二进制为桥梁进行转换. 对于一个字长为w位的机器来说,虚拟地址的范围是0~2^w-1.程序最多访问2的w次方个字节. 数据大小: 在

20145216史婧瑶《信息安全系统设计基础》第九周学习总结

20145216史婧瑶<信息安全系统设计基础>第九周学习总结 教材内容总结 第十章 系统级I/O 输入/输出(I/O)是在主存和外部设备之间拷贝数据的过程. 第一节 Unix I/O 这一节涉及到操作系统的基本抽象之一--文件.也就是说,所有的I/O设备都被模型化为文件,而所有的输入输出都被当做对相应文件的读/写.相关的执行动作如下: 1.打开文件: 应用程序向内核发出请求→要求内核打开相应的文件→内核返回文件描述符 文件描述符:一个小的非负整数,用来在后续对此文件的所有操作中标识这个文件.有

20145216史婧瑶 《信息安全系统设计基础》第2周学习总结

20145216史婧瑶 <信息安全系统设计基础>第2周学习总结 教材学习内容总结 一.VIM 1.hjkl所表示的即为光标 ←↓↑→,前提是要在normal的状态下.方便记忆j像一个笔就像下箭头. ·i → Insert 模式,可插入文本.按 ESC 回到 Normal 模式. ·A → 输入欲添加文本(在一行后添加文本).按 ESC 回到 Normal 模式. ·x → 删当前光标所在的一个字符. ·:wq → 存盘 + 退出 (:w 存盘, :q 退出) 2.删除类命令: 该命令为操作符d

20145216史婧瑶《信息安全系统设计基础》第7周学习总结

20145216史婧瑶<信息安全系统设计基础>第七周学习总结 教材内容总结 第六章 存储器层次结构 存储器系统是一个具有不同容量.成本和访问时间的存储设备的层次结构. CPU寄存器.高速缓存存储器.主存储器.磁盘. 第一节 存储技术 一.随机访问存储器(RAM) 1.RAM分类: 静态的SRAM-更快,更贵,作为高速缓存存储器,CPU片上或片下 动态的DARM-作为主存以及图形系统的帧缓冲区 2.非易失性存储器--ROM (1)分类 PROM-可编程ROM,只能被编程一次 EPROM-可擦写可

20145216史婧瑶《信息安全系统设计基础》第6周学习总结

20145216史婧瑶<信息安全系统设计基础>第6周学习总结 教材内容总结 第四章 处理器体系结构 第一节 Y86指令集体系结构 一.程序员可见的状态 1.含义:每条指令都会读取或修改处理器状态的某些部分 2."程序员":可以是用汇编代码写程序的人,也可以是产生机器级代码的编译器 3.具体的处理器状态:类似于IA32 有8个程序寄存器:%eax,%ecx,%edx,%ebx,%esi,%edi,%esp,%ebp 处理器的每个程序寄存器存储一个字 寄存器%esp被入栈.出栈

20145216史婧瑶《网络对抗》Web安全基础实践

20145216史婧瑶<网络对抗>Web安全基础实践 实验问题回答 (1)SQL注入攻击原理,如何防御 攻击原理: SQL注入攻击指的是通过构建特殊的输入作为参数传入web应用程序,而这些输入大都是SQL语法里的一些组合,程序通过执行SQL语句进而执行攻击者所要的操作.其主要原因是程序没有细致的过滤用户输入的数据,致使非法数据侵入系统. 防御方法: 对输入的数据进行过滤,将常见的sql语句的关键词:select or ' " 等字符进行过滤. 对在数据库中对密码进行加密,验证登陆的时

20145216史婧瑶《网络对抗》网络欺诈技术防范

20145216史婧瑶<网络对抗>网络欺诈技术防范 实验问题回答 (1)通常在什么场景下容易受到DNS spoof攻击 攻击者能对在同一网段可以ping通的电脑发起DNS spoof攻击,所以一般在连接公用Wi-Fi的情况下电脑容易受到DNS spoof攻击. (2)在日常生活工作中如何防范以上两种攻击方法 1.尽量避免连接公用Wi-Fi2.在访问网站时注意观察它的IP地址 实验总结与体会 这次实验我遇到了许多问题,第一个是我做简单应用SET工具建立冒名网站这个实验的时候,第一次克隆的是腾讯页

20145216史婧瑶《网络对抗》逆向及Bof进阶实践

20145216史婧瑶<网络对抗>逆向及Bof进阶实践 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢出,覆盖成为指向 shellcode的地址. Linux中两种基本构造攻击buf的方法:retaddr+nop+shellcode ,nop+shellcode+retaddr ,缓冲区小就就把shellcode放后边,不然就放前边. 实验步骤 1.准备一段shellcode代码 2.设置环境 Bof攻击防御

20145216史婧瑶 《网络对抗》 MSF基础应用

20145216史婧瑶 <网络对抗> MSF基础应用 实验回答问题 用自己的话解释什么是exploit,payload,encode. exploit:渗透攻击模块,测试者利用它来攻击一个系统,程序,或服务,以获得开发者意料之外的结果. payload:攻击载荷模块,由一些可动态运行在远程主机上的代码组成 encode:编码器模块,对指令重新进行编码,用以实现反检测功能.指令顺利执行等 实践过程 主动攻击(ms08_067漏洞) MS08_067远程漏洞攻击实践:Shell 1.在VMware