廖雪峰Java2面向对象编程-2数据封装-1方法

1.数据封装

一个class可以包含多个field。直接把field用public暴露给外部可能破坏了封装,例如传入不合理的数值(年龄填入1000)。如下

public class Person {
    public String name;
    public int age;
}

2.class模版

用private修饰field可以拒绝外部访问
定义public方法可以间接修改field
使用封装可以在方法中对参数进行处理。如对name去除首尾的空格。

方法定义:

  • 修饰符 public private
  • 方法返回值:没有返回值用void
  • 方法名称:首字母小写,后面的每个单词大写
  • 方法参数列表:多个参数用逗号隔开
  • 方法体:
    * 方法返回值通过入return语句实现,没有返回值(void)可以省略return
    * 方法内部可以使用隐式变量this:this指向当前实例,this.field可以访问当前实例的字段。
    * 不引起歧义的情况下,可省略this。局部变量名优先原则
public class Person {
    private String name;
    private int age;
    
    public void setName(String name) {
        this.name = name.trim();    //局部变量名优先,如果存在同名,不能省略
    }
    public String getName() {
        return name;    //return this.name;
    }
    public void setAge(int age) {
        this.age = age;    
    }
    public int getAge() {
        return this.age;
    }
}

3.外部代码访问class

  • 外部代码不可访问private字段
  • 外部代码通过调用public方法间接设置和获取private字段
  • public方法封装了数据访问
  • 通过方法访问实例字段更安全
  • 通过变量.方法名()来调用实例方法
public class Hello {
    public static void main(String[] args) {
        Person ming = new Person();
        ming.setName("小明");
        ming.setAge(12);
        System.out.println(ming.getName());
        System.out.println(ming.getAge());
    }
}

1418970-20190113110034116-1032352334.png

4.参数绑定

更改模版类中方法的参数,实例传参无效,但也不会影响外部的变量值。没啥卵用,可忽略
Person.java

public class Person {
    private String name;
    private int age;    
    public void setName(String name) {
        name =" 张三 ";
        this.name = name.trim();
    }
    public String getName() {
        return this.name;
    }
    public void setAge(int age) {
        age = 60;
        this.age = age;
    }
    public int getAge() {
        return this.age;
    }
}

Hello.java

public class Hello {
    public static void main(String[] args) {
        Person ming = new Person();
        String s = "小明";
        int i = 12;
        ming.setName(s);
        ming.setAge(i);
        System.out.println("实例变量ming.getName():"+ming.getName());
        System.out.println("实例变量ming.getAge():"+ming.getAge());
        System.out.println("外部变量s:"+s);
        System.out.println("外部变量i:"+i);
    }
}

1418970-20190113113111026-788590951.png

5.定义private方法

如果public方法有重复的部分,可以定义private方法提高代码复用性。
类中private方法只能由类的public方法调用,实例不能直接调用。
Person.java

public class Person {
    private String name;
    private int age;    
    public void setName(String name) {
        this.name = name.trim();
    }
    private String getName() {
        return this.name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    private int getAge() {
        return this.age;
    }
    private int getBirth() {
        return calcBirth(2019);
    }
    private int calcBirth(int currentYear) {
        return currentYear - age;
    }
    public void info() {
        System.out.printf("我是%s,我出生于%d年,今年%d岁" ,name, getBirth(),age);
    }
}

Hello.java

public class Hello {
    public static void main(String[] args) {
        Person ming = new Person();
        ming.setName("  小明  ");
        ming.setAge(16);
        ming.info();
    }
}

1418970-20190113115602081-864584354.png

6.总结:

方法可以让外部代码安全地访问实例字段
方法是一组执行语句
方法内部遇到return时返回
void表示不返回任何值(注意和返回null不同)
外部代码通过public方法操作实例
内部代码可以调用private方法

转载于:https://www.cnblogs.com/csj2018/p/10256597.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值