Java 面向对象和绑定参数的图文理解

 

一、面向对象的类的定义

首先我们要知道什么是面向对象。面向对象编程,是一种通过对象的方式,把现实世界映射到计算机模型的一种编程方法。面向对象有类(class)和实例(instance),实例都是通过类然后使用关键词【new】出来的对象。

例如:

public class Hello {
    public static void main(String[] args) {
    Man man = new Man();
    man.name="ming";
    man.age=23;
    System.out.println(man.name + "," + man.age); // ming,23
     
    }
}

// 封装类
class Man {
public String name;
public int age;
}

二、方法

根据上面定义类和实例的方法可以看出,类里面的属性字段是可以被外部修改的,这样做可能会破坏封装性,所以我们应该使用关键字私有的private来定义类的属性,然后在类的里面在定义反问类属性的方法。这样在外部调用这些方法时,就可以间接的修改类的属性了。

注意下面的例子,我们在java程序入口中赋值时调用的是set函数,这个时候类里面的属性已经发生了变化,再调用get函数打印出来就可以了。 例如:

public class Hello {
public static void main(String[] args) {
Man man = new Man();
man.setName("luara");
man.setAge(12);
System.out.println(man.getName() + "," + man.getAge());
// luara,12

}
}

class Man {
private String name;
private int age;

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

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

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

    public void setAge(int age) {
        if (age < 0 || age > 100) {
            throw new IllegalArgumentException("invalid age value");
        }
        this.age = age;
    }
}
// this始终指向当前实例

三、可变参数

在定义实例方法的时候,我们知道参数可以设置为一个,也可以设置为多个,在调用的时候对应起来就可以了。不过java中有个特殊的地方,就是有可变参数,这个有点想ES6中的扩展参数一样。在java中可变参数的写法入下面的例子所示,在调用的时候,可以任意的输入0个或者多个参数,注意,这里的0个不是null

import java.util.Arrays;

public class Hello {
public static void main(String[] args) {
Man man = new Man();
man.setName("luara","Asia","Lili");
// string[] names 调用的时候要构造
// man.setNames(new String[] {"Xiao Ming", "Xiao Hong", "Xiao Jun"});
System.out.println(Arrays.toString(man.getName()));
// [luara, Asia, Lili]

}
}

class Man {
private String[] names;
private int age;

public String[] getName() {
        return this.names;
    }

    public void setName(String... name) {

        this.names = name;
    };
// 完全可以把可变参数改写为String[]类型:
//    public void setNames(String[] names) {
//        this.names = names;
//    }
}

四、参数绑定

在学习该java特性时,要结合例子来理解。

1、基本类型参数

我们在 Java 程序的基础 中知道java有四大基本类型,所以在程序中把基本类型的变量作为对象的参数输入,然后再改变变量后调用对象的方法输出,结果不会改变,因为传入的参数已经改变了对象实例的属性字段,所以即使外部改变变量,如果没再次执行传入,对对象实例都是没有任何影响的。

例如:

import java.util.Arrays;

public class Hello {
public static void main(String[] args) {
Man man = new Man();
int n = 15; // n的值为15
man.setAge(n); // 传入n的值
System.out.println(man.getAge()); // 15
n = 20; // n的值改为20
// man.setAge(n); //  再次传入n的值
System.out.println(man.getAge()); // 15 再次传出是20
}

}

class Man {
private int age;

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

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

2、引用类型参数

前面的章节中 Java程序的基础 中我们知道字符串和数组时引用类型,所以我们把需要传入的参数设置为数组看看下面的例子会怎么样?

import java.util.Arrays;

public class Hello {
public static void main(String[] args) {
Man man = new Man();
String[] fullname = new String[] { "Homer", "Simpson" };
man.setName(fullname); // 传入fullname数组
System.out.println(man.getName()); // "Homer Simpson"
fullname[0] = "Bart"; // fullname数组的第一个元素修改为"Bart"
System.out.println(man.getName()); // Bart Simpson
}

}

class Man {
private String[] name;

public String getName() {
return this.name[0] + " " + this.name[1];
}

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

为什么会和基本类型不同?原因是调用方的变量,和接收方的参数变量,指向的是同一个对象。双方任意一方对这个对象的修改,都会影响对方。 例图:

本文为博主原创文章,知识共享,开源精神,转载注明出处。