廖雪峰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方法
廖雪峰Java2面向对象编程-2数据封装-1方法的更多相关文章
- 廖雪峰Java2面向对象编程-2数据封装-1方法重载
		方法重载 方法重载Overload是指:多个方法的方法名相同,但各自的参数不同 参数的个数不同 参数的类型不同 参数位置不同 方法返回值类型通常都是相同的 目的:相同功能的方法使用同一名字,便于调用 ... 
- 廖雪峰Java2面向对象编程-1面向对象-1面向对象基础
		1.对象的概念 面向对象编程:Object-Oriented Programming 对现实世界建立计算机模型的一种编程方法. 现实世界 计算机模型 Java代码 人 类/class class Pe ... 
- 廖雪峰Java2面向对象编程-3继承和多态-1继承
		1.继承 继承是一种代码复用的方式. Student与Person有相同部分的代码. Student可以从Person继承,这样Student获得了Person的所有功能,只需要编写新增的功能即可.通 ... 
- 廖雪峰Java2面向对象编程-4抽象类和接口-2接口
		1.接口的定义 抽象方法本质上是定义接口规范. 在抽象类中定义了一个抽象方法,子类中必须实现这个抽象方法. public abstract class Person{ public abstract ... 
- 廖雪峰Java2面向对象编程-4抽象类和接口-1抽象类
		每个子类都可以覆写父类的方法 如果父类的方法没有实际意义,能否去掉方法的执行语句?子类会报编译错误 如果去掉父类的方法,就失去了多态的特性 可以把父类的方法声明为抽象方法. 如果一个class定义了方 ... 
- 廖雪峰Java2面向对象编程-6Java核心类-6常用工具类
		1.Math Math提供了数学计算的静态方法 序号 方法 描述 1 abs() 返回参数的绝对值.Math.abs(-9)//9 2 ceil() 返回大于等于( >= )给定参数的的最小整数 ... 
- 廖雪峰Java2面向对象编程-6Java核心类-5枚举类
		直接定义常量 public class Weekday { //定义int常量 public static final int SUN = 0; public static final int MON ... 
- 廖雪峰Java2面向对象编程-6Java核心类-4JavaBean
		1.JavaBean定义 符合以下命名规范的class被成为JavaBean private 类型的field 针对这个field的get和set方法 public class Person { pr ... 
- 廖雪峰Java2面向对象编程-6Java核心类-3包装类型
		Java的数据类型: 基本类型:int boolean float 引用类型:所有class类型 为一个基本类型int赋值为null,会提示"incompatible types" ... 
随机推荐
- java知识  特殊符号转换
			■情况 想把代码中的出现 “ ’等特殊符号时,在他们的前面,转换时自动加 \ 最后转换成json 决定用ObjectMapper这个类,先准备一个Map,之后,map作为一个参数,调用Obj ... 
- ApplicationContext之getBean方法详解
			转自:http://www.sohu.com/a/115194552_466964 我们知道可以通过ApplicationContext的getBean方法来获取Spring容器中已初始化的bean. ... 
- Go Example--变参函数
			package main import "fmt" func main() { sum(1,2) sum(1,2,3) nums := []int{1,2,3,4} //nums. ... 
- 【liunx】sftp常用命令
			sftp是Secure FileTransferProtocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.sftp与 ftp有着几乎一样的语法和功能.SFTP为 SSH的一部分, ... 
- Scala方法定义,方法和函数的区别,将方法转换成函数
			1. 定义方法和函数 1.1. 定义方法 方法的返回值类型可以不写,编译器可以自动推断出来,但是对于递归函数,必须指定返回类型 1.2. 定义函数 1.3.方法和函数的区别 在函数式编程语言中,函数是 ... 
- Spring定时器corn表达式详解
			1.结构 Spring定时器corn表达式详解 2.各字段的含义 字段 允许值 允许的特殊字符 秒 0~59 - * / 分 0~59 - * / 小时 0~23 - * / 日期 1~31 - * ... 
- oracle-scn
			在2012年第一季度的CPU补丁中,包含了一个关于SCN修正的重要变更,这个补丁提示,在异常情况下,Oracle的SCN可能出现异常增长,使得数据库的一切事务停止,由于SCN不能后退,所以数据库必须重 ... 
- 编写一个函数 reverse_string(char * string)实现:将参数字符串中的字符反向排列 。(递归实现)
			要求:不能使用C函数库中的字符串操作函数. 思路:在递归函数的调用时,先应该定义一个指针型char字符串.函数内部应先调用自己,在打印,这样才能保证字符串是从最后一个开始输出. #include< ... 
- 嵌入式LINUX设置时间
			date -s "2018-12-15 08:55:00" 安装NTP从网络获取时间 基于Linux的嵌入式开发,需要用到本地的时间,但是网上找了很多修改时间的命令,但大多是Lin ... 
- 编译opencv python
			1, 下载并且安装python2.7 + numpy 2,运行cmakegui打开opencv.应该要显示如下信息: Python 2: Interpreter: C:/Python27/python ... 
