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

  • 相关阅读:
    android 75 新闻列表页面
    android 74 下载文本
    android 73 下载图片
    android 72 确定取消对话框,单选对话框,多选对话框
    android 71 ArrayAdapter和SimpleAdapter
    android 70 使用ListView把数据显示至屏幕
    maven如何将本地jar安装到本地仓库
    Centos6.7搭建ISCSI存储服务器
    解决maven打包编译出现File encoding has not been set问题
    MySQL 解决 emoji表情 的方法,使用utf8mb4 字符集(4字节 UTF-8 Unicode 编码)
  • 原文地址:https://www.cnblogs.com/acm-icpcer/p/6443074.html
Copyright © 2011-2022 走看看