java吧 关注:1,294,043贴子:12,826,385
  • 6回复贴,共1

我来讲讲基础。Java的进阶基础。

只看楼主收藏回复

Java的很多基础知识是你必须要打牢的。吧里的吧友不要一知半解 要彻底弄清楚。
例如这个同学的这个问题:

这个就是典型的Java的传递类型问题。
那么今天就把JAVA的传递类型讲的清清楚楚。
结论:
Java中只有值传递
前驱知识:
1: 理解方法(函数)的特性
方法(或函数)作为编程中的基本单元,用于执行定义明确的任务 例如:swap
2: 数学中的函数与编程方法的类比
函数 f1 -> f(y) = x(函数体)
调用者或使用者 只关心结果y 和 x(参数) 它并不关系函数体是什么
但重点是保证 特别是其无副作用和确定性(相同输入产生相同输出)。
3: 计算机设计中的函数(方法)
那么问题来了 如果你是计算机的设计者 你怎么保证无副作用和 确定性?
那是不是要解决 如果A 调用 f1 B 调用f1 它们是完全隔离的
不会A 传递x ,对B也是一样起效果。 ( 一定要思考 这里就是理解的重点)
计算机的解决 : 计算机是通过创建独立的函数栈和栈空间来为每次方法调用提供隔离的执行环境。每次方法调用时,参数被复制到 新的栈帧中,确保了内部操作仅限于该栈帧,不会影响到调用者环境。
证明:
public void swap(TreeNode left (L1), TreeNode right(R1)) 和调用代码 swap(root.left ( L ),root.right (R) );的分析。
L ,L1 ,R ,R1 是完全不一样的四个变量 有各种的函数栈 。就像四个盒子 只不过它们里面装的物品是一样的。
那么你调用了 public void swap(TreeNode left (L1), TreeNode right(R1))
计算机会怎么处理?
new L1 ,new R1 。赋值引用 R1 = R.引用 , L1 = L.引用 (注意这里知识地址值 不是传递进来的对象)


IP属地:湖北1楼2024-03-12 13:39回复
    如果你L1 那么 L 也会受到引用。
    ?那么是不是就隔离性相冲突了?
    不!!!
    注意 我们要站在计算机的角度去问题。
    例如 : A (对象申明 ) -> obj(真正储存在内存对象) ->是引用
    计算机不关心 obj 它只关心当前函数栈 A 的完整隔离性。


    IP属地:湖北2楼2024-03-12 13:44
    回复
      2026-01-09 19:30:26
      广告
      不感兴趣
      开通SVIP免广告
      在吧里 我一直说要把计算机基础打牢和多思考。
      计算机基础是你思考的前提。这个就是例子 思考会给你带来真真切切的理解。


      IP属地:湖北3楼2024-03-12 13:47
      回复
        可爱


        IP属地:广东来自Android客户端4楼2024-03-12 13:51
        回复
          如果有人 。那下个问题就是为什么Java要使用纯值传递 而非选择混合系


          IP属地:湖北5楼2024-03-12 14:32
          回复
            一楼我有几个错别字 。我修复下 :L ,L1 ,R ,R1 是完全不一样的四个变量 但属于两个函数栈 如果方法调用是这样的
            f1(x,y) {
            f2(x,y);
            } L,R是 属于f1 ,L1 R1 是属于f2 。他们完全是不同的.


            IP属地:湖北7楼2024-03-12 15:53
            回复
              [#list/path=%2F?cuid=baidutiebaappef6c6cc3-33e7-47f3-93eb-907f[#list/path=%2F?cuid=baidutiebaappef6c6cc3-33e7-47f3-93eb-907fdf360481&cuid_galaxy2=6995AA576AA9FOEDCEO3340086D18C20 V3T3E7NFN&cuid_gid=Xtamp=1610110063569&_ client_version=12.2.8.1&nohead=1]


              来自Android客户端8楼2024-07-30 18:34
              回复