• Java封装


    一.封装的简单理解

      将类的某些信息隐藏在类的内部,不允许外部程序直接访问,并通过该类提供的方法来实现对隐藏信息的操作和访问。(简单的说就是隐藏对象的信息,留出访问的接口)。

      特点:1.只能通过规定的方法访问数据;2.隐藏类的实例细节,方便修改和实现。

    二.封装的代码实现

      

       注:只有getxxx的属性是只读属性,只有setxxx的属性是只写属性

      例:

     1 package com.imooc.animals;
     2 
     3 public class Cat {
     4     //成员属性:昵称,年龄,体重,品种
     5     //修改属性的可见性   --private 限定只能在当前类内访问
     6     private String name;
     7     int month;
     8     double weight;
     9     String species;
    10     //创建get/set方法
    11     //在set和get中添加对属性的限制
    12     public void setName(String name){
    13         this.name=name;
    14     }
    15     public String getName(){
    16         return "My name is "+this.name;
    17     }
    18     public Cat(){
    19         
    20     }
    21     //有参构造
    22     public Cat(String name,int month,double weight,String species){
    23         this.name=name;
    24         this.month=month;
    25         this.weight=weight;
    26         this.species=species;
    27         
    28     }
    29     //成员方法
    30     public void eat(){
    31         System.out.println("我吃东西了");
    32     }
    33     public void run(){
    34         System.out.println("我跑了");
    35     }
    36 }
    View Code
     1 package com.imooc.animals;
     2 
     3 public class Cattest {
     4 
     5     public static void main(String[] args) {
     6         // 对Cat实例化
     7         Cat cat=new Cat();
     8         cat.setName("哈哈");
     9         String name=cat.getName();
    10         cat.month=12;
    11         System.out.println(name);
    12         System.out.println(cat.month);
    13         System.out.println(cat.species);
    14         
    15 
    16     }
    17 
    18 }
    View Code

       注:Python中使用(__属性定义私有属性【规范】,可以自己实现方法封装,@property属性处理)

    三.使用包进行类管理

      Java同一个包下不允许存在同名类(域名倒序+模块+功能)(如com.swpu.chains),域名全部小写,必须放在Java源文件的第一行,建议每个包内存储信息功能单一,一个源文件中只能有一个定义包的语句。

      注:建议采用“import 包名.类名”的方式加载,提高效率;

        加载类的顺序跟import导入语句的位置无关【如果有两个包中有同名的类都导入(import com.animals.Cat;import com.animals2.*会优先调用更详细的包路径,与导入的先后位置无关)】;

        “import 包名.*”只能访问指定包名下的类,无法访问子包下的类

      Java常用系统包:

        

    四.static关键字

      1.static

        static修饰的成员:静态成员,类成员,无论实例化多少个实例对象,都共享同一块内存空间(和Python的类变量,类方法一致),类对象共享,类加载时产生,销毁时释放,生命周期长。【既可以使用对象名访问,也可以使用类名访问{推荐类名}】

        static+属性-》静态属性,类属性;static+方法-》类方法,静态方法【没有静态类(static+类),也没有(static+方法中的局部变量】

        注:

          在成员方法中可以直接访问呢静态成员;

          静态方法中不能直接访问同一个类中的非静态成员【只能通过对象实例化后,对象.成员的方式访问】,只能直接访问同一个类中的静态成员。

      2.代码块:(每一个都是一个作用空间)

        注:同一作用范围不可以定义两个同名的变量,但在不同的代码块中用多个{}相当于多个作用空间,就可以定义相同的变量,作用周期仅仅限制于自己的作用空间。

    最外层的{}作用区域包含了代码块1和代码块2

        普通代码块(在方法中的{}):

          可以有多个,顺序执行,先出现先执行

    1 public void run(){
    2         {
    3             System.out.println("我第一");
    4         }
    5         System.out.println("我第二");
    6         {
    7             System.out.println("我第三");
    8         }
    9     }
    View Code

         构造代码块:(类中{})

          创建对象时调用,优先于构造方法执行(可以有多个,顺序执行),实例化一个对象就执行一次,可以对成员属性,静态属性赋值。

        静态代码块(也是类中static{}):

          类加载时调用,优先于构造代码块执行(可以有多个,顺序执行),无论实例化多少个对象,它都只执行一次,在同一个类中只能直接给静态成员赋值(若要给成员属性赋值,需要实例化对象然后赋值)    

     五.Java封装综合实例

      1.学生类:

      1 package com.swpu.model;
      2 
      3 public class Student {
      4     // 成员属性 学号,姓名,性别,年龄
      5     private String studentNum;
      6     private String studentName;
      7     private String studentSex;
      8     private int studentAge;
      9     // 方案三,对象属性,在没有赋初值前默认为null(关联强度强),传递的是对象的引用 
     10     private Subject studentSubject;
     11 
     12     // 无参构造
     13     public Student() {
     14 
     15     }
     16 
     17     // 有参构造
     18     public Student(String studentNum, String studentName, String studentSex, int studentAge) {
     19         this.setStudentNum(studentNum);
     20         this.setStudentName(studentName);
     21         this.setStudentSex(studentSex);
     22         this.setStudentAge(studentAge);
     23     }
     24 
     25     // 方案三构造方法
     26     public Student(String studentNum, String studentName, String studentSex, int studentAge, Subject subject) {
     27         this.setStudentNum(studentNum);
     28         this.setStudentName(studentName);
     29         this.setStudentSex(studentSex);
     30         this.setStudentAge(studentAge);
     31         this.setStudentSubject(subject);
     32     }
     33 
     34     public void setStudentNum(String studentNum) {
     35         this.studentNum = studentNum;
     36     }
     37 
     38     public String getStudentNum() {
     39         return this.studentNum;
     40     }
     41 
     42     public String getStudentName() {
     43         return studentName;
     44     }
     45 
     46     public void setStudentName(String studentName) {
     47         this.studentName = studentName;
     48     }
     49 
     50     public String getStudentSex() {
     51         return studentSex;
     52     }
     53 
     54     public void setStudentSex(String studentSex) {
     55         if (studentSex == "" || studentSex == "") {
     56             this.studentSex = studentSex;
     57         } else {
     58             this.studentSex = "";
     59         }
     60     }
     61 
     62     public int getStudentAge() {
     63         return studentAge;
     64     }
     65     /**
     66      * 专业返回 如果还未实例化(默认为null),实例化后返回
     67      * @return专业对象
     68      */
     69     public Subject getStudentSubject() {
     70         
     71         if(this.studentSubject==null){
     72             Subject studentSubject=new Subject();
     73         }
     74         return studentSubject;
     75     }
     76 
     77     public void setStudentSubject(Subject studentSubject) {
     78         this.studentSubject = studentSubject;
     79     }
     80 
     81     /**
     82      * 年龄必须z在10到00之间,否则为18
     83      * 
     84      * @param studentAge
     85      */
     86     public void setStudentAge(int studentAge) {
     87         if (studentAge < 10 || studentAge > 100) {
     88             this.studentAge = 18;
     89         } else {
     90             this.studentAge = studentAge;
     91         }
     92     }
     93 
     94     /**
     95      * 学生自我介绍方法
     96      * 
     97      * @return 学号,姓名,性别,年龄
     98      */
     99     public String introduction() {
    100         String str = "学生信息如下:
    " + "学生学号:" + this.getStudentNum() + "
    学生姓名:" + this.getStudentName() + "
    学生性别:"
    101                 + this.getStudentSex() + "
    学生年龄:" + this.getStudentAge()+"
    专业名称:"+this.getStudentSubject().getSubjectName()+"
    专业年制:"+this.getStudentSubject().getSubjectLife();
    102         return str;
    103 
    104     }
    105 
    106     // 连接专业信息和学生
    107     // 方案一:在函数中添加两个参数表示专业和学制
    108     //优点:容易理解;缺点:如果需要的信息比较多,参数列表过长,组织麻烦
    109     /**
    110      * 学生自我介绍方法重载
    111      * 
    112      * @param subjectName,subjectLife
    113      * @param subjectLife
    114      * @return 学号,姓名,性别,年龄,专业,年限
    115      */
    116     public String introduction(String subjectName, int subjectLife) {
    117         String str = "学生信息如下:
    " + "学生学号:" + this.getStudentNum() + "
    学生姓名:" + this.getStudentName() + "
    学生性别:"
    118                 + this.getStudentSex() + "
    学生年龄:" + this.getStudentAge() + "
    所选专业为:" + subjectName + "
    专业年限为:"
    119                 + subjectLife;
    120         return str;
    121 
    122     }
    123 
    124     // 方案二:在方法中添加一个专业对象作为参数,通过对象属性获取相应信息
    125     // 相比更好:可以获取对象的所有属性
    126     //优点:获取方便;缺点:关联强度不如方法三
    127     /**
    128      * 学生自我介绍方法重载
    129      * 
    130      * @param 专业对象
    131      * @param subjectLife
    132      * @return 学号,姓名,性别,年龄,专业,年限
    133      */
    134     public String introduction(Subject mysubject) {
    135         String str = "学生信息如下:
    " + "学生学号:" + this.getStudentNum() + "
    学生姓名:" + this.getStudentName() + "
    学生性别:"
    136                 + this.getStudentSex() + "
    学生年龄:" + this.getStudentAge() + "
    所选专业为:" + mysubject.getSubjectName()
    137                 + "
    专业年限为:" + mysubject.getSubjectLife();
    138         return str;
    139 
    140     }
    141     // 方案三:添加专业对象作为属性,通过属性获取相关信息
    142 }
    View Code

      2.专业类:

     1 package com.swpu.test;
     2 
     3 import com.swpu.model.Student;
     4 import com.swpu.model.Subject;
     5 
     6 public class SchoolTest {
     7     public static void main(String[] args) {
     8         // 测试subject
     9         Subject subject = new Subject("软件工程", "J10022", 4);
    10         System.out.println(subject.info());
    11         System.out.println("**********************************");
    12         // 学生类测试
    13         //Student stu1 = new Student("201631062222", "LYQ1", "", 20);
    14         //System.out.println(stu1.introduction());
    15         // 带参学生测试(传入专业和年制)
    16         System.out.println("**********************************");
    17         Student stu2 = new Student("201631062232", "LYQ2", "", 20);
    18         System.out.println(stu2.introduction("软件工程", 4));
    19         // 带参学生测试(传入专业对象)
    20         System.out.println("**********************************");
    21         Student stu3 = new Student("201631062242", "LYQ3", "", 20);
    22         System.out.println(stu3.introduction(subject));
    23         //将专业对象作为属性
    24         System.out.println("**********************************");
    25         Student stu4 = new Student("201631062252", "LYQ4", "", 18,subject);
    26         System.out.println(stu4.introduction());
    27         //指定专业到底有多少人报名
    28         subject.addStudent(stu2);
    29         subject.addStudent(stu3);
    30         subject.addStudent(stu4);
    31         System.out.println("专业为"+subject.getSubjectName()+"已有"+subject.getStudentNum()+"人数报名");
    32         
    33     }
    34 
    35 }
    View Code

       

      3.测试类:

    package com.swpu.test;
    
    import com.swpu.model.Student;
    import com.swpu.model.Subject;
    
    public class SchoolTest {
        public static void main(String[] args) {
            // 测试subject
            Subject subject = new Subject("软件工程", "J10022", 4);
            System.out.println(subject.info());
            System.out.println("**********************************");
            // 学生类测试
            //Student stu1 = new Student("201631062222", "LYQ1", "", 20);
            //System.out.println(stu1.introduction());
            // 带参学生测试(传入专业和年制)
            System.out.println("**********************************");
            Student stu2 = new Student("201631062232", "LYQ2", "", 20);
            System.out.println(stu2.introduction("软件工程", 4));
            // 带参学生测试(传入专业对象)
            System.out.println("**********************************");
            Student stu3 = new Student("201631062242", "LYQ3", "", 20);
            System.out.println(stu3.introduction(subject));
            //将专业对象作为属性
            System.out.println("**********************************");
            Student stu4 = new Student("201631062252", "LYQ4", "", 18,subject);
            System.out.println(stu4.introduction());
            //指定专业到底有多少人报名
            subject.addStudent(stu2);
            subject.addStudent(stu3);
            subject.addStudent(stu4);
            System.out.println("专业为"+subject.getSubjectName()+"已有"+subject.getStudentNum()+"人数报名");
            
        }
    
    }
    View Code

     

  • 相关阅读:
    Android Framework 学习(八):屏幕刷新机制
    Android Framework 学习(七):Service启动原理
    Android Framework 学习(六):UI线程概念
    Android Framework 学习(五):Activity 启动流程
    Android Handler 机制(六):如何检测性能卡顿
    Android Handler 机制(五):ThreadLocal的工作原理
    Android Framework 学习(四):Binder机制与代理模式
    Android Framework 学习(三):Android 跨进程通信机制
    Android Handler 机制(四):屏障消息(同步屏障)
    Android Handler 机制(三):Handler 机制与管道 Pipe 机制
  • 原文地址:https://www.cnblogs.com/lyq-biu/p/10676182.html
Copyright © 2020-2023  润新知