[学习笔记] 面向对象_面向对象封装性

一、封装性的概念

1、封装性是面向对象思想的三大特征之一。
2、封装就是隐藏实现细节,仅对外提供访问接口,是一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。
封装有这几类:
属性的封装、方法的封装、的封装、组件的封装、模块化封装、系统级封装…

二、封装的好处与缺点

好处:
1、模块化:相互独立,良好的封装能够减少耦合,易于维护;
2、信息隐藏:隐藏细节,隐私更安全;
3、代码重用:直接调用,不必重复写相同的代码,减少时间;
4、插件化易于调试:统一管理,精确控制成员变量,更规范;
5、具有安全性:防止破坏,保护隐私。

坏处:
影响执行效率:层层套皮,安全的同时,也给代码或者程序的执行带来影响(因为要做的事更多了)。

三、如何进行封装

关键字:private(私有的)
之前定义类时,我们通常使用关键字public(公有的),表示共有的,公共的,可以直接调用;代码的编程是对现实世界的抽象解释,JAVA亦如此。
在现实生活中,我们一般有公有的公共设施,比如公园、大马路的路灯、大马路的垃圾桶,等等,可以直接使用。但也有些东西是私有的,比如公园便利店冰箱里面的一瓶水、你家里面新买的垃圾桶、你家卧室里面的灯,等等,是要经过你本人同意,或者与你合法交易的,一般来说就是私有的
例如:

/**
  封装性
  如果属性没有封装,那么在本类之外创建对象后,可以直接访问属性
  private关键字:访问权限修饰符       public表示公有的,private表示私有的
  公有的属性和方法,可以被类外部的其它类访问
  私有的属性或方法,只能在本类中访问,不可以被类外部的其他类访问
*/
public class test002{
	public static void main(String[] args){
		Person h = new Person();
		h.name = "我是shy_boy";			//在没有使用private前,我可以调用类Person里的属性
		h.age = 18;
		System.out.println(h.name);
	}
}
class Person{
		String name;
		int age;
}

结果是:
在这里插入图片描述
但此时我们的类Person,没有被封装起来,很容易被调用,或者直接暴力修改,安全性不高。
如果我把Person这个类,封装起来,仅能用我对外提供访问的接口来访问它,那安全性就大大提升了。

/**
  封装性
  如果属性没有封装,那么在本类之外创建对象后,可以直接访问属性
  private关键字:访问权限修饰符       public表示公有的,private表示私有的
  公有的属性和方法,可以被类外部的其它类访问
  私有的属性或方法,只能在本类中访问,不可以被类外部的其他类访问
*/
public class test002{
	public static void main(String[] args){
		Person h = new Person();
		h.name = "我是shy_boy";			//在使用private后,不可以调用类Person里的属性
		h.age = 18;
		System.out.println(h.name);
	}
}
class Person{
		private String name;
		private int age;
}

结果是编译错误:
在这里插入图片描述

那么问题来了,怎么访问被封装过后的Person呢?通过getter和setter,设置一个接口方法,让别人访问。

/**
  封装性
  如果属性没有封装,那么在本类之外创建对象后,可以直接访问属性
  private关键字:访问权限修饰符       public表示公有的,private表示私有的
  公有的属性和方法,可以被类外部的其它类访问
  私有的属性或方法,只能在本类中访问,不可以被类外部的其他类访问
  通常在一个类中,属性都私有化,并对外提供getter 和 getter方法
*/
public class test002{
	public static void main(String[] args){
		Person h = new Person();
		h.setName("我是shy_boy");			//在使用private后,不可以调用类Person里的属性
		h.setAge(18);
		System.out.println(h.getName());	//调用getName方法并输出name的值
	}
}
class Person{
		//属性是成员变量
		private String name;
		private int age;
		//参数及方法内定义的变量是局部变量
		//setter   对外提供一个为name属性设值的方法
		public void setName(String name){
			this.name = name; 	//就近原则,第二个name是setName()里面的name, this. :当前对象。 所以第一个name是对象h的name.
		}
		//getter   对外提供一个获取name属性的方法
		public String getName(){
			return name;		//返回name的参数
		}
		public void setAge(int age){
			this.age = age;
		}
		public int getAge(){
			return age;
		}
}

结果是:
在这里插入图片描述

四、成员变量和局部变量

1、在类中的位置不同
成员变量:在中定义
局部变量:在方法中定义或者方法的参数
2、在内存中的位置不同
成员变量:在堆内存(成员变量属于对象,对象进堆内存)
局部变量:在栈内存(局部变量属于方法,方法进栈内存)
3、生命周期不同
成员变量:随着对象的创建而存在,随着对象的销毁而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
4、初始化值不同
成员变量:有默认初始化值,引用类型默认为null
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用
注意:
局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值