封装性

面向对象封装实践
本文介绍面向对象编程中封装的重要性,并通过实例演示如何正确使用封装来避免数据错误。具体展示了通过setter和getter方法对属性进行访问控制的过程。
面向对象的第一个特征,先观察以下的代码,看是否会存在问题:
class Person{
         // 属性
         String name ;
         int age ;
         public void talk(){
                   System.out.println("姓名:"+name+",年龄:"+age) ;
         }
};
public class OODemo05{
         public static void main(String args[]){
                   Person p = null ;
                   p = new Person() ;
                   p.name = "张三" ;
                   p.age = -30 ;
                   p.talk() ;
         }
};
 
       代码本身没有任何的语法错误,但是从实际来看,存在错误的,造成错误的根本原因在于把内容暴露给了外部用户。
       此时,就必须对所有的内容(不想被外部直接访问的)进行封装。
 
class Person{
         // 属性
         private String name ;
         private int age ;
         public void talk(){
                   System.out.println("姓名:"+name+",年龄:"+age) ;
         }
};
public class OODemo05{
         public static void main(String args[]){
                   Person p = null ;
                   p = new Person() ;
                   // 如果直接调用封装属性,程序是无法编译通过的
                   p.name = "张三" ;
                   p.age = -30 ;
                   p.talk() ;
         }
};
修改代码:
class Person{
         // 属性
         private String name ;
         private int age ;
         public void setName(String str){
                   name = str ;
         }
         public void setAge(int a){
                   if(a>0&&a<150)
                            age = a ;
         }
         public String getName(){
                   return name ;
         }
         public int getAge(){
                   return age ;
         }
         public void talk(){
                   System.out.println("姓名:"+name+",年龄:"+age) ;
         }
};
public class OODemo06{
         public static void main(String args[]){
                   Person p = null ;
                   p = new Person() ;
                   // 如果直接调用封装属性,程序是无法编译通过的
                   // 如果要设置内容,则通过setter方法完成
                   p.setName("张三") ;
                   p.setAge(30) ;
                   p.talk() ;
         }
};
 
       所有的验证功能要求在setter方法之中完成,而getter方法只是把值简单的返回。
       如果里面的属性是boolean值,则有以下两种返回方式:
class Person{
         private boolean flag ;
         public void setFlag(boolean f){
                   flag = f ;
         }
         // 取得值的时候就有两种代码形式:
         public boolean getFlag(){
                   return flag ;
         }
         public boolean isFlag(){
                   return flag ;
         }
};
 
练习:
定义并测试一个名为Student的类,包括属性有“学号”、“姓名”,以及3门课程“数学”、“英语”和“计算机”的成绩,包括的方法有计算3门课程的“总分”、“平均分”、“最高分”及“最低分”。
 
注意:
       · 所有的内容一定不要在类中输出,交给调用处输出。
       · 所有的属性必须封装
/*
         定义并测试一个名为Student的类,包括属性有“学号”、“姓名”,
         以及3门课程“数学”、“英语”和“计算机”的成绩,
         包括的方法有计算3门课程的“总分”、“平均分”、“最高分”及“最低分”。
*/
class Student{
         private String stuno ;
         private String name ;
         private float math ;
         private float english ;
         private float computer ;
         public float sum(){
                   return math + english + computer ;
         }
         public float avg(){
                   return this.sum() / 3 ;
         }
         public float max(){
                   float max = math>english?math:english ;
                   max = max>computer?max:computer ;
                   return max ;
         }
         public float min(){
                   float min = math<english?math:english ;
                   min = min<computer?min:computer ;
                   return min ;
         }
         public void setStuno(String s){
                   stuno = s ;
         }
         public void setName(String n){
                   name = n ;
         }
         public void setMath(float m){
                   math = m ;
         }
         public void setEnglish(float e){
                   english = e ;
         }
         public void setComputer(float c){
                   computer = c;
         }
         public String getStuno(){
                   return stuno ;
         }
         public String getName(){
                   return name ;
         }
         public float getMath(){
                   return math ;
         }
         public float getEnglish(){
                   return english ;
         }
         public float getComputer(){
                   return computer ;
         }
};
public class OODemo08{
         public static void main(String args[]){
                   Student s = new Student() ;
                   s.setStuno("s001") ;
                   s.setName("张三") ;
                   s.setMath(90.0f) ;
                   s.setEnglish(89.0f) ;
                   s.setComputer(99.0f) ;
 
                   System.out.println("总分:"+s.sum()) ;
                   System.out.println("平均分:"+s.avg()) ;
                   System.out.println("最高分:"+s.max()) ;
                   System.out.println("最低分:"+s.min()) ;
         }
};









本文转自 李兴华 51CTO博客,原文链接:http://blog.51cto.com/lixinghua/91233,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值