概述

两个对象同时调用一个方法,那么jvm怎么知道是哪个方法调用的呢. 我们在书写的时候会写成a.fun(1) 或者b.fun(1)如果按照更容易理解的角度来看的话,或许可以写成:
Banana.fun(a,1)这样就更符合OOP的”发送消息给对象”的原则了. 但是java帮助我们做了很多事情,在调用每个方法的时候,默认第一个传入的参数就是调用该方法的对象的引用. 让我们可以写成a.fun(1).
理解了函数调用的方法,那么对于this就很好理解了. this是一个特殊的引用. 它表示调用方法的那个对象.

在一个类的内部调用该类的其他方法,可是省略this,因为编译器会自动添加”this”

埃尔克,埃大爷说在一个类的内部调用该类的其他方法的时候,不建议写this. 因为编译器已经自动帮你做了这个事情,你还去写,你是不是傻. 但是,我还是觉得,至少看上去代码格式比较统一,而且我的eclipse的自动提示触发只保留了”.”,写this.会自动提示…既然没有什么性能上的区别,这个就看个人风格了.

this的用法

this代表调用方法的那个对象的引用. 理解了这一点this就可以用来做很多很神奇的事情.
返回该对象
比如下面这个例子这样,可以返回当前调用函数的对象.

public class Leaf {
int i=0;
public Leaf increment(){
i++;
return this;
}
public void print(){
System.out.println("i="+this.i);
}
public static void main(String[] args) {
Leaf x = new Leaf();
x.increment().increment().increment().print();
}
}

this作为参数传入给一个方法
比如这个例子

class Person{
public void eat(Apple apple){
Apple peeled = apple.getPeeled();
System.out.println("eat apple...");
}
}
class Peeler{
public static Apple peel(Apple apple){
System.out.println("peeled...");
return apple;
}
}
class Apple{
public Apple getPeeled(){
return Peeler.peel(this);
}
}
public class PassingThis {
public static void main(String[] args) {
new Person().eat(new Apple());
}
}

在构造方法中调用另外一个构造方法
在构造函数中可以去调用另外一个构造函数. 但是有一点需要注意,这种调用只能使用一次,而且必须写在起始行.

public class PersonTest {
private String name;
private int age=18;
public PersonTest() { }
PersonTest(String name){
this.name = name;
}
public PersonTest(String name,int age) {
this(name);
this.age=age;
}
@Override
public String toString() {
return "PersonTest [name=" + name + ", age=" + age + "]";
}
public static void main(String[] args) {
PersonTest pt1 = new PersonTest("tom");
PersonTest pt2 = new PersonTest("jim",20); System.out.println(pt1);
System.out.println(pt2);
}
}

static方法

理解了this之后,static方法就很好理解. static方法又叫静态方法,有点像全局方法. 埃大爷的说,static方法就是没有this的方法. 也就是说不需要通过实例来调用的方法.

这个解释简直精辟到无以附加,对埃大爷的崇拜突然如滔滔江水连绵不绝. 因为没有this,所以无法调用非静态方法.前面说了实例方法调用的时候默认第一个形参传入的是this. static方法没有传入this,那么在其中是无法调用实例方法的. 同理也没有办法调用实例变量.

反证法,如果static方法可以调用实例方法和实例变量. 因为static方法是属于一个类的. 通过类名来调用. 那么在调用static方法的时候,很有可能根本就没有创建这个类的实例,那么问题来了. 既然没有实例,那么不可能调用到实例方法和实例变量. 所以static方法不能调用实例方法和实例变量.

一个正常的类不应该存在过多的static方法.这玩意儿更像是一个全局方法,java中是禁止全局方法的. 但是有个特例,工具类中的方法绝大部分都应该是static.

TIJ读书笔记05-this关键字的更多相关文章

  1. TIJ读书笔记08-数组的初始化和可变长参数形参

    TIJ读书笔记08-数组的初始化和可变参数形参 数组 数组的声明 数组的初始化和赋值 可变参数列表 数组 相同类型的,用一个标识符名称封装到一起的一个对象序列或者基本数据类型序列叫数组.(多么严谨的概 ...

  2. TIJ读书笔记06-终结清理和垃圾回收

    TIJ读书笔记06-终结清理和垃圾回收 finalize()方法 垃圾回收器如何工作 java的垃圾回收是由jvm来控制的.所以需要java程序员参与的部分不是很多. 但是在这里需要明白一点,java ...

  3. TIJ读书笔记03-初始化和构造器

      TIJ读书笔记03-初始化和构造器 初始化和清理是涉及安全的两个问题,如果对象不能正确的初始化会引起很多错误,比如空指针异常等,如果不能恰当及时的清理,会占用过多资源. 构造器在创建一个类的实例的 ...

  4. TIJ读书笔记02-控制执行流程

      TIJ读书笔记02-控制执行流程 TIJ读书笔记02-控制执行流程 if-else 迭代 无条件分支 switch语句 所有条件语句都是以条件表达式的真假来决定执行路径,也就是通过布尔测试结果来决 ...

  5. TIJ读书笔记04-方法重载

    TIJ读书笔记04-方法重载 为什么会有方法重载 方法签名 如何区分重载 关于基本类型的重载 为什么会有方法重载 OOP的编程方式就是让程序的逻辑更加接近现实世界的逻辑. 而在现实世界中,自然语言本身 ...

  6. 强化学习读书笔记 - 05 - 蒙特卡洛方法(Monte Carlo Methods)

    强化学习读书笔记 - 05 - 蒙特卡洛方法(Monte Carlo Methods) 学习笔记: Reinforcement Learning: An Introduction, Richard S ...

  7. TIJ读书笔记01-操作符

      TIJ读书笔记01-操作符 概述 关系操作符和逻辑操作符 位操作符 类型转换 概述 操作符 操作符接受一个或多个参数,并生成一个新值. 换句话说操作符作用于操作数,生成一个新值.有些操作符会改变操 ...

  8. ANTLR3完全参考指南读书笔记[05]

    前言 仅生成给出true/false的识别器是没有多大用处的,自然的就有在识别过程中遇到某一结构时执行一段代码.存储该结构中信息的想法. ANTLR提供了在文法中嵌入属性和动作超级混合“文法”,可以生 ...

  9. C# 读书笔记之访问关键字this和base

    this 关键字引用类的当前实例.静态成员方法中不能使用this关键字,this关键字只能在实例构造函数.实例方法或实例访问器中使用. base 关键字用于从派生类中访问基类的成员. 指定创建派生类实 ...

随机推荐

  1. NOSCRIPT标签的用处

    NOSCRIPT标签用来定义在脚本未被执行时的替代内容.也可以用在检测浏览器是否支持脚本,若不支持脚本则可以显示NOSCRIPT标签里的innerText. eg:<body> ... . ...

  2. JavaScript作用域学习笔记

    重点知识点摘要 一 函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性 其中一个内部属性是[[Scope]],由ECMA-262标准第三版定义,该内部 ...

  3. [翻译]lpeg入门教程

    原文地址:http://lua-users.org/wiki/LpegTutorial 简单匹配 LPeg是一个用于文本匹配的有力表达方式,比Lua原生的字符串匹配和标准正则表达式更优异.但是,就像其 ...

  4. js 中json字符串转化json对象

    JSON字符串:var str = '{ "name": "cxh", "sex": "man" }'; JSON对象: ...

  5. 台球游戏的核心算法和AI(2)

    前言: 最近研究了box2dweb, 觉得自己编写Html5版台球游戏的时机已然成熟. 这也算是圆自己的一个愿望, 一个梦想. 承接该序列的相关博文: • 台球游戏核心算法和AI(1) 同时结合htm ...

  6. Flume 实战(2)--Flume-ng-sdk源码分析

    具体参考: 官方用户手册和开发指南 http://flume.apache.org/FlumeDeveloperGuide.html *) 定位和简单例子 1). Flume-ng-sdk是用于编写往 ...

  7. sql 查询效率

    1. SQL优化的原则是:将一次操作需要读取的BLOCK数减到最低,即在最短的时间达到最大的数据吞吐量.调整不良SQL通常可以从以下几点切入: 检查不良的SQL,考虑其写法是否还有可优化内容 检查子查 ...

  8. sqlserver sum 和count在关于进行统计时的区别

    sum是对内容的数量进行相加,count 对表行数 对象进行统计 在使用 case 时,如 select subject,count(case when score>80 then score ...

  9. Linux字符界面的优势

    优势一:字符界面占用的系统资源更少,更加适合服务器 优势二:字符界面减少了出错.被攻击的可能性(一.二决定了服务器一般不装图形界面,安全稳定优先)

  10. 【NOIP2005】过河

    感觉这题好玄--最后看了chty的代码才过,我现在这样必须看题解才能A题怎么办嘛qaq 原题: 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上 ...