Java——面向对象的编程学习之封装性

Java面向对象三大特征之一——封装性

封装性的设计思想

在程序设计的过程中,我们追求“高内聚,低耦合”
高内聚:类的内部数据操作细节自己完成,不允许外部干涉
低耦合:仅对外暴露少量的方法用于使用。
隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可练护性、通俗的说,把该隐藏的隐藏起来,该是露的是露出来。这就是封装性的设计思想

问题的引入

当我们创建一个类的对象以后,我们可以通过“对象.属性”的方式,对对象的属性进行赋值。这里,赋值操作要受属性的数据类型和存储范围的制约。除此之外,没有其他制约条件。
但是,在实际问题中,我们往往需要给属性附加额外的限制条件。这个条件就不能在属性声明时体现,我们只能通过方法进行限制条件的添加(例如下面代码中的setAge()方法)。同时,我们需要避免用户再使用“对象.属性”的方式对属性进行赋值。此时需要将属性声明为私有的(private)。
此时,针对属性就体现了封装性。

class Person{
	private int age;
	public void setAge(int num){
		age = num;
	} 
	public int getAge(int num){
		return age;
	} 
}

由于我们此时将属性声明为了private,我们就不能在类的外部通过“对象.属性”的方式直接获取某个属性的值。因此,在实际中,当我们将一个属性声明为private时,通常我们还会提供获取和设置属性值的公共的(public)方法,即上面代码中的getAge()、setAge()方法。

四种权限修饰符

Java一共提供了四种访问权限修饰符,按照权限从小到大依次为:private、缺省、protected、public。其具体的权限大小如下表所示:

修饰符类内部同一个包不同包的子类同一个工程
privateYesNoNoNo
缺省YesYesNoNo
protectedYesYesYesNo
publicYesYesYesYes

注意:对于class的权限修饰只可以用public和default(缺省)
public类可以在任意地方被访问。
default类只可以被同一个包内部的类访问。
四种权限可以用来修饰类及类的内部结构:属性、方法、构造器、内部类。
下面进行代码测试:
工程的结果如图所示:
在这里插入图片描述
在一个类的内部,四种权限修饰符修饰的属性都可以直接调用

public class TestClass1 {
	int age;
	private double height;
	public String name;
	protected String gender;
	
	public static void main(String[] args) {
		TestClass1 c1 = new TestClass1();
		c1.name = "Tom";
		c1.age = 20;
		c1.gender = "男";
		c1.height = 180.5;
	}
}

在同一个包下,再创建一个类Test2,在Test2中调用TestClass1 中的属性,此时发现由于“height”属性声明为了private,所以在Test2中,无法调用。其余三个属性可正常调用

package pack1;

public class Test2 {
	public static void main(String[] args) {
		TestClass1 c2 = new TestClass1();
		c2.name = "Jerry";
		c2.age = 25;
		c2.gender = "女";
		// c2.height = 160.0;     // 会报错
	}
}

在不同包下调用,此时只有声明为protected和public的属性可以被调用,其余两个属性则不能被调用。(TestClass2 继承了TestClass1 ,是TestClass1 的一个子类)

package pack2;

import pack1.TestClass1;

public class TestClass2 extends TestClass1 {
	public static void main(String[] args) {
		TestClass2 c2 = new TestClass2();
		c2.name = "张三";
		c2.gender = "男";
		// c2.age = 20;          // 会报错
		// c2.height = 175.0;    // 会报错
	}
}

小Tips

有时,我们将类的某些属性声明为了private,当我们想在外部调用或者对其赋值时,需要编写相应的public方法,如前面的setAge()和getAge()方法。当private属性过多时,手写其方法过于繁琐。不过Eclipse为我们提供了自动化的方法。具体步骤为:
声明一个类及属性:

class Test{
 private int age;
 private double salary;
 private String name;
}

然后点击Source——》Generate Getters and Setters(或者快捷键:Alt+Shift+s)
在这里插入图片描述
根据需要选择相应的方法:
在这里插入图片描述然后点击Generate,系统就直接为我们生成了相应的方法。

class test{
	private int age;
  private double salary;
  private String name;
  
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public double getSalary() {
		return salary;
	}
	public void setSalary(double salary) {
		this.salary = salary;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农夫三犭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值