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. 【BZOJ3514】 Codechef MARCH14 GERALD07加强版

    hentai... 原题: N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. 对于100%的数据,1≤N.M.K≤200,000. 直接复制wulala的题解 wulal ...

  2. 【BZOJ3144】【HNOI2013】切糕

    总算做了一道2011以后的省选题了……原题: 图片题面好评! P,Q,R≤40,0≤D≤R,给出的所有的不和谐值不超过1000. 文本样例好评! 恩这个是听妹主席讲过后会写的,首先把每个点拆成链,那么 ...

  3. day05 Spring中自定义注解的用处-之获取自定义的Servie

    PS: 在RPC远程调用中,想要获取自定义的service的方法,就得自定义标签遍历拿到方法 PS:在spring中,两个最核心的 概念是aop和ioc,aop其实就是动态代理. ioc 就是解决对象 ...

  4. centos7和linux防火墙配置入门

    linux部分 iptables -L    列出当前防火墙策略 iptables -F   清空防火墙策略 iptables -P INPUT  DROP   默认设置丢弃进来的流量包(-p指默认策 ...

  5. MySQL Replication--修改主键为NULL导致的异常

    测试环境:MySQL 5.5.14/MySQL 5.6.36 测试脚本: create table tb001(id int primary key,c1 int); alter table tb00 ...

  6. Cassandra -- Cassandra 3.0版本安装

    ============================================================ 服务器信息 搭建三节点的Cassandra群集: SERVER1: 192.1 ...

  7. checkbox复选框,如何让其勾选时触发一个事件,取消勾选时不触发

    <input type="checkbox" onclick="checkboxOnclick(this)" /> <script> f ...

  8. 如何使用Hanlp加载大字典

        问题 因为需要加载一个 近 1G 的字典到Hanlp中,一开始使用了CustomDictionay.add() 方法来一条条的加载,果然到了中间,维护DoubleArraTre 的成本太高,添 ...

  9. thinkPHP 3.2.3操作MongoDB指南

    今天使用thinkPHP操作MongoDB发现跟用MYSQL有很多不同的地方,在这里特别跟大家分享下. 暂时没用thinkPHP5一直还在用thinkPHP3.2.3觉得挺好用,MongoDB版本2和 ...

  10. Streaming SQL for Apache Kafka

    KSQL是基于Kafka的Streams API进行构建的流式SQL引擎,KSQL降低了进入流处理的门槛,提供了一个简单的.完全交互式的SQL接口,用于处理Kafka的数据. KSQL是一套基于Apa ...