封装是什么?
首先我们思考一个问题:如何设计一个Person类?
- 分析:先抽象出这个类的一些属性和方法,Person类都具有姓名和年龄,都可以说话。
class Person
{
int age;
void speak()
{
System.out.println("age=" + age);
}
}
- 上面这段代码咋眼一看没有什么问题,但是当我们在创建对象给age属性赋值时就有问题了:
class PersonDemo
{
public static void main(String[] args)
{
Person p = new Person();
p.age = -20;
p.speak();
}
}
比如上面代码中的数据明显就是不符合实际的,那么这个时候我们可能会想在赋值之前能不能先进行判断呢?于是:
class Person
{
int age;
public void speak(int a)
{
if(a > 0 && a < 130)
{
age = a;
speakAge();
}
else
System.out.println("错误的数据");
}
void speakAge()
{
System.out.println("age=" + age);
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p = new Person();
p.speak(-20);
}
}
这样做确实能够避免数据被随意赋值的情况,但这种做法有点复杂并且在实体类中进行判断的情况很少见。那么有没有更简单的方法呢?我们可以使用private关键字来修饰age。private是一个权限修饰符,被它修饰的成员只能在本类中访问。但随之而来的问题就是既然age只能在本类中被访问,那么外界如何操作这个变量呢?我们可以在Person类中提供一个公共的方法,通过这个公共的方法来操作age,于是我们就可以这样来定义Person类:
class Person {
private int age;
public void setAge(int a)
{
age = a;
}
public int getAge() {
return age;
}
}
如上所述,这种将数据保护在类的内部,只保留一些公共的方法来与外界进行联系的思想就是封装。这样做可以尽可能地隐藏类内部的细节,使数据更加安全。修改类结构时也很方便。
在Java中如何体现封装思想?
-
我们首先应该注意:封装的概念其实很广,而private只是其中的一种体现形式而已。
-
为了更好地理解封装,这里就再举个例子:比如笔者在刷算法题的时候(关于算法题,可以参考笔者该目录下的文章),有时候会发现字符串反转的方法会被调用很多次,所以这时我们就可以把这个方法单独提出来并用private修饰,因为这个方法只服务于本类。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for(int i = 10001; i <= 999999; i++) {
int a = i % 10;
int b = i / 10 % 10;
int c = i / 100 % 10;
int d = i / 1000 % 10;
int e = i / 10000 % 10;
int f = i / 100000;
int sum = a + b + c + d + e + f;
if(reverse(i) && (sum == n)) {
System.out.println(i);
}
}
}
private static boolean reverse(int x) {
String s1 = String.valueOf(x);
String s2 = new StringBuffer(s1).reverse().toString();
if(s1.equals(s2)) {
return true;
}
else
return false;
}
}