学号 2017-2018-20172309 《程序设计与数据结构》第7周学习总结

学号 2017-2018-20172309 《程序设计与数据结构》第7周学习总结

教材学习内容总结

  • 继承?
    1.继承是所有OOP(面向对象编程)不可或缺的部分。在Java语言中使用extends关键字来表示继承关系。在创建一个类时,总是在继承,若没有明确的指出要继承的类,总是隐式地使用Object进行继承。比如:

    >     class Thing
    >     {
    >       //whatever
    >      }
    > 与
    >      class Thing extends Object
    >      {
    >         //whatever
    >      }
    > 是一样的。
  1. 在Java中,只允许单继承。也就是说一个类做多只能显示地继承一个父类。但是一个类却可以被多个类继承,也就是说一个类可以拥有多个子类。
  2. 子类继承父类的成员变量。

    当子类继承了某个类之后,可以使用父类中的成员变量,但是不是完全继承父类中的成员变量。规则如下:
    1.能够继承父类的public和protected成员变量;不能够继承父类的private成员变量;//protected修饰符封装性介于public与private之间。声明为protected可见性变量和方法除了可被子类引用外,还可以由同一个包内的任何类使用
    2.对于父类的包访问权限成员变量,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
    3.对于子类可以继承的父类成员变量,如果在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。

  3. 子类继承父类之中的方法。

    同样的,子类也并非完全的继承父类中的方法,规则如下:
    1. 能够继承父类的public和protected成员方法;不能够继承父类的private成员方法;
    2. 对于父类的包访问权限成员方法,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
    3. 对于子类可以继承的父类成员方法,如果在子类中出现了同名称的成员方法,则称为覆盖现象,即子类的成员方法会覆盖掉父类的同名成员方法。如果要在子类中访问父类中同名成员方法,需要使用super关键字来进行引用。
  • super引用?
    1. 在子类中,父类的构造方法不能用对象名.方法名使用,但可用super引用调用父类的构造方法。
    2. 在继承关系之中,如果要实例化子类对象,会默认先调用父类构造,为父类之中的属性初始化,之后再调用子类构造,为子类之中的属性初始化

      >      class A {
      >         public A (String msg) {  //父类的构建
      >         System.out.println("*********************");
      >                                            }
      >                }
      >      
      >
      >         class B extends A  {
      >                public B()   {   //子类的构造
      >                System.out.println("####################");
      >                                  }
      >                      }
      >
      >
      >         public class TestDemo   {
      >                public static void main(String []args)  {
      >                  B b =new B(); //实例化子类对象
      >                             }
      >             }
      > 运行结果:
      >     ******************************
      >     ##############################   //这个时候虽然实例化的是子类对象,但是发现它会默认先执行父类构造,调用父类构造的方法体执行,而后再实例化子类对象,调用子类的构造方法。而这个时候,对于子类的构造而言,就相当于隐含了一个super()的形式.

      3.super主要有两种用法:

      1.super.成员变量/supe.成员方法;
      2.super(parameter1,paremeter2, ... );
      第一种用法主要用来在子类中调用父类的同名成员变量或者方法;第二种主要用在子类的构造器中显示地调用父类的构造器,要注意的是,如果是用在子类构造器中,则必须是子类构造器的第一个语句。

  • 抽象类:abstract;
  1. 在类定义声明头中,可用abstract修饰符将一个类声明为抽象类。包含一个或多个抽象方法的类必须被声明为抽象类。
  2. 每一个抽象方法都用abstract修饰符,但抽象类不必一定包含抽象方法。abstract只能修饰类和方法,不能修饰变量!
  3. 一般将抽象类设计在较高的类层次上。

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

  • 问题1:子类不能调用父类中的私有方法?那如何调用?
  • 问题1解决方案:废话不多说,上例子:

    >      public class Person {
    >             private String name;//name是私有的!!!
    >             public Person(String name) 
    >             {
    >               this.name=name;
    >             }
    >             public String getName()
    >             {
    >                return name;
    >             }
    >
    >
    >      public class Student extends Person { //Student类继承Person类
    >             private int id;
    >             public Student(String name, int id)
    >             {
    >               super(name)
    >               this.id = id ;
    >             }
    >       }//Student类内没name字段,但是它内部Person对象有,我们如何把它钓出来呢?
    >
    >
    >     public static void main(String []args) {
    >            Student s = new Student("你爸爸"99);
    >            System.out.println(s.getName());  //结果就是:你爸爸 
    >            System.out.println(s.name);         //此时出现错误:ERROR:name has private access in Person.
    >           } //我们不可以直接的得到name,但是可以间接的得到他 
  • 问题2:怎么理解抽象类,它的作用是什么?
  • 问题2解决方案:
    资料一 资料二

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

  • 问题1:在做习题PP9.1时,出现了运行成功,但都是反面的情况。
  • 问题1解决方案:

    出现这种情况我猜原因可能有两个:
    1. 根本就没有运行投硬币方法,导致值一直为初始值0.
    2. 运行了投硬币方法,且投出反面0后其他硬币也随之赋值为0.

解决这个问题我想只要多运行几次就行,如果一直都是反面那么久可以排除第二种情况了(因为只要投了,就会有正面的情况出现。除非你踩到狗屎了!)试了几次后可以确定是情况一了。但是问题出在哪里呢?子类代码:
运行代码:
想了许久发现上面两种情况都不是,是因为没有进行赋值!!!
才导致它的值一直为初始值0

  • 问题2:在做PP9.3的时候出现两个问题:
    • 1.我想用数组表示图书、小说、杂志、学术刊物
      java > int [] list ={1,2,3,4}; //数组初始值表里面可以直接放数字,那我可不可以这样呢? > String [] list ={books, novel, magazine, journal };
      答案是否定的!
      出现:
      出现上述错误是因为未对里面的元素进行初始化,只需要:
      1. 预期的输出结果是:

        books  有 100 页, 且有 200 个关键词。
        noval   有 200 页, 且有 300 个关键词。
        ...
    输出的的地址,我们应该编写一个方法让要表示的表示出来。即:toString()的方法
    才会出现预期的效果:

代码托管


上周考试错题总结

  • 错题1及原因,理解情况:

    对于第一种情况,a和b都将被声明 成数组。对于第二种,c和d都将被声明成整数,但对于d,他将被声明成数组。

  • 错题2及原因,理解情况:

    "="是个复制运算符,他会将右边的赋值给左边。当数组a与b中的每个元素都一样时,返回true,否则false.

  • 错题3及原因,理解情况:

    数组是对象,因此它们从对象类继承。对象类有一个toString方法。但是,对象的toString方法不返回存储在对象中的值,而是返回引用变量的值。因此,在数组中使用的toString不会返回存储在数组中的值,而是返回一组毫无意义的字符。

  • 错题4及原因,理解情况:

    索引只能时自然整数!!!!

  • 错题5及原因,理解情况:

    ArrayList是作为数组实现的,只要其中一个只是访问ArrayList的元素,效率与数组的效率是一样的。但是,当对ArrayList的前部分进行插入或删除时,就会发生大量的元素复制,从而降低其效率。

点评模板:

  • 博客中值得学习的或问题:
    • xxx
    • xxx
    • ...
  • 代码中值得学习的或问题:
    • xxx
    • xxx
    • ...
  • 基于评分标准,我给本博客打分:XX分。得分情况如下:xxx

点评过的同学博客和代码

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

这章比起前一章学起来比较吃力,个人感觉是这一章的东西太抽象化其实是自己的功力不够啦这章还真有抽象类、抽象方法/(ㄒoㄒ)/~~虽然这章难,但我不会让自己放弃的!这周的任务比较繁重,因为比平时多了五个实验。实验都是些以前没接触到的东西,让我印象最深刻的是实验四,因为为了它,我熬夜到了两点,发誓不弄好它不睡觉!!这个实验让我明白了toString()方法的重要性,也让我解决了上面PP9.3以前不能解决的问题。哈哈哈~~贼开心!

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 075/200 1/1 05/20
第二周 560/500 1/2 13/38
第三周 972/1000 1/4 21/60
第四周 694/1666 1/5 21/90
第五周 1544/3095 1/6 30/90
第六周 600/3627 1/7 30/120
第七周 544/4200 2/9 20/140

参考资料

1.继承的资料汇总
2.Java关键字中的super与this的区别
3.super关键字
4.

猜你喜欢

转载自www.cnblogs.com/dky-wzw/p/8900840.html