TIJ读书笔记05-this关键字
概述
两个对象同时调用一个方法,那么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关键字的更多相关文章
- TIJ读书笔记08-数组的初始化和可变长参数形参
TIJ读书笔记08-数组的初始化和可变参数形参 数组 数组的声明 数组的初始化和赋值 可变参数列表 数组 相同类型的,用一个标识符名称封装到一起的一个对象序列或者基本数据类型序列叫数组.(多么严谨的概 ...
- TIJ读书笔记06-终结清理和垃圾回收
TIJ读书笔记06-终结清理和垃圾回收 finalize()方法 垃圾回收器如何工作 java的垃圾回收是由jvm来控制的.所以需要java程序员参与的部分不是很多. 但是在这里需要明白一点,java ...
- TIJ读书笔记03-初始化和构造器
TIJ读书笔记03-初始化和构造器 初始化和清理是涉及安全的两个问题,如果对象不能正确的初始化会引起很多错误,比如空指针异常等,如果不能恰当及时的清理,会占用过多资源. 构造器在创建一个类的实例的 ...
- TIJ读书笔记02-控制执行流程
TIJ读书笔记02-控制执行流程 TIJ读书笔记02-控制执行流程 if-else 迭代 无条件分支 switch语句 所有条件语句都是以条件表达式的真假来决定执行路径,也就是通过布尔测试结果来决 ...
- TIJ读书笔记04-方法重载
TIJ读书笔记04-方法重载 为什么会有方法重载 方法签名 如何区分重载 关于基本类型的重载 为什么会有方法重载 OOP的编程方式就是让程序的逻辑更加接近现实世界的逻辑. 而在现实世界中,自然语言本身 ...
- 强化学习读书笔记 - 05 - 蒙特卡洛方法(Monte Carlo Methods)
强化学习读书笔记 - 05 - 蒙特卡洛方法(Monte Carlo Methods) 学习笔记: Reinforcement Learning: An Introduction, Richard S ...
- TIJ读书笔记01-操作符
TIJ读书笔记01-操作符 概述 关系操作符和逻辑操作符 位操作符 类型转换 概述 操作符 操作符接受一个或多个参数,并生成一个新值. 换句话说操作符作用于操作数,生成一个新值.有些操作符会改变操 ...
- ANTLR3完全参考指南读书笔记[05]
前言 仅生成给出true/false的识别器是没有多大用处的,自然的就有在识别过程中遇到某一结构时执行一段代码.存储该结构中信息的想法. ANTLR提供了在文法中嵌入属性和动作超级混合“文法”,可以生 ...
- C# 读书笔记之访问关键字this和base
this 关键字引用类的当前实例.静态成员方法中不能使用this关键字,this关键字只能在实例构造函数.实例方法或实例访问器中使用. base 关键字用于从派生类中访问基类的成员. 指定创建派生类实 ...
随机推荐
- lua 元表与元方法示例
-- 1.检查是否有元表local t = {1, 2}print(getmetatable(t)) -- nilprint("----------------------" ...
- 一行代码从表中选取N行到另一个表
private void Form1_Load(object sender, EventArgs e) { DataTable dt = new DataTable(); ...
- mysql 批量更新和批量插入
1. 批量更新 update table_name set field_name = CASE id WHEN id1 THEN field_value, WHEN id1 THEN field_ ...
- option对象概念
一.基础理解: var e = document.getElementById("selectId"); e.options = new Option("文本&quo ...
- PHP Date Function Base
/**************格式中可使用字母的含义**************/a – "am" 或是 "pm" A – "AM" 或是 ...
- 区间更新 zoj3911
哎,没什么坑点,一个简单的区间更新题,但是改了好几天没改对,最终还是过了~~发个纪念下 泪奔... #include<cstdio>#include <iostream>#in ...
- 使用样式“clear”和“overflow”消除浮动元素对环绕行框的影响
为元素设置“float”样式之后,元素会脱离标准文档流,不再占据原来的空间.后续元素会向前移动,占据这个新的空间.后续的文本会围绕着浮动元素分布,形成一种环绕布局的现象. 示例代码: <!DOC ...
- Sublime Text 2 配置
设置Python的Tab缩进为四个空格,打开一个Py文件 # Preferences---->Settings-More---->Syntax Specific-User # 贴入如下代码 ...
- [hdu 3376]Matrix Again
这题就是真正的费用流了,用 大屁 就算不超时,你也有个 CE :数组 so large 拆点,费用取反,最大费用最大流即可了喵~ 不过似乎这题很不兼容 dijkstra 的样子 就算用 spfa 重赋 ...
- 不同操作系统上屏蔽oracle的操作系统认证方式
windows系统上>如果不想用户通过操作系统验证方式登录,可以修改 sqlnet.ora文件,把 SQLNET.AUTHENTICATION_SERVICES=NTS 前面加#注释掉就可以了. ...