封装

来源:互联网 发布:笔记本电脑蹭网软件 编辑:程序博客网 时间:2024/06/05 04:55

1. 封装

1.1. Java面向对象三大特性

(1)封装

(2)继承

(3)多态

1.2. 什么是封装?

封装是把类中的属性私有化,并提供公共的方法来返回属性的值,如果想从外部修改这些属性,只能通过公共的方法,而无法直接访问属性。类中的属性被隐藏,所以封装也成为数据隐藏。

1.3. 封装的步骤

(1) 将属性私有化

(2) 编写getset方法(get,set访问器)

(3) get,set中根据需求可以加入属性控制语句

封装的好处:

l 类的属性可以对外只读。

l 类可以完全控制自己的属性。

l 类可以修改属性的数据类型,而不会影响到外部的调用。

示例:

public class Dog {

private String name; //名字

private int love;//和主人的亲密度 0-100

private int health;//健康值

private String strain; //品种

public String getName(){

return name;

}

public int getLove(){

return love;

}

public int getHealth(){

return health;

}

public String getStrain(){

return strain;

}

public void setName(String name){

this.name = name;

}

public void setLove(int love){

if(love>=0 && love<=100){

this.love = love;

}else{

System.out.println("亲密度输入有误,取默认值60");

this.love = 60;

}

}

public void setHealth(int health){

if(health>=0 && health<=100){

this.health = health;

}else{

System.out.println("健康值输入有误,取默认值60");

this.health = 60;

}

}

public void setStrain(String strain){

this.strain = strain;

}

/**

 * 显示宠物各项信息

 */

public void print(){

System.out.println("宠物的自白:\n我叫"+this.getName()+",我的健康为:"+this.getHealth()

+",和主人的亲密度为:"+this.getLove()+",我是一只"+this.getStrain());

}

}

package com.njwb.fengzhuang;

public class Dog2 {

private String name; //名字

private int love;//和主人的亲密度 0-100

private int health;//健康值

private String strain; //品种

public String getName(){

return name;

}

public int getLove(){

return love;

}

public int getHealth(){

return health;

}

public String getStrain(){

return strain;

}

public void setName(String name){

this.name = name;

}

public void setLove(int love){

if(love<0 || love>100){

System.out.println("亲密度输入有误,取默认值60");

this.love = 60;

return;

}

this.love = love;

}

public void setHealth(int health){

if(health<0 || health>100){

System.out.println("健康值输入有误,取默认值60");

this.health = 60;

return;

}

this.health = health;

}

public void setStrain(String strain){

this.strain = strain;

}

/**

 * 显示宠物各项信息

 */

public void print(){

System.out.println("宠物的自白:\n我叫"+this.getName()+",我的健康为:"+this.getHealth()

+",和主人的亲密度为:"+this.getLove()+",我是一只"+this.getStrain());

}

}

如何中的属性外界只能写不能读

场景Person实例化为小红时,不希望getAge方法

示例:略

总结如果使用了封装,属性可以只读或者只写(不写getset方法

如果的属性数据类型发生变化,如何把影响降到最低?

场景age改为String类型

示例:

private String age; //年龄

public String getAge(){

return this.age;

}

public void setAge(int age){

if(age>0 && age<=120){

this.age = String.valueOf(age);

}else{

System.out.println("年龄输入有误,将取默认值18");

this.age = String.valueOf(age);

}

}

总结如果使用了封装,只需要稍微修改set方法封装可以让我们更容易的修改内部代码却不会影响外部代码。

如何对成员变量进行精确的控制?

场景设置年龄时打成了200

示例

private int age;//年龄

public int getAge(){

return this.age;

}

public void setAge(int age){

if(age>0 && age<=120){

this.age = age;

}else{

System.out.println("年龄输入有误,将取默认值18");

this.age = 18;

}

}

总结如果使用了封装,只需要稍微修改set方法。封装可以让类对赋值做出判断

如何在取值时返回结果精确控制?

场景sex性别属性保存的值是01但返回值要求男或女

示例

/**

 * 传入的参数 是01,但是sex当前类的属性值是String类型

 * @param sexIndex

 */

public void setSex(int sexIndex){

if(sexIndex==0){

this.sex ="";

}else if(sexIndex==1){

this.sex ="";

}else{

System.out.println("性别输入有误,将取默认值男");

this.sex ="";

}

}

1.4. 对象数组

package com.njwb.fengzhuang;

import java.text.DecimalFormat;

/**

 * 一个班有4个同学,每个同学有3门成绩,分别是语文成绩,数学成绩,英语成绩,设计一个方法,计算每个学生的平均分和总分

 * shift+alt+s ,r --> tab-->  enter--->shift tab -->enter

 * 右击---source---generater getter and setters ---select all--->ok 

 * 1.创建1个学生类 ,声明4个属性  名字 ,3门成绩

 * 2.创建1个业务类  声明1个方法,方法参数设计成对象数组

 * 3.测试类 ,准备好数据,存储对象数组 ,调用方法

 * @author Administrator

 *

 */

class Student{

private int chinese;//语文成绩

private int math;//数学成绩

private int english;//英语成绩

private String name; //学生名字

 

/**

 *无参构造

 */

public Student() {

}

/**

 * 3个参数

 * @param chinese

 * @param math

 * @param english

 */

public Student(String name,int chinese,int math, int english) {

this.name = name;

this.chinese = chinese;

this.math = math;

this.english = english;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getChinese() {

return chinese;

}

public int getEnglish() {

return english;

}

public int getMath() {

return math;

}

public void setChinese(int chinese) {

this.chinese = chinese;

}

public void setEnglish(int english) {

this.english = english;

}

public void setMath(int math) {

this.math = math;

}

}

 

 

/**

 * 业务类,用来计数每个人的总分,均分

 * @author Administrator

 *

 */

class Calculate{

/**

 * 传的是对象数组 ,数组中的每一个元素都是学生对象stu ,每一个学生的总分,平均分

 * @param stus

 */

public void calScore(Student[] stus){

double sum = 0; //用来存储每一个学生的总分

for(int i=0;i<stus.length;i++){

sum = 0;//清零

Student stu = stus[i];

sum+= stu.getChinese()+stu.getMath()+stu.getEnglish();

//打印一个学生的平均分,总分

System.out.println(stu.getName()+"的总分为:"+sum+",均分为:"+new DecimalFormat("#.00").format(sum/3));

}

}

}

/**

 * 测试类

 * @author Administrator

 *

 */

public class TestScore {

public static void main(String[] args) {

/*//准备好数据 创建4个学生对象

Student stu1 = new Student("张三",78,90,98);

Student stu2 = new Student("李四",77,91,90);

Student stu3 = new Student("王五",75,92,93);

Student stu4 = new Student("赵六",73,93,97);

//声明长度为4的对象数组

Student[] arr = new Student[4];

//将准备好的数据,存入数组

arr[0] = stu1;

arr[1] = stu2;

arr[2] = stu3;

arr[3] = stu4;

//实例化业务类

Calculate ca = new Calculate();

//调用方法计算

ca.calScore(arr);*/

//声明长度为4的对象数组

Student[] arr = new Student[4];

//准备好数据 创建4个学生对象 存入数组

arr[0] = new Student("张三",78,90,98);

arr[1] = new Student("李四",77,91,90);

arr[2] = new Student("王五",75,92,93);

arr[3] = new Student("赵六",73,93,97);

//实例化业务类

Calculate ca = new Calculate();

//调用方法计算

ca.calScore(arr);

}

}

1.5. StringBuilder,StringBuffer

package com.njwb.stringuse;

/**

 * StringBuffer  线程安全的可变字符序列  ,效率低

 * StringBuilder 线程不安全的可变字符序列  两者的用法基本相同 ,效率高

 * StringBuffer()

          构造一个其中不带字符的字符串缓冲区,其初始容量为 16个字符。

    StringBuffer(int capacity)  capacity>0

          构造一个不带字符,但具有指定初始容量的字符串缓冲区。

    StringBuffer(String str)

          构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。

"this_is_a_cat!"   1.改成“ThisIsACat!”  2.再改成“Cat!AIsThis”

"you is a good person!" 改成“YouIsAGoodPerson!” 改成“Person!GoodAIsYou”

先按“_”或者“ ”拆分成String[]数组 ,取出数组的每一个元素  ,每一个元素取出首字母转大写 ,每一个元素的其余字母不变,最后将每个元素拼接起来

 * @author Administrator

 *

 */

public class TestStringBuffer {

public static void main(String[] args) {

System.out.println("---------StringBuffer的使用--------------");

//StringBuffersb = new StringBuffer();

StringBuffer sb = new StringBuffer(10);

//有一个初始化的字符串

//StringBuffersb = new StringBuffer("today");

sb.append("hello").append("world").append("hello");

sb.append("hehe");

System.out.println(sb.toString());

System.out.println("---------StringBuilder的使用--------------");

//StringBuilder sb2 = new StringBuilder();

//StringBuilder sb2 = new StringBuilder(10);

StringBuilder sb2 = new StringBuilder("today");

sb2.append("today").append("is").append("cloudy");

sb2.append("hello");

System.out.println(sb2.toString());

}

}

package com.njwb.stringuse;

/**

 * "this_is_a_cat!"   1.改成“ThisIsACat!”  2.再改成“Cat!AIsThis”

 * @author Administrator

 *

 */

public class TestString {

public static void main(String[] args) {

String str = "this_is_a_cat!";

String[] arr = str.split("_");

System.out.println("--------方式1------------");

/*for(int i=0;i<arr.length;i++){

arr[i] =arr[i].substring(0, 1).toUpperCase()+arr[i].substring(1);

System.out.print(arr[i]);

}*/

//

/*for(int i=arr.length-1;i>=0;i--){

arr[i] =arr[i].substring(0, 1).toUpperCase()+arr[i].substring(1);

System.out.print(arr[i]);

}*/

System.out.println("--------方式2------------");

StringBuffer sb = new StringBuffer();

//索引

/*for(int i=0;i<arr.length;i++){

//拼接每个单词的首字母,首字母要大写 ,拼接每个单词的剩余字母

sb.append(arr[i].substring(0, 1).toUpperCase()).append(arr[i].substring(1));

}*/

for(int i=arr.length-1;i>=0;i--){

//拼接每个单词的首字母,首字母要大写 ,拼接每个单词的剩余字母

sb.append(arr[i].substring(0, 1).toUpperCase()).append(arr[i].substring(1));

}

System.out.println(sb.toString());

System.out.println("--------方式3------------");

StringBuffer sb2 = new StringBuffer();

//增强for  不可以逆序

for(String s:arr){

sb2.append(s.substring(0, 1).toUpperCase()).append(s.substring(1));

}

System.out.println(sb2.toString());

}

}

1.6. 作业

(1) 人机对话。实现以下对话:

用户:你好

电脑:你好,在啊?

用户:在啊

电脑:你在做什么?

用户:我在吃饭/我在听歌/我在睡觉/我在学习

电脑:饭好香/很好听/我也困了/加油哟~

用户:你会做什么/你能做什么/你有什么功能/你的功能是什么?

电脑:我的特意功能就是什么都不会

用户:你喜欢吴彦祖、刘德华还是周星驰?你喜欢天空、沙漠还是大海?你喜欢女孩、人妖还是男孩?你喜欢房子、教室还是桌子?

电脑:我喜欢周星驰(随机)

用户:请告诉我120以内的奇数之和/请告诉我210以内的偶数之和

电脑:120以内的奇数之和是XXXX

用户:问:这个世界上谁最美?答:当然是XXX啦。

(把问题和答案存入数组questionListArray[0]=”问:这个世界上谁最美?答:当然是XXX啦。

电脑:嗯,记住啦。

用户:这个世界上谁最美?

电脑:当然是XXX啦。

用户:问:我的朋友谁最二?答:当然是王大锤啊!

电脑:嗯,记住啦。

用户:我的朋友谁最二?

电脑:当然是王大锤啊!

用户:拜拜

电脑:我走了

(2) 图书管理系统。应该正好是2个类,Demo.java+Book.java

=====图书管理系统=====

1. 显示所有的图书

2. 添加图书

3. 删除图书

4. 编辑图书

5. 购买

 

请输入功能编号(1~5):

 

Book

属性->数组BookList

Boolist[0] = “书名,价格,作者”;

 

构造方法

在构造方法中,初始化数组BookList,在没有添加图书时,至少内部有三本书。

 

第一个方法:showAllBook 显示所有数组中的图书

第二个方法:addBook 接收三个参数,分别是书名、价格、作者,存如数组

第三个方法:delBook删除图书,接收一个参数:书名,根据书名删除数组中的元素

第四个方法:editBook编辑图书,接收三个参数,分别是书名、价格、作者,根据书名修改价格和作者

第五个方法:buyBook购买图书,把所有图书显示出来,在左侧显示出图书的编号,

1 书名,价格,作者

书名,价格,作者

3 书名,价格,作者

书名,价格,作者

用户可以输入编号:1,2,3,4,表示想买哪种书,用户可以输入购买数量,

在控制台输出用户的购物清单,同时计算总价格。