strictfp strictfp可能是最没有存在感的关键字了,很多人写了多年Java甚至都不知道它的存在。 默认情况下,Java中的浮点计算与平台相关。因此,浮点结果的精度取决......
+this 在Java中,this是一个特殊的引用,指向当前对象的实例。 JVM会给每个对象分配一个this,来代表当前对象,换句话说,this是一个特殊的变量,它保存了当......
diff --git "a/blog-site/content/posts/ideology/\344\273\243\347\240\201\344\271\213\345\244\226-10.\345\277\227\351\227\262\345\260\221\346\254\262.md" "b/blog-site/content/posts/ideology/\344\273\243\347\240\201\344\271\213\345\244\226-10.\345\277\227\351\227\262\345\260\221\346\254\262.md" new file mode 100644 index 000000000..2e2910b11 --- /dev/null +++ "b/blog-site/content/posts/ideology/\344\273\243\347\240\201\344\271\213\345\244\226-10.\345\277\227\351\227\262\345\260\221\346\254\262.md" @@ -0,0 +1,23 @@ +--- +title: "代码之外-志闲少欲" +date: 2024-10-19 +draft: false +tags: ["反思与感悟","代码之外"] +slug: "other-code-10" +--- + +“志”的意思是志向,“心之所之为志”,心里向往的目标为“志”,你的志向是什么?相信没有人从小的志向就是赚钱或者买房子、车子。 +在不谈物质的情况下,人们还是喜欢追求一些精神层面的目标,比如研究某项技能等。 +当然不是说物质不重要的意思,应该是在追求精神目标的时候,顺带着得到了一些物质,这样最后才不会感到虚无。 +如果一味的盲目追求物质,看到别人有,自己也想买,虽然外表光鲜亮丽,但是灵魂却黯淡无光,在没有足够的支撑的情况下,最终会失去表面的一切。 + +那么什么是志闲而少欲呢?”志闲而少欲“,出自《皇帝内经》,大意是让目标不要太多太高,务实一些,努努力就能够够得着的那种。志闲而少欲就是告诉我们必须要通过自己的努力,找到自己切实实现的目标。 +比如学习一门乐器,花个五六天,这就是志闲而少欲。如果定的目标过高不切实际,那么你坚持两天就不会做了,因为你自己也知道实现不了,然后三天打鱼两天晒网,久而久之挫败感越来越强,有些人就直接摆烂了,躺在床上什么都不做。 +志闲就是具体能看得到的东西,志不闲是那些看不到的遥遥无期的,比如,我什么时候能发财,我什么时候结婚等等。当你的生活由这些明确的目标构成的时候,你会发现你忙的要死,你就没有时间产生那么多欲望。 + +你的欲望是合理的、合适的,你的欲望就会少,欲望会少,烦恼就会少,于是就会出现大气免成的状态。 +意思是大的事情是浑然天成的,不是靠人力所能决定的,一个人能不能当首富,能不能当皇帝,不是看他自己努力的,是看天意的。大的成就不是自己努力的结果,是许多因缘巧合汇聚到一起的结果,所以叫大器免成。 +所以大的事情琢磨也没用,你能决定的就是身边的小事。 + +我们要做的就是过好当下,修养自己的精神,让自己成为一个更有趣,思想丰富,知识渊博,见识广博的人,你的幸福是自然而然的。 +而且只有你变成这样的人,未来你发了财,你才能够承担这份财富,老天爷把这份财富降临到你头上,你才不会被这个钱砸死。 diff --git "a/blog-site/content/posts/ideology/\344\273\243\347\240\201\344\271\213\345\244\226-8.\350\260\210\350\260\210\347\256\227\345\221\275.md" "b/blog-site/content/posts/ideology/\344\273\243\347\240\201\344\271\213\345\244\226-8.\350\260\210\350\260\210\347\256\227\345\221\275.md" index 811509d5d..8aa5e49a3 100644 --- "a/blog-site/content/posts/ideology/\344\273\243\347\240\201\344\271\213\345\244\226-8.\350\260\210\350\260\210\347\256\227\345\221\275.md" +++ "b/blog-site/content/posts/ideology/\344\273\243\347\240\201\344\271\213\345\244\226-8.\350\260\210\350\260\210\347\256\227\345\221\275.md" @@ -1,7 +1,7 @@ --- title: "代码之外-谈谈算命" date: 2024-08-20 -draft: false +draft: true tags: ["反思与感悟","代码之外"] slug: "other-code-08" --- diff --git "a/blog-site/content/posts/ideology/\344\273\243\347\240\201\344\271\213\345\244\226-9.\345\255\246\344\274\232\351\241\272\345\212\277\350\200\214\344\270\272.md" "b/blog-site/content/posts/ideology/\344\273\243\347\240\201\344\271\213\345\244\226-9.\345\255\246\344\274\232\351\241\272\345\212\277\350\200\214\344\270\272.md" index 632bbd59c..0ea5f0b11 100644 --- "a/blog-site/content/posts/ideology/\344\273\243\347\240\201\344\271\213\345\244\226-9.\345\255\246\344\274\232\351\241\272\345\212\277\350\200\214\344\270\272.md" +++ "b/blog-site/content/posts/ideology/\344\273\243\347\240\201\344\271\213\345\244\226-9.\345\255\246\344\274\232\351\241\272\345\212\277\350\200\214\344\270\272.md" @@ -1,7 +1,7 @@ --- title: "代码之外-学会顺势而为" date: 2024-08-20 -draft: false +draft: true tags: ["反思与感悟","代码之外"] slug: "other-code-09" --- diff --git "a/blog-site/content/posts/java/javakeyword/this\345\205\263\351\224\256\345\255\227\350\257\246\350\247\243.md" "b/blog-site/content/posts/java/javakeyword/this\345\205\263\351\224\256\345\255\227\350\257\246\350\247\243.md" index f30488fee..beb0991ef 100644 --- "a/blog-site/content/posts/java/javakeyword/this\345\205\263\351\224\256\345\255\227\350\257\246\350\247\243.md" +++ "b/blog-site/content/posts/java/javakeyword/this\345\205\263\351\224\256\345\255\227\350\257\246\350\247\243.md" @@ -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`引用,不会相互影响。 diff --git "a/blog-site/content/posts/java/spring/SpringBoot\350\257\246\350\247\243.md" "b/blog-site/content/posts/java/spring/SpringBoot\350\257\246\350\247\243.md" index de0090b75..fdd7ba2a4 100644 --- "a/blog-site/content/posts/java/spring/SpringBoot\350\257\246\350\247\243.md" +++ "b/blog-site/content/posts/java/spring/SpringBoot\350\257\246\350\247\243.md" @@ -21,8 +21,12 @@ SpringBoot基于`Sring4`进行设计,继承了原有Spring框架的优秀基 - 无配置的约定:SpringBoot遵循“无配置”的原则,使用合理的默认值和约定,减少需要编写的配置代码。 - 快速开发:SpringBoot的项目结构和默认配置帮助开发者快速启动新项目。内置工具和插件支持开发、测试和部署。 -## 与Spring的区别 -Spring和SpringBoot的最主要区别在于配置和启动的复杂性。 +## 与Spring区别 +Spring提供了大量的子模块,如Spring Core、Spring Web、Spring Data等,但它们的配置复杂度较高,且需要开发者手动配置各类文件和依赖。 +SpringBoot基于Spring,目的是简化Spring应用的创建和配置。 + +SpringBoot是对Spring的扩展,简化了Spring应用开发的过程,但仍然依赖Spring核心库。 +使用SpringBoot开发的应用实际上是基于Spring的,只是通过自动配置和内置依赖提升了开发效率。 Spring和SpringBoot的主要区别在于配置和启动的复杂性。Spring框架需要大量的手动配置,包括XML配置文件或Java配置类,配置过程较为繁琐且易出错。 此外,Spring应用程序通常需要部署到外部的Web服务器,并需要额外的步骤来启动和运行。 diff --git a/blog-site/public/index.html b/blog-site/public/index.html index 6b5ef50d8..74fca8ef7 100644 --- a/blog-site/public/index.html +++ b/blog-site/public/index.html @@ -130,12 +130,12 @@
strictfp strictfp可能是最没有存在感的关键字了,很多人写了多年Java甚至都不知道它的存在。 默认情况下,Java中的浮点计算与平台相关。因此,浮点结果的精度取决......
+this 在Java中,this是一个特殊的引用,指向当前对象的实例。 JVM会给每个对象分配一个this,来代表当前对象,换句话说,this是一个特殊的变量,它保存了当......