Java——面向对象封装性

引例:

// 用户类
public class User {
    //年龄
    int age;
}
/*
用户测试类
*/
public class UserTest {
    public static void main(String[] args) {
        User u = new User();
        int age = -100;

        System.out.println("用户的年龄是: " + u.age);  //-100
    }
}

对当前程序来说:

User 类中的age属性在外部程序中可以随意访问,导致age属性不安全。

一个User对象表示一个用户,用户的年龄不可能为复数,以下程序中年龄之值为复数,程序运行时没有报错,这是程序存在的缺陷

面向对象包括三大特征:

—封装

—继承

—多态

*为什么要封装?

封装的好处:

        1、封装之后,对于那个事物来说,看不到这个事物比较复杂的那一面,只能看到该事务简单的那一面。复杂性封装,对外提供简单的操作入口(例: 照相机)。

        2、封装之后才会形成真正的“ 对象 ”,真正的“ 独立体 ”。

        3、封装就意味着以后的程序可以重复使用,并且这个事物的适应性比较强,在任何场合都可以使用。

        4、封装之后对于事物本事提高了安全性。

对于上述User程序来说,建议对User类型进行封装,在外部程序中不能随意访问User对象当中的属性。这样可以保证属性的安全。


封装的步骤:

1.所有属性私有化,使用private关键字进行修饰,private 表示私有的,修饰的所有数据只能在本类中访问。

// 用户类
public class User {
    //属性私有化
    private int age;
}
/*
用户测试类
*/
public class UserTest {
    public static void main(String[] args) {
        User u = new User();

        //编译错误
        int age = -100;
        //编译错误
        System.out.println("用户的年龄是: " + u.age);
}

/* 其中 " int age = -100; "以及后面"syso"输出编译报错,age属性私有化,在外部程序中不能直接访问,从此之后age属性非常安全,但有点太安全了。对于目前外部程序来说age彻底访问不到了。 */

2、对外提供简单的操作入口,也就是说以后外部程序要想访问age属性,必须通过这些简单的入口进行访问。

       # 对外提供两个公开的方法,分别是set方法和get方法

                -想修改age属性,调用set方法

                -想读取age属性,调用get方法

3.set方法命名规范:

public void set + 属性名首字母大写 (形参) {

}

//* 例 *
 public void setAge (int a){

        age = a;

}

4.get方法命名规范:

public 返回值类型 get + 属性名首字母大写 () {

        return 返回值;

}

public int getAge () {

    return age;
}

回想一下,一个属性通常访问的时候包括几种形式?

— 第一种方式:想读取这个属性的值,读取get

— 第二种方式:想修改这个属性的值,修改set

【注】:

setter and getter 方法没有static关键字

— 有static修饰的方法如何调用:类名.方法名(实参);

— 没有static修饰的方法如何调用: 引用.方法名 (实参);

#修改后结果:#

//用户类
public class User {
	//属性私有化
	private int age;
	
	//set方法没有返回值因为set方法只负责修改数据
	//setter
	public void setAge(int a) {
		//可以编写业务逻辑语句进行安全控制
		if(a<0 || a>150) {
			System.out.println("对不起,您提供的年龄不合法。");
            return;
		}
		
		//程序能进行到这里的话,说明a年龄合法,则进行赋值运算。
		age = a;
	}
	
	//getter
	public int getAge() {
		return age;
	}
}
//测试类
public class Test {
	public static void main(String[] args) {
		//创建对象
		User u = new User();
		
		//修改  引用.方法名(实参);
		u.setAge(-100);
		
		//读取
		System.out.println(u.getAge());    //0
	}
}

一个属性要有setter and getter,但在eclipse/myeclipse中可帮助我们自动编写setter and getter。

在空白处右键选中Source - - - > Generate Getters and Setters…

(Alt + shift + S快捷键)

点击全选

 自动生成setter and getter:

 整体情况变为:
 

public class CustomerTest {
	public static void main(String[] args) {
		Customer c = new Customer();
		c.setId(100);
		c.setName("张三");
		c.setAge(18);
		c.setAddr("河南郑州");
		
		System.out.println(c.getId());
		System.out.println(c.getName());
		System.out.println(c.getAge());
		System.out.println(c.getAddr());
	}
}

私有属性不能再外部直接访问,这就是封装

// c.id = 410 编译报错

操作入口变为setter and getter进行访问

在set方法和get方法执行过程中可以进行安全过滤

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值