概述

两个对象同时调用一个方法,那么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. SQL Analysis Services MDX 查询超时 解决办法

    当页面有很多MDX语句查询的时候,会发生超时的情况. 解决办法: SQL Analysis Services所在的服务器(OLAP的文件夹下) 找到: msmdpump.ini 将: <Conf ...

  2. [转]一个简单的Linux多线程例子 带你洞悉互斥量 信号量 条件变量编程

    一个简单的Linux多线程例子 带你洞悉互斥量 信号量 条件变量编程 希望此文能给初学多线程编程的朋友带来帮助,也希望牛人多多指出错误. 另外感谢以下链接的作者给予,给我的学习带来了很大帮助 http ...

  3. PHP中常用的函数

    1.php 字符串截取函数 2.php取得当前时间函数 3.php 字符串长度函数 4.几种php 删除数组元素方法 5.php中var_dump()函数的详解说明 6.PHP preg_match正 ...

  4. Collection(数组、字典、集合)

    Collection     -NSArray和NSMutableArray         +array:创建一个空数组         +arrayWithArray:从另一个数组创建新的数组   ...

  5. P,NP,NPC,NPC-HARD

    P: 能在多项式时间内解决的问题 NP: 不能在多项式时间内解决或不确定能不能在多项式时间内解决,但能在多项式时间验证的问题 NPC: NP完全问题,所有NP问题在多项式时间内都能约化(Reducib ...

  6. 台球游戏的核心算法和AI(1)

    前言: 08年的时候, 写过一个台球游戏, 用的是java, 不过代码真的是用传说中的神器notepad写的(你信吗? 其实是用GVIM写的, ^_^), 很多类都在同一java文件中编写. 可见当时 ...

  7. redis windows

    下载 redis windows版本 redis-server  redis.windows.conf  //cmd 命令 启动成功 E:\redis\Redis-x64-3.0.500>red ...

  8. poj2369 Permutations ——置换群

    link:http://poj.org/problem?id=2369 置换群,最简单的那种. 找所有数字循环节的最小公倍数. /* ID: zypz4571 LANG: C++ TASK: perm ...

  9. linux 常用的酷炫命令

    1 命令行日常系快捷键 如下的快捷方式非常有用,能够极大的提升你的工作效率: CTRL + U -剪切光标前的内容 CTRL + K -剪切光标至行末的内容 CTRL + Y -粘贴 CTRL + E ...

  10. ping不通 www.baidu.com 163.com

    可以试试这个命令:netsh winsock reset ping不通,但是可以上网,原因有以下几个: 1.远程主机禁止ping 2.firewall禁止ping,icmp 3.dns解析有问题 fr ...