廖雪峰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方法

posted on 2019-01-11 18:08  singleSpace  阅读(193)  评论(0编辑  收藏  举报