ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

第十章 封装

2022-07-11 22:01:41  阅读:168  来源: 互联网

标签:set 封装 get age 第十章 p1 方法


1 封装

1.1 面向对象的三大特征

封装
继承
多态

有了封装,才有继承;有了继承,才能说多态。

 

1.2 面向对象的三大首要特征:封装

什么是封装?有什么用?
现实生活中很多现实的例子都是封装的,例如:
手机,电视机,笔记本电脑,照相机,这些都是外部有一个壳,封装起来保户内部的部件。保存内部的部件是安全的,另外封装了之后,对于我们使用者来说,我们是看不见内部的复杂结构的,我们也不需要关心内部有多么复杂,我们只需要会操作即可。

那么封装,你觉得有什么用呢?
封装的作用有两个:
第一个作用:保证内部结构的安全。
第二个作用:屏蔽复杂,暴露简单。

在代码级别上,封装有什么用?
一个类体当中的数据,假设封装之后,对于代码的调用人员来说,不需要关系代码的复杂实现,只需要通过一个简单的入口就可以访问了。
另外,类体中安全级别较高的数据封装起来,外部人员不能随意访问了,来保证数据的安全性。

 

1.3 封装的引入

Person.java


/*
Person表示人类:
每一个人都有年龄这样的属性。
年龄age, int类型

我这里先不使用封装机制,分析程序存在什么缺点?
Person类的age属性对外暴露,可以在外部程序中随意访问,导致了不安全。

怎么解决这个问题?
封装。
*/

// 这是没有封装的Person
public class Person{

// 实例变量(属性)
int age;  // age属性是暴露的,在外部程序中可以随意访问,导致了不安全
}

PersonTest.java


// 在外部程序中访问Person这个类型中的数据。
public class PersonTest{
public static void main(String[] args){

// 创建Person对象
Person p1 = new Person();

// 访问一个人的年龄
// 访问一个对象的属性,通常包括两种操作,一种是读数据,一种是改数据。
// 读数据
System.out.println(p1.age);  // 读数据(get表示获取)

// 修改数据(set表示修改/设置)
p1.age = 50;
System.out.println(p1.age);

// 在PersonTest这个外部程序中目前是可以随意对age属性进行操作的。
// 一个人的年龄值不应该为负数
// 程序中给年龄赋值了一个负数,按说不符合业务要求的,但是程序目前还是通过了
// 其实这就是程序的一个bug
p1.age = -100;  // 改(随意在这里对Person内部数据进行访问,导致了不安全)
System.out.println(p1.age);  // 读

}
}

 

1.4 如何进行封装

第一步:属性私有化(使用private关键字进行修饰。)
第二步:1个属性对外提供set和get方法。外部程序只能通过set方法修改,只能通过get方法读取,可以在set方法中设立关卡来保存数据的安全性。

在强调一下:
set方法和get方法都是实例方法,不能带static。
不带static的方法称为实例方法,实例方法的调用必须先new对象。
set和get方法写的时候有严格的规范要求:
set方法长这个样子:
public void set + 属性名首字母大写(1个参数){
               
          }
get方法长这个样子:
public 返回值类型 get+属性名首字母大字(无参){
return xxx;
}

Person.java


// 尝试封装一下
// 不再对外暴露复杂的数据,封装起来
// 对外只提供简单的操作入口。
// 优点:第一数据安全了,第二调用者也方便了。
public class Person2{
// private表示私有的,被这个关键字修饰之后,该数据只能在本类中访问。
// 出了这个类,age属性就无法访问了。
private int age;

// 对外提供简单的访问入口
// 外部程序只能通过调用以下的代码来完成访问
// 思考:你应该对外部提供几个入口?
// 思考:这些操作入口是否应该是方法呢?
// 写一个方法专门来完成读。(get)
// 写一个方法专门来完成写。(set)
// get和set方法应该带有static,还是不应该有static, get和set方法应该定义为实例方法吗?
// get读年龄,set改年龄,这个读和改都是操作的一个对象的年龄。(没有对象何来年龄)
// 封装的第二步:对外提供分开的set方法和get方法作为操作入口,并且都不带有static。都是实例方法
/*
[修饰符列表] 返回值类型 方法名(形式参数列表){
}

注意:
java开发规范中有要求,set方法和
get方法要满足以下格式。
public 返回值类型 get+属性名首字母大写(无参){
return xxx;
}
set方法的要求:
public void set+属性名首字母大写(有1个参数){
xxx = 参数;
}
大写尽量按照java规范中要求的格式提供set和get方法。
如果不按照这个规范格式来,那么你的程序将不是一个通用的程序。
*/

// get方法
public int getAge(){
return age;
}
// set方法
public void setAge(int ages){
// 能不能在这个位置上设置关卡
if(ages < 0 || ages > 150){
System.out.println("对不起,年龄值不合法,请重新赋值!");
return;  // 直接终止程序的执行。
}
// 程序能够执行到这里,说明年龄一定是合法的。
age = ages;
}
}


/*
java中最难学习的是JavaSE
JavaSE中最难学习的是面向对象
*/

PersonTest02.java


public class PersonTest02{
public static void main(String[] args){
// 创建对象
Person2 p1 = new Person2();

// Person的age,彻底在外部不能访问了,但是这难免有点太安全了。
// age不能访问,这个程序就意义不大了。
/*
// 读age属性的值
System.out.println(p1.age);

// 修改age属性的值
p1.age = 20;

// 读age
System.out.println(p1.age);
*/

// 通过“类名.”可以调用set和get方法吗? 不行。
// 只有方法修饰符列表中有static的时候,才能使用“类名.”的方式访问
// 错误
// Person.getAge();

// 读调用getAge()方法
// int year = p1.getAge();
// System.out.println(year);
// 以上代码联合
System.out.println(p1.getAge());

// 改调用setAge()方法
p1.setAge(20);
System.out.println(p1.getAge());

p1.setAge(-100);
System.out.println(p1.getAge());  // 对不起,年龄值不合法,请重新赋值!
}
}
 

 

 

 

标签:set,封装,get,age,第十章,p1,方法
来源: https://www.cnblogs.com/jingxian666/p/16468105.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有