《Thinking in Java》学习笔记(二)
1.Java方法的重载
如果几个方法都有相同的名字,区分它们就需要重载来完成。
构成重载的种类:
1)形参的个数不同 2) 形参的类型不同 3) 形参的顺序不同
注意,返回值、抛出的异常和修饰符的不同是不能作为重载的依据的。
2.super和this
什么情况下需要用到this:
第一、通过this调用另一个构造方法,用法是this(参数列表),这个仅仅在类的构造方法中,别的地方不能这么用。
第二、函数参数或者函数中的局部变量和成员变量同名的情况下,成员变量被屏蔽,此时要访问成员变量则需要用“this.成员变量名”的方式来引用成员变量。当然,在没有同名的情况下,可以直接用成员变量的名字,而不用this,用了也不为错。
第三、在函数中,需要引用该函所属类的当前对象时候,直接用this。
什么情况下需要用到super:
第一、在子类构造方法中要调用父类的构造方法,用“super(参数列表)”的方式调用,参数不是必须的。同时还要注意的一点是:“super(参数列表)”这条语句只能用在子类构造方法体中的第一行。
第二、当子类方法中的局部变量或者子类的成员变量与父类成员变量同名时,也就是子类局部变量覆盖父类成员变量时,用“super.成员变量名”来引用父类成员变量。当然,如果父类的成员变量没有被覆盖,也可以用“super.成员变量名”来引用父类成员变量,不过这是 不必要的。
第三、当子类的成员方法覆盖(重写)了父类的成员方法时,也就是子类和父类有完全相同的方法定义(但方法体可以不同),此时,用“super.方法名(参数列表)”的方式访问父类的方法。
3.finalize关键字
JVM保证在一个对象所占用的内存被回收之前,如果它实现了finalize方法,则该方法一定会被调用。Object的默认finalize什么都不做,为了效率,GC可以认为一个什么都不做的finalize不存在。
用Java以外的代码编写的Class(比如JNI,C++的new方法分配的内存),垃圾回收器并不能对这些部分进行正确的回收,这时就需要我们覆盖默认的方法来实现对这部分内存的正确释放和回收(比如C++需要delete)。
如果不是调用了非Java的代码,finalize就不应过多的使用。
子类一旦复写了finalize(),必须调用super.finalize(),否则父类的finalize()不执行。
JVM的gc有minor GC和major GC(也就是大家说的Full GC),JVM会很频繁的做minor GC,如果内存块占满的话,JVM会做Full GC,Full GC是对整个JVM内存堆做GC,所示耗时比minor GC要长很多。
调用System.gc()也仅仅是一个向JVM的GC请求(建议),但是进行的是Full GC,所以System.gc()还是要少显示地调用。
4.运行时绑定(动态绑定)
子类重写父类中的方法,就会调用子类中的方法。
子类没有重写父类中的方法,就会调用父类中相应的方法。
动态绑定只是针对对象的方法,对于属性无效。
private、static、final的方法是无法动态绑定的。
调用子类的构造函数时会默认地调用父类无参的构造方法,若需要调用父类其他的构造方法,则需要显示地调用。
5.可变长参数
在调用方法的时候,如果能够和固定参数的方法匹配,也能够与可变长参数的方法匹配,则会调用固定参数的方法。
一个方法只能有一个可变长参数,并且这个可变长参数必须是该方法的最后一个参数,如:
public void print(int input,String...args ){...}是正确的,
而public void test(String... strings,int input){...}是不正确的。
6.Java方法的覆盖
(1)重写方法不能缩小访问权限;
(2)参数列表必须与被重写方法相同(包括显示形式);
(3)返回类型必须与被重写方法的相同或是其子类;
(4)重写方法不能抛出新的异常,或者超过了父类范围的异常,但是可以抛出更少、更有限的异常,或者不抛出异常。
覆盖只是针对方法的,变量是不能覆盖的。子类覆盖了父类的方法,在调用子类方法时就会运行时绑定,上面的第4条有说明。
package override;
public class People {
protected String name="people";
public String say(){
return "people method";
}
}
package override;
public class Student extends People {
protected String name="student";
@Override
public String say(){
return "student method";
}
public static void main(String[] args) {
People p=new People();
System.out.println(p.name);//运行结果为people
Student s=new Student();
System.out.println(s.name);//运行结果为student
People pp=new Student();
System.out.println(pp.name);//运行结果为people
System.out.println(pp.say()); //运行结果为student method
}
}
7.单例模式可以被继承吗?
子类的构造函数默认地会调用父类无参的构造函数。
饿汉式单例和懒汉式单例由于构造方法是private的,所以他们都是不可继承的,但是其他很多单例模式是可以继承的,例如登记式单例。
构造函数:1、方法名与类相同 2、不能有返回值 3、不能用static、final、sychronized、abstract和native修饰。
如果使用package语句,则该语句一定是除了注释之外的第一行代码。
虽然不是很常用,但是编译单元中可以没有public类型的类,这时文件是可以随意命名的。正常情况下只能存在一个public的类,且文件和该类同名。
如果父类只有一个有参数的构造函数,则子类构造函数的第一句只能是显示地调用父类的构造函数。
8.final关键字
使用final的三种情况:变量,方法和类
1>final变量
final变量在使用前必须被初始化。2个地方可以完成初始化动作:一是定义时,二是在每个构造方法中完成。
基本类型的final值是不能被改变的,对象的final是指引用是不能改变的,引用的属性还是可以改变的。
final Person p = new Person();
p = new Person() ; // error
p.setName("new name"); //ok
p.setName("another name"); //ok
既是final又是static的值被称为常量,常量用大写字母表示,用下划线分割每个单词,例如:
2>final方法
早期的Java版本中final方法用于提高运行效率,但是JDK5之后,已经不再需要使用final方法来进行效率的优化了。
final用于方法的唯一的原因就是不希望方法被子类所覆盖。
private方法隐式地指定为final型,给private方法加上final修饰词是无意义的。
3>final类
处于某种考虑,类的设计不需要做出任何变动,或者出于安全的考虑,不希望类有子类,这时可以将类定义为final的。
《Thinking in Java》学习笔记(二)的更多相关文章
- Stealth视频教程学习笔记(第二章)
Stealth视频教程学习笔记(第二章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...
- Stealth视频教程学习笔记(第一章)
Stealth视频教程学习笔记(第一章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- JMX学习笔记(二)-Notification
Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- Java IO学习笔记二
Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...
- 《SQL必知必会》学习笔记二)
<SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...
- NumPy学习笔记 二
NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...
随机推荐
- hdu_1012(水题。。。不能再水)
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using ...
- Flexbox 练习和总结
练习地址: http://flexboxfroggy.com/ Welcome to Flexbox Froggy, a game where you help Froggy and friends ...
- ECharts插件的使用
ECharts插件:官网下载echarts.js开发者可以选择源码.下载地址:http://echarts.baidu.com/download.html 下载之后,echarts.js放在js文件夹 ...
- 算法-java代码实现希尔排序
希尔排序 第8节 希尔排序练习题 对于一个int数组,请编写一个希尔排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组.保证元素小于等于2000. 测试样例: [1,2 ...
- linux CentOS部署【minimal 】
1.为什么选择CentOS不选择其他版本:http://www.cnblogs.com/TeemoHQ/p/6377260.html 2.准备的资源:VMware[官网下载],CentOS镜像 [阿里 ...
- dig命令
dig(域信息搜索器)命令是一个用于询问 DNS 域名服务器的灵活的工具.它执行 DNS 搜索,显示从受请求的域名服务器返回的答复.多数 DNS 管理员利用 dig 作为 DNS 问题的故障诊断, ...
- 一键批量打印EXCEL、WORD文档
一键批量打印EXCEL.WORD文档,本方法也可以打印同一个文档N份,可以批量打印A3.A4文档,包括单.双面打印等.希望能帮到广大朋友.请大家注重原创版权,不得在未经许可的下转载.传播,或者用来对同 ...
- iOS的相对路径和绝对路径
iOS程序有固定的文件访问限制,只能在自己的沙盒内. UIImage *img=[UIImage imageNamed:@"cellicon.png"]; 这段代码从相对路径加载了 ...
- vue源码入口文件分析
开发vue项目有段时间了, 之前用angularjs 后来用 reactjs 但是那时候一直没有时间把自己看源码的思考记录下来,现在我不想再浪费这 来之不易的思考, 我要坚持!! 看源码我个人感觉非常 ...
- 【备忘】MVC5 布署在windows2008 IIS7.5 出现的问题解决
MVC5布署到 windows2008 IIS7.5上,发现打不开(404),估计是URL重定向有问题... 本地开发环境是,win8+vs2013,MVC5是vs2013安装好后自带的... 好像记 ...