Java封装
Posted biu嘟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
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 }
注: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 }
构造代码块:(类中{})
创建对象时调用,优先于构造方法执行(可以有多个,顺序执行),实例化一个对象就执行一次,可以对成员属性,静态属性赋值。
静态代码块(也是类中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 = "学生信息如下:\\n" + "学生学号:" + this.getStudentNum() + "\\n学生姓名:" + this.getStudentName() + "\\n学生性别:" 101 + this.getStudentSex() + "\\n学生年龄:" + this.getStudentAge()+"\\n专业名称:"+this.getStudentSubject().getSubjectName()+"\\n专业年制:"+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 = "学生信息如下:\\n" + "学生学号:" + this.getStudentNum() + "\\n学生姓名:" + this.getStudentName() + "\\n学生性别:" 118 + this.getStudentSex() + "\\n学生年龄:" + this.getStudentAge() + "\\n所选专业为:" + subjectName + "\\n专业年限为:" 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 = "学生信息如下:\\n" + "学生学号:" + this.getStudentNum() + "\\n学生姓名:" + this.getStudentName() + "\\n学生性别:" 136 + this.getStudentSex() + "\\n学生年龄:" + this.getStudentAge() + "\\n所选专业为:" + mysubject.getSubjectName() 137 + "\\n专业年限为:" + mysubject.getSubjectLife(); 138 return str; 139 140 } 141 // 方案三:添加专业对象作为属性,通过属性获取相关信息 142 }
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 }
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()+"人数报名"); } }
以上是关于Java封装的主要内容,如果未能解决你的问题,请参考以下文章