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》学习笔记(二)的更多相关文章

  1. Stealth视频教程学习笔记(第二章)

    Stealth视频教程学习笔记(第二章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...

  2. Stealth视频教程学习笔记(第一章)

    Stealth视频教程学习笔记(第一章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...

  3. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  4. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  5. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  6. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

  7. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  8. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  9. 《SQL必知必会》学习笔记二)

    <SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...

  10. NumPy学习笔记 二

    NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...

随机推荐

  1. Kafka监控安装

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  2. MVC 统一异常处理

    在出现异常时,我们不希望将错语的原因让客户看见,常常会做一个404错误页面,将所有发生的异常都跳至该页面,并把异常信息写在日志中.步骤如下: 1.让我们看看Global.asax页面Applicati ...

  3. Linux 用户组及用户管理

    查看所有组的信息:(信息保存在/etc/group文件中) 其中每段信息用:分割 ,每段的含义如下: 用户名组名:密码:用户组的id:用户组所包含的用户(多个用户用,分割) 查看所有的用户信息:(信息 ...

  4. python来写打飞机

    准备用python写一个打飞机的游戏,相信能够写完这个项目,我对python的学习应该也算可以了. 首先,我们要使用python的一个pygame的库来写,这个库的安装比较简单就是普通的pip安装就可 ...

  5. python对象的基本操作代码

    基础: #对象.方法() # a=1 # b=a # a=2 # # _a=2423 # # print(a) # print(b) # # print(False and False) # prin ...

  6. 从零开始学习前端开发 — 6、CSS布局模型

    一.css布局模型 1.流动模型(Flow) 元素在不设置css样式时的布局模型,是块元素就独占一行,是内联元素就在一行逐个进行显示 2.浮动模型(Float) 使用float属性来进行网页布局,给元 ...

  7. 阿里云邮件服务器怎么设置才能在QQ邮箱访问,互发邮件?

    必须要在阿里云邮上打开IMAP和SMTP IMAP能够代发代收.在线更改.垃圾拦截,比POP3好: 记住打开的协议号: IMAP:143 带SSL:993 SMTP: 25 带SSL:465 前提是能 ...

  8. vue 开发2017年变化回顾及2018年展望

    vue.js 变化 从 github 的发布记录我们可以看到2017年 vue.js 的第一个发布为 v2.1.9,最后一个为 v2.5.13,主要发布小版本 2.2~2.5.这些发布提升了vue 与 ...

  9. xss防御

    http://blog.csdn.net/ghsau/article/details/17027893

  10. C# 处理Word自动生成报告 四、程序处理

    C# 处理Word自动生成报告 一.概述 C# 处理Word自动生成报告 二.数据源例子 C# 处理Word自动生成报告 三.设计模板 C# 处理Word自动生成报告 四.程序处理 现在说一下程序处理 ...