Java方法定义

Java方法定义,第1张

1、方法应用场景

        一个class可以包含多个field,但是直接把field用public暴露给外部可能会破坏封装性。

class Person {
    public String name;
    public int age;
}
Person ming = new Person();
ming.name = "Xiao Ming";
ming.age = -99;     // 设置age为负数,显然不合理

        直接 *** 作field,容易造成逻辑混乱,为了避免外部代码直接去访问field,可以使用private修饰field,拒绝外部访问。这时候就需要使用方法(method)来让外部代码可以间接修改field。

class Person {
    private String name;
    private int age;
    
    public String getName() {  // 获取name值
        return this.name;    
    }
    
    public void setName(String name) {  // 设置name值
        if (name == null || name.isblank()) {
            // 显示抛出异常
            throw new IllegalArgumentException("invalid name");      
        }
        this.name = name.strip();  // 去掉首尾空格  
    }
    
    public int getAge() {   // 获取age值
        return this.age;
    }
    
    public void setAge(int age) {  // 设置age值
       // 校验age值,小于0或大于100抛出异常
        if (age < 0 || age >100) {
            throw new IllegalArgumentException("invalid age value");  
        }    
        this.age = age;
    }
}

Person ming = new Person();
ming.setName("Xiao Ming");  // 设置name
ming.setAge("18");
System.out.println(ming.getName() + ", " + ming.getAge());

        虽然外部代码不能直接修改private字段,但是,外部代码可以调用方法setName()和setAge()来间接修改private字段。

        在方法内部,我们就有机会检查参数对不对,如:setAge()就会检查传入的参数,参数超出了范围直接报错,这样,外部代码就没有任何机会把age设置成不合理的值。

        一个类通过定义方法,就可以给外部代码暴露一些 *** 作的接口,同时,内部自己保证逻辑一致性。

        调用方法语句是 " 实例变量名.方法名(参数); ",一个方法调用就是一个语句,所以不要忘了在末尾加 ';'分号。

2、定义方法

        定义方法的语法:

修饰符 方法返回类型 方法名(方法参数列表) {
    // 若干方法语句
    return 方法返回值;
}

        方法返回值通过return语句实现,如果没有返回值,返回类型设置为void,可以省略return。

(1)private方法

        private方法和private字段一样,不允许外部调用,但内部方法是可以调用private方法的。

class Person {
    private String name;
    private int birth;
    
    public void setBirth(int birth) {
        this.birth = birth;  // 设置出生日期    
    }
    
    public int getAge() {
        return   calcAge(2022); //调用private方法  
    }
    
    // 定义private方法
    private int calcAge(int currentYear) {
        return currentYear - this.birth;  // 计算年龄    
    }
}

Person ming = new Person();
ming.setBirth(2008);
System.out.println(ming.getAge());  // 获取年龄:2022-2008
// 输出结果:14

        Person类并没有定义age字段,获取age时,通过方法getAge()返回的是一个实时计算的值,并非存储在某个字段的值。这说明方法可以封装一个类的对外接口,调用方不需要知道也不用关心Person实例在内部到底没有没age字段。

3、this变量

        在方法内部,可以使用一个隐含的变量this,它始终指向当前实例。

        因此,通过"this.字段名"就可以访问当前实例的字段,如果没有命名冲突,可以省略this。

        但是,如果有局部变量和字段重名,那么局部变量优先级更高,就必须加上this。

class Person {
    private String name;
    
    public String getName(){
        return name;  // 相当于this.name
    }
    
    public void setName(String name){
        this.name = name;  // 前面的this不可少,少了就变成局部变量name了    
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/720974.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存