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)
- 定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
- 在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。
- 开闭原则即提倡用抽象构建框架,用实现扩展细节。因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。而软件中易变的细节,我们用从抽象派生的实现类来进行扩展,当软件需要发生变化时,我们只需要根据需求重新派生一个实现类来扩展就可以了。
- 实际上,绝对封闭的系统是不存在的,无论模块是怎么封闭,到最后,总还是有一些无法封闭的变化,而我们的思路就是:既然不能做到完全封闭,那我们就应该对那些变化封闭,那些变化隔离做出选择。我们做出选择,然后将那些无法封闭的变化抽象出来,进行隔离,允许扩展,尽可能的减少系统的开发。当系统变化来临时,我们要及时的做出反应。
- 当变化到来时,我们首先需要做的不是修改代码,而使尽可能的将变化抽象出来进行隔离,然后进行扩展。面对需求的变化,对程序修改应该是尽可能的通过添加代码来实现,而不是通过修改代码来实现。
教材学习中的问题和解决过程
-
问题1:子类创建对象时报错
-
问题1解决方案:原因是父类中没有不带参数的构造方法,且未用super关键词声名使用哪个构造方法。
super在调用父类的构造方法是默认调用的是父类中不带参数的构造方法,因此在编写程序时应注意在父类中编写一个不带参数的构造方法避免出现错误。 -
问题2:在windows中使用git push时报错Git: Push rejected
-
问题2解决方案:输入
git status
检查,发现是由于之前在码云线上删除了以前误上传的文件,在IDEA中update
仓库,再次git push
后成功。 -
问题3:不理解什么是面对抽象编程
-
问题3:为什么abstract不和可以和final一同使用
-
问题3解决方案:被final修饰后的类不能出现子类,而abstract的类需要子类来重写方法(不然将毫无意义)。
代码托管