zoukankan      html  css  js  c++  java
  • Java与面向对象之随感(2)

    我们知道Java语言的一大特性就是相比于c语言和c++语言,其更加安全。那么Java安全性的一个重要保证就是它取消了指针,并且坚决反对数组的出界(c++对当数组超出上限但是还进行读写操作时允许的!),这必然很容易造成缓冲区的溢出,也是因为此,c/c++程序很容易遭到针对此类问题而产生的各种攻击。

    那么Java取缔了指针,则其必然大大缺失了灵活性,比如经典的swap函数(交换两个变量的值)在Java中就没法再用指针实现了,但是也因此换来了稳定性。

    下面考虑这样一个Java程序:

    package test;

     

    public class test {

    private static int a;

         public static void main(String [] args) {

             modify(a);

             System.out.println(a);

         }

         public static void modify(int a) {

           a++;

         }

    }

    很明显输出为0,因为形参a只在方法栈中自增,即不是真正的自增。

    再:

    package test;

     

    class IntClass {

        int value;          

    }

    public class test

    {

        public static void modifyValue(IntClass s,int val){

               s.value = val;

        }

        public static void main(String args[]){

               IntClass  a = new IntClass();    

               modifyValue(a,8);

               System.out.println(a.value);    

        }

    }

    输出为8;为什么呢?因为语句“modifyValue(a,8);”将a所指向的对象传给了函数形参,我们知道,a的本质是一个地址,地址在计算机的存储中就是一个数据,那么相当于这句话完成了一个值传递的过程,即将声明a所指向的对象的地址和一个常数传给了方法,以此完成了对对象成员属性的更改。我在Java与面向对象之随感(1)中说过,Java要想产生可以操作的对象,就必须使用“A a=new A();”这样一类语句在堆中产生对象,这似乎说明Java通过此产生了可以替代指针功能的机制。现在我们可以自信满满的说:Java语言当中的参数传递全部都是值传递!,只不过基本数据类型传递的是数值,而引用传递的是地址(实质上就是一个数值)罢了。

    TZ

    2017/2/25夜

    于HZAU

  • 相关阅读:
    Spring Boot 之 RabbitMQ 消息队列中间件的三种模式
    各浏览器驱动下载地址
    idea配置jdk
    谷歌打不开应用商店临时方法
    airtest下载网址
    hive不分区增量更新
    hive建表结构
    Hive 常用命令
    Hive内部表与外部表区别
    java代码中的坑
  • 原文地址:https://www.cnblogs.com/acm-icpcer/p/6443074.html
Copyright © 2011-2022 走看看