Java基础视频笔记--11封装

封装

  1. 什么是封装?

    • 现实生活中有很多现实的例子都是封装的,例如:手机,电视机,笔记本电脑,照相机,这些都是外部有一个坚硬的壳儿。封装起来,保护内部的部件。保证内部的部件是安全的。另外封装了之后,对于我们使用者来说,我们是看不见内部的复杂结构的,我们也不需要关心内部有多么复杂,我们只需要操作外部壳儿上的几个按钮就可以完成操作。
  2. 为什么要进行代码的封装?

    • 首先看一段程序:

      public class PersonTest{
      	public static void main(String[] args){
      		// 创建Person对象
      		Person p1 = new Person();
      		// 访问人的年龄
      		// 访问一个对象的属性,通常包括两种操作,一种是读数据,一种是改数据。
      		// 读数据
      		System.out.println(p1.age); //读(get表示获取)
      		// 修改数据(set表示修改/设置)
      		p1.age = 50;
      		//再次读取
      		System.out.println(p1.age);
      		// 在PersonTest这个外部程序中目前是可以随意对age属性进行操作的。
      		// 一个人的年龄值不应该为负数。
      		// 程序中给年龄赋值了一个负数,按说是不符合业务要求的,但是程序目前还是让它通过了。
      		// 其实这就是一个程序的bug。
      		p1.age = -100; //改(随意在这里对Person内部的数据进行访问,导致了不安全。)
      		System.out.println("您的年龄值是:" + p1.age); //读
      	}
      }
      //另一个源文件Person.class
      public class Person{
          int age; /age属性是暴露的,在外部程序中可以随意访问。导致了不安全。
      }
      
    • 在上面程序当中,我们可以随时的读取和设置实例变量的值,当我们把实例变量,p1.age = -100; 这显然是不合法的,但是程序还是通过的,随意的对Person内部的数据进行访问,导致数据的不安全。

    • Person类的age属性对外暴露,可以在外部程序中随意访问,导致了不安全。

    • 封装的作用有两个:第一个作用:保证内部结构的安全。第二个作用:屏蔽复杂,暴露简单。

      在代码级别上,封装有什么用?----一个类体当中的数据,假设封装之后,对于代码的调用人员来说,不需要关心代码的复杂实现,只需要通过一个简单的入口就可以访问了。另外,类体中安全级别较高的数据封装起来,外部人员不能随意访问,来保证数据的安全性。

  3. 代码封装的步骤

    • 第一步:属性私有化(使用关键字private进行私有化)

      //怎样私有化属性
      public class Person{
          private int age; //加上关键字private,age属性就变成了私有,只能在Person这个类当中被访问,除了这个类就无法被访问
      }
      //在Person类外访问一下age
      public class PersonText{
          public static void main(String[] args){
              Person p1 = new person();
              System.out.println(p1.age);//读age属性的值,这里会输出什么?
              
              p1.age = 35; //修改age属性的值
              System.out.println(p1.age);//读age属性的值,这里会输出什么?
             //答案是:无法通过编译,编译器会报错,age无法被访问
             // Person的age,彻底在外部不能访问了。但是这难免有点太安全了。
          } 
      }
      
    • 第二步:对外提供简单的操作入口。

      1. 1个属性对外提供两个set和get方法。外部程序只能通过set方法修改,只能通过get方法读取,可以在set方法中设立关卡来保证数据的安全性。

      2. 应该对外提供几个访问入口? 这些操作入口是否应该是方法呢?---一个方法专门完成读(get), 一个方法专门完成写(set)。

      3. get读年龄,set改年龄,这个读和改都是操作的一个对象的年龄。这里涉及到一个新的概念:实例方法,这里记住不带staic的方法就是实例方法,实例:实例对象(对象变量), 实例方法(对象方法)。

        //带有static的方法
        //没有static的方法
        //分别怎么调用?
        	//带有static的方法怎么调用?通过“类名.”的方式访问。
        
        //对象被称为实例。
        //实例相关的有:实例变量、实例方法。
        //实例变量是对象变量。实例方法是对象方法。
        //实例相关的都需要先new对象,通过“引用.”的方式去访问。
        public class MethodTest{
        	public static void main(String[] args){
        		MethodTest.doSome();
        		//类名. 可以省略(在同一个类中。)
        		doSome();
        		// 尝试使用“类名.”的方式访问“实例方法”
        		// 错误的
        		//MethodTest.doOther();
        		
        		// 创建对象
        		MethodTest mt = new MethodTest();
        		// 通过"引用."的方式访问实例方法。
        		mt.doOther();
        
        	}	
        	// 带有static
        	public static void doSome(){
        		System.out.println("do some!");
        	}
        	//这个方法没有static,这样的方法被称为:实例方法。(对象方法,对象级别的方法)
        	//这个没法解释,大家目前死记硬背。
        	public void doOther(){
        		System.out.println("do other....");
        	}
        
        }
        
      4. [修饰符列表] 返回值类型 方法名(形式参数列表){

        }注意:java开发规范中有要求,set方法和get方法要满足以下格式。

        ​ get方法的要求:

        ​ public 返回值类型 get+属性名首字母大写(无参){

        ​ return xxx;

        ​ }

        ​ set方法的要求:

        ​ public 返回值类型 set+属性名首字母大写(有一个参数){

        ​ xxx = 参数;

        ​ }

posted @ 2021-03-13 21:04  LightSunshine21  阅读(52)  评论(0)    收藏  举报