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

时间:2023-03-09 03:46:25
廖雪峰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());
}
}

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

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);
}
}

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

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();
}
}

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

6.总结:

方法可以让外部代码安全地访问实例字段

方法是一组执行语句

方法内部遇到return时返回

void表示不返回任何值(注意和返回null不同)

外部代码通过public方法操作实例

内部代码可以调用private方法