什么是平台无关性,Java是如何做到平台无关的


title: 面向对象基础二
date: 2019-01-27 20:27:54
tags: Interview
categories: Interview


什么是平台无关性,Java是如何做到平台无关的

平台无关(跨平台): 一种语言在计算机上的运行不受平台的约束,一次编译到处运行。

Java经过编译之后生成的.class 的字节码文件,运行平台上只要有JVM就能运行,不需要进行再次编译

Java中只有值传递

我之前的认识:

  1. 值传递和引用传递区别: 区别是传递的内容,如果传递的是值,就是值传递。如果传递的是引用,就是引用传递
  2. 传递参数如果是普通数据类型,就是值传递。如果是对象,就是引用数据类型

实参与形参

形参: 函数申明时定义的参数,就是形参

public static void main(String[] args){
    
}
// args 就是形参

实参: 在调用方法时,传入的参数

public static int  test(int i){
    return i+1;
}
public static void main(String[] args){
    test(1);   // 传入的1,就是实参
}

值传递与引用传递

先举例子

class Test {

    public void test(int i) {
        i = i + 1;
        System.out.println("变化的 " + i);
    }

    public static void main(String[] args) {
        Test test = new Test();
        int i = 1;
        test.test(i);
        System.out.println("实际的 " + i);
    }

}

输出结果

变化的 2
实际的 1

从这个例子可以看出Java是值传递

但是,下边这个例子

class Test {

    public void test(int i) {
        i = i + 1;
        System.out.println("变化的 " + i);
    }

    public static void main(String[] args) {
        Person p = new Person("yoke", 21);
        p.setAge(10);

        System.out.println("我的年龄是" + p.getAge());
    }

}

class Person {
    private String name;
    private Integer age;

    Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getAge() {
        return this.age;
    }

}

输出结果

我的年龄是10

从这个例子看出,Java似乎又是引用传递,而且是普通数据类型是值传递,对象是引用传递

class Test {

    public void test(String s) {
        s = "Word";
    }

    public static void main(String[] args) {
        String s = "Hello";
        Test test = new Test();
        test.test(s);
        System.out.println(s);
    }

}

输出结果

Hello

Java中的值传递

值传递: 在调用函数时,将实际参数复制一份传递到函数中,这样在函数中如果对参数进行操作,将不会影响到实际参数

引用传递: 将实际参数的地址直接传到函数中

引用Hollis大神的例子:

你有一把钥匙,当你的朋友想要去你家的时候,如果你直接把你的钥匙给他了,这就是引用传递。这种情况下,如果他对这把钥匙做了什么事情,比如他在钥匙上刻下了自己名字,那么这把钥匙还给你的时候,你自己的钥匙上也会多出他刻的名字。

你有一把钥匙,当你的朋友想要去你家的时候,你复刻了一把新钥匙给他,自己的还在自己手里,这就是值传递。这种情况下,他对这把钥匙做什么都不会影响你手里的这把钥匙。

但是,不管上面哪种情况,你的朋友拿着你给他的钥匙,进到你的家里,把你家的电视砸了。那你说你会不会受到影响?而我们在setAge方法中,改变person对象的age属性的值的时候,不就是在“砸电视”么。你改变的不是那把钥匙,而是钥匙打开的房子。

你可能感兴趣的:(Java,Base,Java)