前言
上一篇博客我分享了自己在java学习中对面向对象的理解,类的创建、调用、以及类的使用。讲解了this的重要用法。
那么,接下来我就面向对象的三大特征进行我的学习分享。
1.导引
在学习封装之前,为了让大家更好的理解封装,我们先看下面的代码:
//我们先创建一个类
class Test{
//声明姓名和年龄属性
String name;
int age;
public void tell(){//获取信息的方法
System.out.println("姓名:"+name+",年龄:"+age);
}
}
//接下来我们做一下测试
public class Test1 {
public static void main(String[] args) {
//实例化对象
Test tom = new Test();
//为属性赋值
tom.age = -20;
tom.name = "tom ford";
//调用方法
tom.tell();
}
}
代码是没有什么问题的,很明显年龄不可能是负值,但是我们在赋值的时候不小心把年龄写成了-20,结果程序在调用tell()的时候打印出了这种错误的信息。
那我们来思考一下:我们想解决这种问题,应该怎么办呢?怎么样处理才能避免打印出不合法的值?
分析:我们可以加一个条件判断对吧!当输入的年龄<0时,我们可以输入:年龄输入错误;当输入年龄>0时,我们就可以正常输出对吧!
那么我想大家可能又会问了,条件判断我们应该去哪里加呢?我们加在我们的Test类中,还是加在我们的Test1测试类中呢?
我继续用上一篇博客的例子来和大家说明:
如果你在洗衣服的时候,忘记加洗衣液了,结果洗出来的衣服还是脏的;那么我们是应该在洗衣服的过程中暂停加洗衣液好呢?还是说我们的洗衣机在你最开始放衣服时就判断你是否加了洗衣液好呢?
那我们既然学习的是面向对象思想,我们是不是就应该是调用者,而不是在洗衣服的中途再参与进去,添加洗衣液。
//那既然刚才分析了,我们现在不妨试一试
class Test{
String name;
int age;
public void tell(){
System.out.println("姓名:"+name+",年龄:"+age);
}
//这里我们可以添加一个方法来进行判断
public void setAge(int age){//设置年龄
if(age>=0 && age<100){//年龄我就选0-100吧,哈哈让我们先排除那些100+的高龄老人
this.age =age;
}else{
System.out.println("您输入的数值不合法!")
}
}
}
我们来看一下运行结果:
我们发现这下我们的-18不会被打印出来了。
那我改动一下代码,大家看一下:
注意:如果说我们编写了方法,但是调用的时候不使用方法,输出结果还是不合理的!
那我们应该怎样强制性的让用户使用我们的方法呢?
接下来就是我们的主角登场了!!!
2.封装
概述: 隐藏对象的属性,和实现细节,仅对外提供公共的访问方式。
原则:
1.将不需要用户访问的内容隐藏起来
2.将属性隐藏,提供公共的访问方式
优点:
1.安全性高
2.独立性好
3.复用性高
3.关键字 private
为了针对上述问题,Java为我们提供了一个关键字 Private,让我们对类中的属性进行封装。
特点:
1.privae是一个权限修饰符。
2.private可以修饰成员属性和成员方法。
3.被修饰过后的变量和方法只能在类中被调用。
封装的格式:
为属性封装: private 属性类型 属性名称;
为方法封装: private 方法返回值 方法名称(参数列表){ }
那让我们把private加入我们的代码看看有没有什么问题:
class Test{
private String name;
private int age;
public void tell(){
System.out.println("姓名:"+name+",年龄:"+age);
}
}
public class Test1{
public static void main(String[] args) {
Test tom = new Test();
tom.age = 20;
tom.name = "tom ford";
tom.tell();
}
当我们把代码写到这一步的时候,大家认为我们算完成了嘛?
其实当你自己去敲的时候,你会发现Test1测试类中的age和name已经报错!
那这又是为什么呢?
其实在Java中,java对私有属性的访问明确定义:只要是被封装的属性,则必须通过setter和getter方法设置和取得
4.完整代码展示
class Test{
private String name;
private int age;
//获取姓名
public String getName(){
return name;
}
//设置姓名
public void setName(String name){
this.name = name;
}
//获取年龄
public int getAge(){
return age;
}
//设计年龄并加以判断
public void setAge(){
if(age>=0 && age<150){
this.age =age;
}
}
public void tell(){
System.out.println("姓名:"+name+",年龄:"+age);
}
}
接下来我们来写测试类:
public class Test1{
public static void main(String arg[]){
Test tom = new Test();
tom.setName("tom ford");
tom.setAge(-18);
tom.tell();
}
}
来看一下结果:
因为设置的年龄数值不正确,则不会把值赋给age属性,所以程序运行结果处出现的年龄为0.