廖雪峰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());
}
}
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);
}
}
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();
}
}
6.总结:
方法可以让外部代码安全地访问实例字段
方法是一组执行语句
方法内部遇到return时返回
void表示不返回任何值(注意和返回null不同)
外部代码通过public方法操作实例
内部代码可以调用private方法