-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
李济芝
committed
Oct 31, 2024
1 parent
6a11d46
commit 3838e40
Showing
70 changed files
with
4,531 additions
and
2,133 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
--- | ||
title: "代码之外-志闲少欲" | ||
date: 2024-10-19 | ||
draft: false | ||
tags: ["反思与感悟","代码之外"] | ||
slug: "other-code-10" | ||
--- | ||
|
||
“志”的意思是志向,“心之所之为志”,心里向往的目标为“志”,你的志向是什么?相信没有人从小的志向就是赚钱或者买房子、车子。 | ||
在不谈物质的情况下,人们还是喜欢追求一些精神层面的目标,比如研究某项技能等。 | ||
当然不是说物质不重要的意思,应该是在追求精神目标的时候,顺带着得到了一些物质,这样最后才不会感到虚无。 | ||
如果一味的盲目追求物质,看到别人有,自己也想买,虽然外表光鲜亮丽,但是灵魂却黯淡无光,在没有足够的支撑的情况下,最终会失去表面的一切。 | ||
|
||
那么什么是志闲而少欲呢?”志闲而少欲“,出自《皇帝内经》,大意是让目标不要太多太高,务实一些,努努力就能够够得着的那种。志闲而少欲就是告诉我们必须要通过自己的努力,找到自己切实实现的目标。 | ||
比如学习一门乐器,花个五六天,这就是志闲而少欲。如果定的目标过高不切实际,那么你坚持两天就不会做了,因为你自己也知道实现不了,然后三天打鱼两天晒网,久而久之挫败感越来越强,有些人就直接摆烂了,躺在床上什么都不做。 | ||
志闲就是具体能看得到的东西,志不闲是那些看不到的遥遥无期的,比如,我什么时候能发财,我什么时候结婚等等。当你的生活由这些明确的目标构成的时候,你会发现你忙的要死,你就没有时间产生那么多欲望。 | ||
|
||
你的欲望是合理的、合适的,你的欲望就会少,欲望会少,烦恼就会少,于是就会出现大气免成的状态。 | ||
意思是大的事情是浑然天成的,不是靠人力所能决定的,一个人能不能当首富,能不能当皇帝,不是看他自己努力的,是看天意的。大的成就不是自己努力的结果,是许多因缘巧合汇聚到一起的结果,所以叫大器免成。 | ||
所以大的事情琢磨也没用,你能决定的就是身边的小事。 | ||
|
||
我们要做的就是过好当下,修养自己的精神,让自己成为一个更有趣,思想丰富,知识渊博,见识广博的人,你的幸福是自然而然的。 | ||
而且只有你变成这样的人,未来你发了财,你才能够承担这份财富,老天爷把这份财富降临到你头上,你才不会被这个钱砸死。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,7 @@ | ||
--- | ||
title: "代码之外-学会顺势而为" | ||
date: 2024-08-20 | ||
draft: false | ||
draft: true | ||
tags: ["反思与感悟","代码之外"] | ||
slug: "other-code-09" | ||
--- |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,133 @@ | ||
--- | ||
title: "this关键字详解" | ||
date: 2024-08-20 | ||
draft: true | ||
date: 2024-10-31 | ||
draft: false | ||
tags: ["Java", "关键字","详解"] | ||
slug: "java-keyword-this" | ||
--- | ||
|
||
## this | ||
在Java中,`this`是一个特殊的引用,指向当前对象的实例。 | ||
JVM会给每个对象分配一个`this`,来代表当前对象,换句话说,`this`是一个特殊的变量,它保存了当前对象的内存地址。 | ||
它是类内部对当前对象的引用,因此在实例方法或构造方法中,可以通过`this`来访问对象的属性和方法。 | ||
|
||
`this`是一个内置的引用,代表了“当前对象”,它指向当前对象的实例。 | ||
可以把`this`看成一个特殊变量,它保存着当前对象的内存地址,并允许你在类内部访问该对象的属性和方法。 | ||
|
||
### 使用示例 | ||
`this`有如下几种用法: | ||
- 当局部变量和成员变量同名时,`this`可用于区分成员变量与局部变量。 | ||
```java | ||
public class Person { | ||
private String name; | ||
|
||
public Person(String name) { | ||
this.name = name; // this.name 是成员变量,name 是构造器的参数 | ||
} | ||
} | ||
``` | ||
- 在一个构造方法中,可以使用`this()`调用当前类的其他构造方法,从而减少代码冗余。 | ||
```java | ||
public class Car { | ||
private String model; | ||
private int year; | ||
|
||
public Car(String model) { | ||
this(model, 2020); // 调用另一个构造方法 | ||
} | ||
|
||
public Car(String model, int year) { | ||
this.model = model; | ||
this.year = year; | ||
} | ||
} | ||
``` | ||
- `this`可以用在类的实例方法中,帮助开发者引用当前对象。例如,将当前对象作为参数传递给其他方法。 | ||
```java | ||
public class Printer { | ||
public void printMessage() { | ||
System.out.println("Printing from Printer..."); | ||
} | ||
|
||
public void printSelf() { | ||
Helper.print(this); // 将当前对象作为参数传递 | ||
} | ||
} | ||
``` | ||
|
||
需要注意的是,因为`this`是一个对象的引用,而静态方法属于类本身,与具体对象无关。所以在静态方法中无法使用`this`,因为此时不存在当前实例。 | ||
```java | ||
public class Example { | ||
private String name; | ||
|
||
public static void staticMethod() { | ||
// this.name = "test"; // 错误,静态方法中不能使用 this | ||
} | ||
} | ||
``` | ||
|
||
### 执行原理 | ||
`this`关键字的执行原理在于它作为一个特殊引用,在实例方法调用时隐式传递给方法。 | ||
在编译阶段,Java 编译器将实例方法中的`this`转换为一个隐式的参数,供方法在运行时使用。 | ||
每个实例方法在编译后,都会在方法参数列表中增加一个`this`参数(作为第一个参数),用于指向调用该方法的对象。 | ||
|
||
例如,以下类: | ||
```java | ||
public class Example { | ||
private String name; | ||
|
||
public void printName() { | ||
System.out.println(this.name); | ||
} | ||
} | ||
``` | ||
编译后,相当于将`printName()`方法编译成类似以下结构: | ||
```java | ||
public void printName(Example this) { | ||
System.out.println(this.name); | ||
} | ||
``` | ||
|
||
当 Java 源代码被编译成字节码后,`this`关键字的引用被转换为`aload_0`指令。该指令将当前对象引用加载到操作数栈上。 | ||
```java | ||
public class Example { | ||
private String name; | ||
|
||
public void printName() { | ||
System.out.println(this.name); | ||
} | ||
} | ||
``` | ||
```text | ||
0: aload_0 // 将 `this` 引用加载到栈中 | ||
1: getfield Example.name // 获取当前对象的 `name` 字段 | ||
2: invokevirtual #16 // 调用 `System.out.println` | ||
3: return // 返回 | ||
``` | ||
JVM在执行每个实例方法时,都会为方法分配一个栈帧。栈帧包含局部变量表、操作数栈和方法返回地址等。 | ||
对于实例方法,JVM 将`this`引用存储在局部变量表的第一个槽位中(`aload_0`直接从第一个槽位加载this)。 | ||
|
||
当方法需要访问当前对象的字段或调用它的其他方法时,通过`aload_0`指令将`this`引用加载到操作数栈,然后结合其他字节码指令完成字段读取或方法调用。 | ||
|
||
举个例子,假设有如下代码: | ||
```java | ||
Example example = new Example(); | ||
example.printName(); | ||
``` | ||
在这段代码中,`example.printName()`会将`example`对象的引用传递给`printName()`方法的`this`参数。 | ||
JVM通过栈帧机制管理方法调用栈和对象引用。具体过程如下: | ||
1. JVM 为`printName()`方法创建一个新的栈帧,并将`example`引用作为`this`参数传入栈帧。 | ||
2. `this`作为`printName()`方法的隐式参数,被绑定到`example`引用。 | ||
3. 方法执行时,字节码中的`aload_0`指令将`this`引用加载到操作数栈,使得`printName()`方法可以访问`example`的属性和方法。 | ||
|
||
总结一下,`this`的执行原理在于它是一个隐式传递的参数,指向当前对象实例,并在编译和执行过程中通过`aload_0`加载到栈中。 | ||
在JVM内部,它通过栈帧管理和字节码指令实现了对当前对象的引用,使得实例方法可以操作调用对象的属性和方法。 | ||
|
||
执行流程: | ||
1. 编译阶段: 在编译阶段,Java编译器会为实例方法添加一个隐藏的`this`参数。这个参数会成为方法的第一个参数。 | ||
2. 字节码指令: 在JVM中,`this`引用会被加载到操作数栈。例如,`aload_0`是将`this`引用加载到栈中的指令。在实例方法调用时,`this`被放入局部变量表的第一个槽位(索引为 0)。 | ||
3. 运行时: 当`this`被传递给方法时,JVM 会为该方法分配一个栈帧,其中包含`this`引用,使得方法能够操作当前对象的属性和方法。 | ||
|
||
### 线程安全 | ||
在多线程环境中,JVM为方法分配独立的栈帧,每个线程操作自己的栈,因此`this`引用也是线程安全的,因为它仅在线程的栈帧中使用,彼此之间不共享。 | ||
即使多个线程同时操作同一个对象,每个线程仍然有自己的`this`引用,不会相互影响。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.