码迷,mamicode.com
首页 > 编程语言 > 详细

阿里云【名师课堂】Java面向对象开发7:private实现封装处理

时间:2020-06-07 12:51:11      阅读:56      评论:0      收藏:0      [点我收藏+]

标签:字母   std   get   src   其他   loading   业务   图片   基本   

目录

    回顾:面向对象三大特征:封装性、继承性、多态性,封装是其中最复杂的概念,这里学习封装的基本概念。
    如果想要清楚封装,首先要知道没有封装是什么情况。
    范例:观察程序

    class Person {  // 定义一个类,注意类名称每个单词首字母大写
    	String name ;  // 属性1,表示人的姓名
    	int age ;  // 属性2,表示人的年龄
    	public void info() {  // 一个方法
    		System.out.println("name = " + name + " age = " + age) ;
    	}
    }
    
    public class TestDemo {    // 定义一个程序类
    	public static void main(String args[]) {
    		// 类名称 对象名称  = new 类名称() ;
            Person per = new Person() ;
            per.name = "Dexter" ;
    		per.age = 180 ;
    		per.info() ;
        }
    } 
    

    技术图片
    可以看出程序没有语法错误,但是显然不符合逻辑(年龄180),这种错误称为业务逻辑出错。
    怎么回避此类问题:

    • 如何让对象不能够直接操作年龄?
    • 如何让类的外部不能操作类中的敏感数据?

    让内部的操作对外部不可见,使用private关键字。

    • 可以使用private实现,不是只能使用private实现。
    • 类中的属性和方法都可以使用private定义,但是通常用在属性上,很少使用在方法上。
      范例:利用private实现封装
    class Person {  // 定义一个类,注意类名称每个单词首字母大写
    	private String name ;  // 属性1,表示人的姓名
    	private int age ;  // 属性2,表示人的年龄
    	public void info() {  // 一个方法
    		System.out.println("name = " + name + " age = " + age) ;
    	}
    }
    
    public class TestDemo {    // 定义一个程序类
    	public static void main(String args[]) {
    		// 类名称 对象名称  = new 类名称() ;
            Person per = new Person() ;
            per.name = "Dexter" ;  // 直接访问Person中name
    		per.age = 180 ;  // 直接访问Person中age
    		per.info() ;
        }
    } 
    

    一旦属性的声明上使用了private定义之后,如果其他类直接对该属性进行访问会出现如下的错误提示:
    技术图片
    使用private之后属性就安全了,外部无法直接操作,但是这时有了一个新问题:怎么才能访问private定义的属性呢?

    • setter方法:主要用于属性内容的设置
      • 使用方法:对于private String name ;public void setName(String n) {},注意用void,没有返回值。
    • getter方法:主要用于属性内容的取得
      • 使用方法:对于private String name ;public String getName() {},注意用String(对应的类型),有返回值。

    范例:扩展Person类中的内容

    class Person {  // 定义一个类,注意类名称每个单词首字母大写
    	private String name ;  // 属性1,表示人的姓名
    	private int age ;  // 属性2,表示人的年龄
    	public void setName(String n) {
    		name = n ;
    	}
    	public void setAge(int a) {
    		age = a ;
    	}
    	public String getName() {
    		return name ;
    	}
    	public int getAge() {
    		return age ;
    	}
    	public void info() {  // 一个方法
    		System.out.println("name = " + name + " age = " + age) ;
    	}
    }
    
    public class TestDemo {    // 定义一个程序类
    	public static void main(String args[]) {
    		// 类名称 对象名称  = new 类名称() ;
            Person per = new Person() ;
            per.setName("Dexter") ;
    		per.setAge(180) ;
    		per.info() ;
        }
    } 
    

    技术图片
    这时就可以在setter中设置筛选条件,满足业务需求。如:(用这段代码替换上一段代码中的setAge)

    	public void setAge(int a) {
    		if(a > 0 && a < 120){
    			age = a ;
    		} else
    			age = 0 ;  // 告知年龄出错
    	}
    

    per.setAge(180) ;
    技术图片
    per.setAge(20) ;
    技术图片
    类的设计原则:

    • 设计类的时候所有属性必须使用private封装。如果这个属性还需要被外部所使用,那么就按照定义使用setter()、getter()方法。
      • 使用private封装的最大特点:只允许本类访问,而不允许外部访问。
    • private只是封装的第一步,经过后续学习继承和多态才能写出真正的封装代码。

    阿里云【名师课堂】Java面向对象开发7:private实现封装处理

    标签:字母   std   get   src   其他   loading   业务   图片   基本   

    原文地址:https://www.cnblogs.com/playerone/p/13059978.html

    (0)
    (0)
       
    举报
    评论 一句话评论(0
    登录后才能评论!
    © 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
    迷上了代码!