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

 

原文地址:https://www.cnblogs.com/lyq-biu/p/10676182.html