面向对象-方法
方法
一个class可以包含很对的field(成员变量是指类的数据成员)
class Person{
public String name;
public int age;
}
但是,在使用public修饰成员变量的时候,会破坏封装性
Person person = new Person;//实例化一个对象
person.name= "张三";
person.age=20;
虽然可以直接对成员变量进行操作,但是这样容易造成逻辑混乱。为了避免外部的代码直接访问我们的成员属性,一般我们会用private这个关键字来修饰我们的成员变量。
class Person{
private String name;
private int age;
}
在将我们的成员属性进行私有化之后,会发现之前通过new对象,然后通过对象来对我们的成员赋值的方法会报错。这表明我们在类的外部是不能访问被private修饰的成员,如果想要对成员进行赋值,我们就要用到 getter和setter方法:
public class Main {
public static void main(String[] args) {
Person ming = new Person();
ming.setName("Xiao Ming"); // 设置name
ming.setAge(12); // 设置age
System.out.println(ming.getName() + ", " + ming.getAge());
}
}
class Person {
private String name;
private int age;
public String getName() { //get方法 用于获取当前对象的信息
return this.name;
}
public void setName(String name) {// 通过set方法,给我们的成员进行赋值
this.name = name;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {//定义了if语句,对输入的age值进行判断
if (age < 0 || age > 100) {
throw new IllegalArgumentException("invalid age value");
}
this.age = age;
}
}
同样,外部代码不能直接读取private字段,但是也可通过getter和setter方法来进行获取和赋值。
其中调用方法的语句是: 实例变量.方法名(参数);。
定义方法
修饰符 方法返回类型 方法名(方法参数列表){
若干方法;
return 方法返回值;
}
方法返回值通过 return语句实现,如果没有返回值,返回类型设置为void可以省略return。
private方法
private方法和private的关键字一样是不允许外部调用。
class Person {
private String name;
private int birth;
public void setBirth(int birth) {
this.birth = birth;
}
public int getAge() {
return calcAge(2019); // 调用private方法
}
// private方法:
private int calcAge(int currentYear) {
return currentYear - this.birth;
}
public class Main {
public static void main(String[] args) {
Person ming = new Person();
ming.setBirth(2008);
System.out.println(ming.getAge());
}
}
这段代码中的,calAge() 是一个private方法,外部代码无法调用,但是内部方法 getAge()可以调用它。
此外,可以看到这段代码中自定义了 birth,没有定义age,通过方法getAge()返回的是一个实时的计算的值,并非存储在某个字段中的值,这说名方法可以封装一个类的对外接口,调用方法方不需要知道我们的类中有没有age这个字段。
this变量
在方法内部 可以使用一个隐含的变量 this, 它始终指向当前实例, 所以通过使用this关键字可以访问当前实例的字段。
class Person {
private String name;
public String getName() {
return name; // 相当于this.name
}
}
当有局部变量和字段名重名,那么局部变量优先级高,就必须加上this
class Person {
private String name;
public void setName(String name) {
this.name = name; // 前面的this不可少,少了就变成局部变量name了
}
}
方法参数
方法可以包含0或任意个参数,方法参数用于接受传递给方法的变量值,调用方法是,必须严格按照参数的定义传值:
class Person {
...
public void setNameAndAge(String name, int age) {
...
}
}
调用这个 setNameAndAge()方法时,必须要有两个参数,并且对应的顺序必须是String和int:
Person ming = new Person();
ming.setNameAndAge("Xiao Ming"); // 编译错误:参数个数不对
ming.setNameAndAge(12, "Xiao Ming"); // 编译错误:参数类型不对
可变参数
可变参数用类型... 定义,类似与数组类型:
class Group {
private String[] names;
public void setNames(String... names) {
this.names = names;
}
}
Group g = new Group();
g.setNames("Xiao Ming", "Xiao Hong", "Xiao Jun"); // 传入3个String
g.setNames("Xiao Ming", "Xiao Hong"); // 传入2个String
g.setNames("Xiao Ming"); // 传入1个String
g.setNames(); // 传入0个String
可以写成这个类型
class Group {
private String[] names;
public void setNames(String[] names) {
this.names = names;
}
}
但是,调用的时候就比较麻烦:
Group g = new Group();
g.setNames(new String[] {"Xiao Ming", "Xiao Hong", "Xiao Jun"}); // 传入1个String[]
也可以传入Null:
Group g = new Group();
g.setNames(null);
参数绑定
基本类型参数的传递,是调用方值的复制。双方各自的后续修改,互不影响
引用类型参数的传递,调用方的变量,和接收方的参数变量,指向的是同一个对象。双方任意一方对这个对象的修改,都会影响对方(因为指向同一个对象嘛)。
String也是引用数据类型,但是由于String的不可变性,在后续对String的对象进行赋值的时候,会新建一个对象,此时通过get获取到的值仍然是第一次set的值。
浙公网安备 33010602011771号