返回顶部
扩大
缩小

Yeap

面向对象-方法

方法

一个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的值。

posted on 2020-11-22 15:45  YP泡泡  阅读(97)  评论(0)    收藏  举报

导航