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方法的更多相关文章

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

    方法重载 方法重载Overload是指:多个方法的方法名相同,但各自的参数不同 参数的个数不同 参数的类型不同 参数位置不同 方法返回值类型通常都是相同的 目的:相同功能的方法使用同一名字,便于调用 ...

  2. 廖雪峰Java2面向对象编程-1面向对象-1面向对象基础

    1.对象的概念 面向对象编程:Object-Oriented Programming 对现实世界建立计算机模型的一种编程方法. 现实世界 计算机模型 Java代码 人 类/class class Pe ...

  3. 廖雪峰Java2面向对象编程-3继承和多态-1继承

    1.继承 继承是一种代码复用的方式. Student与Person有相同部分的代码. Student可以从Person继承,这样Student获得了Person的所有功能,只需要编写新增的功能即可.通 ...

  4. 廖雪峰Java2面向对象编程-4抽象类和接口-2接口

    1.接口的定义 抽象方法本质上是定义接口规范. 在抽象类中定义了一个抽象方法,子类中必须实现这个抽象方法. public abstract class Person{ public abstract ...

  5. 廖雪峰Java2面向对象编程-4抽象类和接口-1抽象类

    每个子类都可以覆写父类的方法 如果父类的方法没有实际意义,能否去掉方法的执行语句?子类会报编译错误 如果去掉父类的方法,就失去了多态的特性 可以把父类的方法声明为抽象方法. 如果一个class定义了方 ...

  6. 廖雪峰Java2面向对象编程-6Java核心类-6常用工具类

    1.Math Math提供了数学计算的静态方法 序号 方法 描述 1 abs() 返回参数的绝对值.Math.abs(-9)//9 2 ceil() 返回大于等于( >= )给定参数的的最小整数 ...

  7. 廖雪峰Java2面向对象编程-6Java核心类-5枚举类

    直接定义常量 public class Weekday { //定义int常量 public static final int SUN = 0; public static final int MON ...

  8. 廖雪峰Java2面向对象编程-6Java核心类-4JavaBean

    1.JavaBean定义 符合以下命名规范的class被成为JavaBean private 类型的field 针对这个field的get和set方法 public class Person { pr ...

  9. 廖雪峰Java2面向对象编程-6Java核心类-3包装类型

    Java的数据类型: 基本类型:int boolean float 引用类型:所有class类型 为一个基本类型int赋值为null,会提示"incompatible types" ...

随机推荐

  1. linux服务器的日志管理

    消息紧急程度排行 emerg:该系统不可用 alert:需要立即修改 crit:紧急情况 err:错误信息 warning:预警信息 notice:具有重要性的普通条件 info:提供信息的消息 de ...

  2. Gravitee.io Access Management 组件

    Access Management组件在Gravitee.io 主要是进行认证以及权鉴的处理,支持oauth2 以及openid connect 等协议,同时好多功能已经集成在ui 管理界面上了,还是 ...

  3. Embedded SW uses STL or not

    As the complexity increasing of embedded software, more and more projects/products use C++ as the im ...

  4. idea+maven+springmvc+helloworld

    1.添加依赖,并在项目上添加Spring mvc框架的支持(add FrameWork Support): <dependency> <groupId>junit</gr ...

  5. AI update

    1, labeling工具 - 测试完成 使用fiji + Alps_Labeling_Tool.ijm 做labeling 生成的文件可以使用python读取 2,training -未开始 使用t ...

  6. Kubernetes 架构图

    Kubernetes 架构图: Pod K8S中最基础的调度单位是Pod,它有网络,有存储.Pod里面运行着一个或者若干个docker容器.同一个Pod里的容器共享同一个网络命名空间,可以使用loca ...

  7. tensorflow学习笔记

    常量的四则运算 import tensorflow as tf data1 = tf.constant(2) data2 = tf.constant(10) dataAdd=tf.add(data1, ...

  8. 在CentOS6.8系统上安装MySQL5.7(转)

    mysql-57">如何在CentOS 6.8系统上安装MySQL 5.7? 一.检查系统上是否已经安装MySQL 命令: ? 1 2 3 4 5 [root@localhost ~] ...

  9. InvokeRequired和Invoke(转)

    C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它.此时它将会在内部调用ne ...

  10. VMWare虚拟机安装 - 学习者系列文章

    以前笔者写过一个VMWare虚拟机的安装说明,但是那个版本比较低,已经过时,今天,讲讲VMWare的14版本的安装和使用说明. 首先,下载VMWare 14的安装文件,这里提供一下百度网盘文件: 链接 ...