本周主要学习了继承的相关知识:
1.继承在父类和子类之间创建了一种“是”关系,即子类是一种更具体的父类版本
2.继承具备单向性
3.父类的私有方法或变量不能在子类中访问
4.protected可见性提供了容许继承的最大可能的封装性。
5.使用super引用能够调用父类的构造方法,用super引用调用父类构造方法的操做只能在子类中执行,且必须在第一行执行,super引用也能够引用父类的其余变量和方法。
6.Java语言设计者明确决定不支持多继承。能够依靠接口提供多继承的最好特性而不增长歧义。
7.能够用final修饰符定义一个方法,子类将不能重写final方法。这种技术用于保证子类必须使用的一个特定方法。
8.在类层次结构中,应当合理地将类的公共特征保持在尽量高的类层次级上,从而最大化复用现有类的可能性,有助于软件的维护。
9.继承机制具备传递性。
10.全部的Java类都直接或间接地由Object类派生,Java程序的每个类都继承toString方法和equals方法。重写Object类的toString方法和equals方法通常是为了知足用户本身的需求。
11.抽象类的引入。
12.类的继承和接口的继承不能重叠,即接口不能用于派生新类,类不能用于派生接口,仅当一个类设计为实现一个接口时,这个实现类和接口之间才有交互。
13.父类的私有成员也被子类继承,虽然不能以成员名直接访问,可是能够间接的访问。php
package com.lib.ThinkInJava.mutilExtends; public interface Lethal { void kill(); } package com.lib.ThinkInJava.mutilExtends; public interface Monster { void destroy(); } package com.lib.ThinkInJava.mutilExtends; public interface Vampire extends Monster, Lethal { void drinkBlood(); }
Vampire接口继承了Monster,Lethal俩个接口,并且使用了关键字extends,这就是java中的多继承。
参考资料:
java中的多继承
java接口多继承html
问题2:对影子变量的概念理解模糊java
问题2解决方案:查阅资料了解到:
1.在一个类中,子类中的成员变量若是和父类中的成员变量同名,那么即便他们类型不同,只要名字同样。父类中的成员变量都会被隐藏。在子类中,父类的成员变量不能被简单的用引用来访问。而是,必须从父类的引用得到父类被隐藏的成员变量,通常来讲,咱们不推荐隐藏成员变量,由于这样会使代码变得难以阅读。其实,简单来讲,就是子类不会去重写覆盖父类的成员变量,因此成员变量的访问不能像方法同样使用多态去访问。git
2.同名的实例方法被覆盖 ,同名的静态方法被隐藏 ,child类的getName实例方法覆盖 了parent的getName实例方法,chind的getKind方法隐藏 了parent类的getKind方法web
3.隐藏 和覆盖 的区别在于,子类对象转换成父类对象后,可以访问父类被隐藏 的变量和方法,而不能访问父类被覆盖 的方法数组
4.若是须要访问父类被隐藏 的实例变量,加上super就行了,好比访问父类的name,写上super.name就行了
参考资料:
JAVA中方法和变量在继承中的覆盖和隐藏数据结构
问题3: 对课本上的抽象类概念理解模糊函数
问题3解决方案:经过查阅资料了解到该知识点与下一章的多态方面的知识联系密切。
抽象类就是为了继承而存在的,若是你定义了一个抽象类,却不去继承它,那么等于白白建立了这个抽象类,由于你不能用它来作任何事情。对于一个父类,若是它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不一样的实现,那么就能够将这个方法声明为abstract方法,此时这个类也就成为abstract类了。
抽象类和普通类的主要有三点区别:学习
1)抽象方法必须为public或者protected(由于若是为private,则不能被子类继承,子类便没法实现该方法),缺省状况下默认为public。测试
2)抽象类不能用来建立对象;
3)若是一个类继承于一个抽象类,则子类必须实现父类的抽象方法。若是子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。
参考资料:
深刻理解Java的接口和抽象类
Java中的抽象类
方法2:间接引用Coin类中的private变量face(不须要将private改成protected),方法是在Coin类中定义得到face的getFace()
方法 ,改事后的Coin类截图以下:
flip()
方法。修改以后的MonetaryCoin类的截图以下:
修改以后的测试代码截图以下:
问题3:在实例化pp9.1项目中MonetaryCoin类时出现意料以外的错误,截图以下:
问题3解决方案:仔细检查以后发现开头少了public static void main(String[] args) {
,改事后的截图以下:
错题1
理解:在Java中,数组被实现为对象。
错题2 理解:若是一个int数组做为参数传递给方法,
int[] a
可为方法头定义参数列表
错题3 理解:语句保留了1000个引用变量的内存空间。注意,1000个BankAccount对象都没有实例化。
错题4 错因:不熟悉数组的定义方法的细节
关于数组的一些知识: int []a,b;
是声明了a和b两个整数型数组;int a,b[];
是声明了一个整数型变量a和一个整数型数组b;int []a;
和int a[]
是等价的,都是声明一个整型数组a。
int[]a =new int[10]
这条语句是对整数型数组a进行了实例化;给数组中每一个索引处赋值叫作对数组进行初始化。
错题5 理解: 直接将数组a变为数组b,也就是直接创造了一个新的数组,而不是复制。
错题6 理解:C项的意思为:初始化列表有4个int值,初始化意味着赋值。
错题7 理解:在java命令以后,在命令行输入的任何内容都将被接受为命令行参数。Java主方法使用参数(String[]变量),以便用户能够运行程序并提供“命令行”参数。因为参数是一个字符串数组,所以用户没必要提供任何参数。
错题8 理解:只要只访问ArrayList的元素,它的效率与数组的效率差很少。只有当一我的开始在ArrayList的前部分插入或移除元素时,它的效率才会恶化。ArrayList是做为数组实现的,只要其中一个只是访问ArrayList的元素,效率与数组的效率是同样的。可是,当对ArrayList的前部分进行插入或删除时,就会发生大量的元素复制,从而下降其效率。
结对学习内容 这周依旧没有一块儿讨论什么问题......多是时机未到吧!
继续坚持坚持坚持吧!
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 28/28 | 1/1 | 16/16 | |
第二周 | 710/738 | 1/2 | 20/36 | |
第三周 | 426/1164 | 1/3 | 16/52 | |
第四周 | 1068/2232 | 2/5 | 20/72 | |
第五周 | 604/2928 | 1/6 | 22/94 | |
第六周 | 609/3537 | 1/7 | 22/116 | |
第七周 | 599/4136 | 1/8 | 18/134 |
计划学习时间:20小时
实际学习时间:18小时
改进状况:坚持到底!