《java JDK7 学习笔记》之继承与多态
1、面向对象中,子类继承父类,避免重复的行为定义,不过并非为了避免重复定义行为就使用继承。应该正确判断使用继承的时机及继承之后灵活的运用多态,才是学习继承时的重点。
2、程序代码重复在程序设计上,就是不好的信号,多个类间出现重复的程序代码时,设计上可考虑的改进方式之一,就是把相同的程序代码提升为父类。
3、在java中,继承时使用extends关键字,private成员也会被继承,只是子类无法直接存取private成员的值,必须通过父类提供的Getting/Setting方法来存取(如果父类愿意提供访问方法的话)。
4、在java中,子类只能继承一个父类,父类却可以被多个子类继承。继承有个重要的关系,就是子类与父类间会有is-a的关系。
5、检查多态语法逻辑是否正确,方式是从=号右边往左读:右边是不是一种左边呢(右边类型是不是左边类型的子类)?如果不是就会编译失败,如果加上扮演(CAST)语法,编译程序就让程序代码通过编译,不过后果得自行负责,也就是扮演失败,执行时会抛出ClassCastException。
6、多态,以抽象讲法解释:就是使用单一接口操作多种类型的对象。
7、如果某方法区块中真的没有任何程序代码操作,可以使用abstract标识该方法为抽象方法,该方法不用撰写{}区块,直接以“;”结束即可。类中若有方法没有操作,并且标识为abstract,表示这个类定义不完整,定义不完整的类就不能用来生成实例。java中规定内含抽象方法的类,一定要在class前标识abstract,表示这是一个定义不完整的抽象类。
8、被声明为protected的成员,相同包中的类可以直接存取,不同包中的类可以在继承后的子类中直接存取。
9、java中有public、protected、默认包权限与private四个权限范围。
10、如果想取得父类中的方法定义,可以在调用方法前,加上super关键字。重新定义方法要注意,对于父类中的方法权限,只能扩大但不能缩小。在JDK5之后,重新定义方法时,如果返回类型是父类中方法返回类型的子类,也可以通过编译。
11、如果子类构造函数中没有指定执行父类中哪个构造函数,就会默认调用父类中的无参构造函数。如果想执行父类中的某构造函数,可以使用super()指定。this()与super()只能选择一个调用,而且一定要在构造函数第一行执行。
12、如果class前使用了final关键字定义,那就表示这个类是最后一个了,不会再有子类,也就是不能被继承。定义方法时,也可以限定该方法为final,这表示最后一次定义方法了,就是子类不可以重新定义final方法。
13、如果定义类时没有使用extends关键字指定继承任何类,那一定是继承了java.lang.Object。在java中,任何类追溯至最上层父类,一定就是java.lang.Object。
14、对于不再有用的对象,JVM有垃圾收集机制,收集到的垃圾对象所占据的内存空间,会被垃圾收集器释放。执行流程中(也就是线程中),无法通过变量参考的对象,就是GC认定的垃圾对象。
课后练习选择题:
1、class Some{
void doService(){
System.out.println(“some service”);
}
}
class Other extends Some{
@Override
void doService(){
System.out.println(“other service”);
}
}
public class Main{
public static void main(String[] args){
Other other = new Other();
other.doService();
}
}
一下描述正确的是:显示other serivce。
2、承上题,如果main()中改为:
Some some = new Other();
some.doService();
以下描述正确的是:显示other service;
3、class Some{
String ToString(){
return “Some instance”;
}
}
public class Main{
public static void main(String[] args){
Some some = new Some();
System.out.println(some);
}
}
以下描述正确的是:显示Some@xxx,xxxx为16位进制数字。
4、class Some{
int hashCode(){
return 99;
}
}
public class Main{
public static void main(String[] args){
Some some = new Some();
System.out.println(some.hashCode());
}
}
以下描述正确的是:编译错误。
注:hashCode()不是public修饰的,编译报错。
5、class Some{
@Override
String ToString(){
return “Some instance”;
}
}
public class Main{
public static void main(String[] args){
Some some = new Some();
System.out.println(some);
}
}
以下描述正确的是:编译失败。
注:@Override重写注解,但是toString()的方法名没写对,也没有添加public修饰符。
6、class Some{
abstract void doService();
}
class Other extends Some{
@Override
void doService(){
System.out.println(“other service”);
}
}
public class Main{
public static void main(String[] args){
Some some = new Other();
some.doService();
}
}
以下描述正确的是:编译失败。
注:凡是拥有abstract方法的类都是抽象类,class 前必须加加abstract关键字。
7、class Some{
protected int x;
Some(int x){
this.x = x;
}
}
class Other extends Some{
Other(int x){
this.x = x;
}
}
以下描述正确的是:Other类无法调用父类的构造函数编译失败。
8、 public class IterableString extends String{
…..
}
以下描述正确的是:因无法继承String的编译失败。
注:java.lang.String;该类是final类型的,不允许被继承。
9、class Some{
Some(){
this(10);
System.out.println(“Some()”);
}
Some(int x){
System.out.println(“Some(int x)”);
}
}
class Other extends Some{
Other(){
super(10);
System.out.println(“Other()”);
}
Other(int y){
System.out.println(“Other(int y)”);
}
}
以下描述正确的是:
new Some()显示“Some(int x)”、“Some()”。
new Other()显示“Some(int x)”、“Other()”。
注:创建子类对象默认会调用父类无参构造函数。
10、class Some{
Some(){
System.out.println(“Some()”);
this(10);
}
Some(int x){
System.out.println(“Some(int x)”);
}
}
class Other extends Some{
Other(){
super(10);
System.out.println(“Other()”);
}
Other(int y){
System.out.println(“Other(int y)”);
}
}
以下描述正确的是:编译失败。
注:在构造函数中无论是使用this()还是super()都要在构造函数的第一行。
《java JDK7 学习笔记》之继承与多态的更多相关文章
- 《java JDK7 学习笔记》之接口与多态
1.对于"定义行为"也就是接口,可以使用interface关键字定义,接口中的方法不能操作,直接标示为abstract,而且一定是public修饰的. 类要操作接口,必须使用imp ...
- Java编程思想学习笔记_2(继承和多态)
静态初始化: 静态初始化只在必要的时刻进行.(即当程序需要加载类进入内存的时候,执行静态初始化.静态变量和静态代码块的初始化顺序,按照在代码中声明的顺序老执行.例如:如果要执行某个public类,那么 ...
- 0022 Java学习笔记-面向对象-继承、多态、组合
继承的特点 单继承:每个子类最多只有一个直接父类,注意是直接父类,间接父类个数不限 注意父类的概念:A-->B-->C-->D,在这里,ABC都是D的父类,C是D的直接父类,AB是D ...
- 《java JDK7 学习笔记》之异常处理
1.java中所有的错误都会被打包为对象,JVM会尝试执行try区块中的程序代码,如果发生错误,执行流程会跳离错误发生点,然后比较catch括号中声明的异常类型,是否符合被抛出的错误对象类型,如果是的 ...
- 《java JDK7 学习笔记》之Collection
一.使用Collection 收集对象 1.认识Collection架构 Java SE提供了满足各种需求的API,在使用这些API前,建议先了解其继承与接口操作架构,才能了解何时使用哪个类,以及类之 ...
- 《java jdk7学习笔记》之java三大平台
Sun公司在2006年底,就将三大平台正名为java SE.java EE和java ME.也有很多人习惯用J2SE.J2EE和J2ME. 1.java SE java SE(标准版)是各应用平台的基 ...
- 《java JDK7 学习笔记》之对象封装
1.构造函数实现对象初始化流程的封装.方法封装了操作对象的流程.java中还可以使用private封装对象私有数据成员.封装的目的主要就是隐藏对象细节,将对象当做黑箱子进行操作. 2.在java命名规 ...
- 《java JDK7 学习笔记》之类和对象
1.在java中,要产生对象必须先定义类,类是对象的设计图,对象是类的实例.类定义时使用class关键词,建立实例对象要使用new关键词.以类名声明的变量,称为参考名称.参考变量或直接叫参考. 2.想 ...
- 《Java JDK7 学习笔记》课后练习题1
1.()组织负责监督审查Java相关技术规格的演进. A. JCP B. Apache C. EU D. W3C 2.Java技术规格必须以()正式文件提交审查. A. RFC B. JSR C. I ...
随机推荐
- ASP.NET CMS模板培训教程
注意:此文档中出现所有的类,都是公司内部的,也就是说,只是给公司内部人员培训的一篇文章而已,如果其他的人看到了, 看不懂里面的类,那是因为这都是我公司内部的框架. 首先是进入我们的系统的后台,然后选择 ...
- 【JUC】JDK1.8源码分析之Semaphore(六)
一.前言 分析了CountDownLatch源码后,下面接着分析Semaphore的源码.Semaphore称为计数信号量,它允许n个任务同时访问某个资源,可以将信号量看做是在向外分发使用资源的许可证 ...
- 导入android-support-v4.jar的方法
在导入使用了ViewPage,ActionBar,Fragment的工程后出现错误,很有可能是没有导入4.0版本的支持包. 正确导入方法为: 首先在Project->properties-> ...
- 用c#开发的一款webservice调用小工具,方便测试
本人经常与webservice打交道,webservice调用工具有soap ui,使用起来不是那么方便,所以我花了很长时间特意写了个小工具来调用Webservice方便测试,还有待进一步完善.使用方 ...
- C# GDI绘制矩形框,鼠标左键拖动可移动矩形框,滚轮放大缩小矩形框
最近工作需要,要做一个矩形框,并且 用鼠标左键拖动矩形框移动其位置.网上查了一些感觉他们做的挺复杂的.我自己研究一天,做了一个比较简单的,发表出来供大家参考一下.如觉得简单,可路过,谢谢.哈哈. 先大 ...
- http://www.mysqltutorial.org/python-mysql-query/
This tutorial shows you how to query data from a MySQL database in Python by using MySQL Connector/P ...
- python基础之运算符
算术运算符 运算符 描述 实例 + 加 - 两个对象相加 a + b 输出结果 31 - 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -11 * 乘 - 两个数相乘或是返回一个被重复 ...
- PHP常量
常量的定义 在PHP中,常量的声明是通过define()函数来定义的,它也是对大小写敏感的,按照一般的习惯PHP常量总是大写的,且不能再命名的常量之前加上$符号,在这里详细介绍一下define()函数 ...
- Lind.DDD.Caching分布式数据集缓存介绍
回到目录 戏说当年 大叔原创的分布式数据集缓存在之前的企业级框架里介绍过,大家可以关注<我心中的核心组件(可插拔的AOP)~第二回 缓存拦截器>,而今天主要对Lind.DDD.Cachin ...
- Windows8.1下安装NoSQL-- mongodb安装使用
1. 官方下载monodb:http://www.mongodb.org/downloads 现在最新版本3.0 2. 以下载Windows 64-bit为例官方最新版的没有分开, 32位和64位是应 ...