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

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


本周学习内容总结

1、根据《java2实用教程》和蓝墨云学习视频学习第四章;

2、尝试将课本疑难内容用自己的话复述手打;

3、输入课本代码并上传码云;

4、学习使用IDEA调试代码。


教材学习疑难内容总结

  • 5.1 子类和父类

    • 子类通过继承机制,继承父类的属性和行为并根据需要增加他自己的新的属性和行为。
      在类的声明中,使用关键字extends来定义一个类的子类,格式为
class 子类名 extends 父类名{
……
}
  • 子类只能有一个父类。若c为b的子类,b又是a的子类,则可称c是a的子孙类。
  • Java的类根据继承形成树状结构,根节点为object类,若无extends声名,则默认为object的子类。
  • 5.2 子类的继承性

    • 当子类和父类在同一个包中,子类可以继承父类中不是private访问权限的成员变量和方法作为自己的成员变量和方法,即继承public,protected和友好访问权限的成员变量和方法。
    • 当子类和父类不在同一个包中,子类只能继承public,protected访问权限的成员变量和方法。
    • Protected的进一步说明:假设b是a的子类,若c类用b类创建了一个对象,则对于该对象访问protected权限的成员变量和方法有以下判定:
    • 子类b自己声名的:只需和b在一个包内即可访问;
    • 子类b继承自父类a的:需上溯祖先类,即需与祖先类在同一个包中才可访问。
  • 5.3 子类与对象

    • 当用子类创建对象时,父类中的成员变量也将被分配内存空间,包括未被子类继承的部分。故而private即使未被子类继承,却仍可通过从父类中继承的操作private变量的方法操作private的变量。
  • 5.4 成员变量的隐藏和方法重写

    • 成员变量的隐藏:当声名一个与从父类继承的同名的成员变量时(类型任意),子类会隐藏所继承的成员变量,对这部分变量的操作遵循以下原则:
    • 子类自己编写的方法操作的一定是子类自己声名的那个成员变量;
    • 继承自父类的方法操作的一定是被隐藏的继承自父类的成员变量。
    • 方法重写:如果子类有权限继承某个方法,则子类可以通过方法重写原则重写这个方法,方法重写即定义一个与父类方法拥有相同的名字,方法类型(或其子类型),参数个数,参数的类型的方法,当这样的方法被定义,则原父类方法被隐藏,且被调用的方法默认为重写方法。
    • 重写方法拥有操作继承的成员变量,调用继承方法,操作子类变量及方法等权限,但无法操作被隐藏的成员变量和方法。
    • 若定义的方法增加了参数,则视为方法重载,而非方法重写。
    • 方法重写不允许降低访问权限,但可提高访问权限(访问权限从高到低依次为public,protected,友好,private)。
  • 5.5 super关键字

    • 被隐藏的成员变量及方法可通过super关键字调用,格式为super . x、super . y();
    • 当调用子类的构造方法时,默认调用父类的某个构造方法。由于子类不继承父类的构造方法,故而子类在其构造方法中需要用super来调用父类的构造方法,且Super语句应在构造方法的第一行。
    • 若无声名super,则默认为super(),即调用父类中无参数的构造方法。
    • 当父类定义了多个构造方法时,应有一个无参数构造方法,以防止子类省略super时出错。
  • 5.6 final关键词

    • final关键词可以修饰类、成员变量和方法中的局部变量。
    • final类无法被继承,声名格式为
final class A{
……
}
  • final方法无法被重写,即不允许子类隐藏所有可被继承的final方法,不允许做任何篡改。

  • 被final修饰的成员变量和局部变量等同于常量,常量在运行期间不允许再发生变化,没有默认值,故而必须在声名final变量时就指定其值。

  • 5.7 上转型变量

    • B是A的子类或间接子类,当我们用子类B创建一个对象,并把这个对象的引用放到类A声明的对象中时,如
A a;
B b=new B();
a=b;

那么,就称对象a是子类对象b的上转型对象。

  • 上转型对象不能操作子类声明定义的成员变量,不能使用子类声明定义的方法。

  • 上转型对象可以代替子类对象去调用子类重写的实例方法。如果子类重写的方法是实例方法,那么上转型对象调用重写的方法时,就是通知对应的子类对象去调用这些方法。因此,如果子类重写了父类的某个实例方法后,子类对象的上转型对象调用这个方法时,一定是调用了这个重写的方法。

  • 上转型对象可以调用子类继承的成员变量和隐藏的成员变量。

  • 若将对象的上转型对象再强制转换到一个子类对象,这时该子类对象又具备了子类的所有属性和功能。

  • 5.8 abstract类和abstract方法

    • abstract类:表达概念而无法构造出实体的类,且不能生成对象,通常被继承。abstract类声名格式为
abstract class A{
                …
}
  • abstract方法:表达概念而无法实现具体代码的方法。abstract方法声名形如
abstract int min(int x,int y);
  • abstract方法只允许声名,不允许实现,即abstract方法没有方法体,不允许使用static修饰abstract方法,即abstract方法必须是实例方法。

  • abstract类中可以没有abstract方法,也可以同时有abstract方法和普通方法,但非abstract类中不可以有abstract方法。

  • abstract类不能被实例化,所以无法对抽象类进行new。

  • 继承自abstract类的非abstract类子类必须重写以实现父类中的抽象方法,若子类也是abstract类,则可重写也可继承。

  • abstract不和可以和final一同使用:被final修饰后的类不能出现子类,而abstract的类需要子类来重写方法(不然毫无意义)。

  • abstract不和可以和private一同使用: 当用private修饰抽象函数的时候,子类继承会无法重写父类的抽象方法(private不被子类继承)。

  • 可以使用abstract类声名对象,尽管不能new,但可成为其子类的上转型对象,则该对象可以继承父类的abstract方法。

  • 5.10 面对抽象编程

    • abstract类只关心操作,而不关心这些操作具体的实现细节,由此可以分割设计者和具体实现者的职能,即避免设计者把大量的时间和精力花费在具体的算法上。
    • 在设计一个程序时,可以通过在abstract类中声明若干个abstract方法,表明这些方法在整个系统设计中的重要性,方法体的内容细节由它的非abstract子类去完成。
    • 使用多态进行程序设计的核心技术之一是使用上转型对象,即将abstract类声明的对象作为其子类对象的上转型对象,那么这个上转型对象就可以调用子类重写的方法。
    • 所谓面向抽象编程,是指当设计某种重要的类时,不让该类面向具体的类,而是面向抽象类,即所设计类中的重要数据是抽象类声明的对象,而不是具体类的声明的对象。
  • 5.11 开-闭原则(参考博客https://blog.csdn.net/m0_37450089/article/details/81607492)

    • 定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
    • 在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。
    • 开闭原则即提倡用抽象构建框架,用实现扩展细节。因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。而软件中易变的细节,我们用从抽象派生的实现类来进行扩展,当软件需要发生变化时,我们只需要根据需求重新派生一个实现类来扩展就可以了。
    • 实际上,绝对封闭的系统是不存在的,无论模块是怎么封闭,到最后,总还是有一些无法封闭的变化,而我们的思路就是:既然不能做到完全封闭,那我们就应该对那些变化封闭,那些变化隔离做出选择。我们做出选择,然后将那些无法封闭的变化抽象出来,进行隔离,允许扩展,尽可能的减少系统的开发。当系统变化来临时,我们要及时的做出反应。
    • 当变化到来时,我们首先需要做的不是修改代码,而使尽可能的将变化抽象出来进行隔离,然后进行扩展。面对需求的变化,对程序修改应该是尽可能的通过添加代码来实现,而不是通过修改代码来实现。

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


代码托管


posted @ 2019-03-23 20:09  20175214lzc  阅读(165)  评论(0编辑  收藏  举报