面向对象三大特性:封装

面向对象三大特性:封装、继承、多态、【抽象】

封装的概述

/*
 * 需求:要求定义一个狗类,拥有姓名、品种、健康值、亲密度以及一个自我介绍的方法。
 * 联系qq宠物
 * */
	// 姓名
	public String name;
	// 品质
	public String breed;
	// 健康证
	public int health;
	// 亲密度
	public int love;
	
	public void showSelf() {
		System.out.println("狗名:" + name);
		System.out.println("狗种类:" + breed);
		System.out.println("狗健康值:" + health);
		System.out.println("狗亲密度:" + love);
	}
		// 创建对象
        Dog dog = new Dog();
		dog.name = "小黄";
		dog.breed = "柴犬";
		dog.health = -10;
	
		dog.showSelf();
	}

 从业务角度,dog亲密度属性赋值不能出现负数。、

但是从程序语法角度,它没有出现错误!

        亲密度(love)属性的数据类型是:int

解决方法:

        在赋值后,进行业务判断

Dog dog = new Dog();
		dog.name = "小黄";
		dog.breed = "柴犬";
		dog.health = -10;
		if (dog.health < 0 || dog.health > 100) {
			System.out.println("对不起!健康值非法!已设为默认值!");
			dog.health = 60;
		}
		dog.love = -80;
		if (dog.love < 0 || dog.love > 100) {
			System.out.println("对不起!亲密度非法!已设为默认值!");
			dog.love = 60;
		}
		dog.showSelf();
	}

 但是,这种方案在每次使用Dog类创建对象时,都需要采用一下(都要判断)。

我们将这种重复的代码段,提取到了Dog类的方法中。

public void setLove(int love) {
		if (love < 0 || love > 100) {
			System.out.println("对不起!亲密度非法!已经设为默认值!");
			love = 60;
		}
		this.love = love;
	}

 赋值方式以后采用调用setLove方法即可保证每次赋值时都会执行业务验证。

// 键盘录入狗的信息
		Scanner input = new Scanner(System.in);
		// 创建狗对象并赋值
		Dog dog = new Dog();
		System.out.println("请输入狗狗的名字:");
		dog.name = input.next();
		System.out.println("请输入狗狗的品种:");
		dog.breed = input.next();
		System.out.println("请输入狗狗的健康值:");
		dog.health = input.nextInt();
		System.out.println("请输入狗狗的亲密度:");
		dog.setLove(input.nextInt());
		
		
		dog.showSelf();
	}

虽然定义了一个方法用于进行属性赋值,但是因为语法角度的原因,很可能有使用者没有采用该方法,那么刚才的问题就依然存在。

经过分析,导致该问题存在的原因是访问权限修饰符是 public,这种修饰符允许其他类操作 Dog 的属性。(联想思路:进入教室有门和窗口,正常应该走门,但有些人非要走窗口。可以考虑把窗口 “封上” (加上防盗网),这样就只能通过门进入教室。)

解决方法:修改亲密度(love)的访问权限修饰符为private(只在Dog类中使用该属性)

封装:将类的某些信息隐藏在类内部,不允许外部程序之间访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问,把尽可能多的东西藏起来,对外提供便捷的接口。

封装的使用

1.属性私有化:将访问权限修饰符更改为private

2.提供公共的操作和访问方法(setter/getter方法):每个属性创建两个方法,1个是设置setXX,1个是取值getXX

3.根据需要,在操作和访问方法中添加合理的判断和处理

----------------------

以后,在定义java类时,基本都要使用封装的这些步骤实现。

一般javaBean规范:

        属性私有化

        提供公共的操作和访问方法

        编写无参构造方法

        实现系列化接口(了解)

封装的优势

1.便于使用者正确使用系统,防止错误修改属性。(安全性、健壮)

2.有助于系统之间的松耦合(低耦合),提高系统独立性

3.提高软件的课重用性(相对独立的整体,高内聚)

包组织结构

在java中可以通过建立package来实现对类的分类整理。而且从系统的角度,一个文件夹下不允许出现两个同名文件。

在硬盘上,package实际上就是一个文件夹而已。

包名的规范:

1.包名应该全部小写(根据需要,也可以考虑部分名词大写,保持正常简写)

2.公司/组织的域名倒序 + 项目名 + 部门/项目组 + 分类名 + ...

QQ程序:com.tencent.mobileqq.xx

package 包名; // 包声明,明确该类属于哪个包下的

// 导包 (不导包,使用某个类时,将无法定位到指定类)
// 包名 + 类名被称为该类的全限定名/全类名
inport 包名.类名;

public class 类名{
    // 类体
}

 注意事项:

1.在一个类中,使用另一个包中的类,需要进行导包操作。

        java.long包下的类使用时不需要导包

2.在一个类中,如果使用了两个同名的类,其中至少有一个需要使用全类名写法(包名+菜名)。

3.如果在使用某个类时,发现命名该类有这个方法,但就是使用不了!考虑是不是倒错包了。

访问权限修饰符

访问权限修饰符:用于限制访问权限的。

本类中、同包的不同类中、不同包的子类中。

修饰符\访问范围本类中同一个包的不同类中不同包的子类中本项目中
private(私有的)
默认的(包级的)
protected(受保护的)
public(公共的)

可以使用访问权限修饰符来修饰:类、成员变量、成员方法。

在java源代码文件中(.java)可以编写很多类,但是只能有一个类是被public修饰的,且该类的类名和源文件名保持一致

建议:没有特殊情况,一个源文件只写一个类。

static关键字

public static void main(String[] args) {

}

 static:静态的

是一个特殊的修饰符:

        可以用来修饰类:静态类

        可以用来修饰成员变量:静态变量

        被static修饰之后,成员变量不再属于对象,而是属于类。成员变量是对象独有的,不共享的信息。而类的信息是被该类所有的对象所有的对象所共享。static修饰的成员变量加载时机也是随着类的加载而加载。

        可以用来修饰成员变量:静态方法

        可以用来修饰代码块:静态代码块

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值