• Java学习day07:面向对象三大特性之一:封装


    声明:该专栏本人重新过一遍java知识点时候的笔记汇总,主要是每天的知识点+题解,算是让自己巩固复习,也希望能给初学的朋友们一点帮助,大佬们不喜勿喷(抱拳了老铁!)


    往期回顾

    Java学习day06:面向对象基础,构造方法,成员/局部变量_凌~风的博客-CSDN博客

    Java学习day05:排序,选择、冒泡、快速、二分、杨辉三角-CSDN博客

    Java学习day04:数组(知识点+习题详解)_凌~风的博客-CSDN博客

    ......

    Java学习day07:面向对象三大特性之一:封装

    一、什么是封装

    1.概念:

    封装是面向对象的思想的特性,主要分为一下四类:
    对属性进行封装   对方法进行封装   对类进行封装  对项目进行封装

    1.1对属性进行封装 

    我们这里就举一个具体讲解:

    写一个类,类下面的成员变量String name;

    只需要通过对象.属性 = 初始化值;进行赋值。这样存在一定的隐患:比如说有人对age赋值1000,数据不符合常规

    这个时候我们就可以对属性进行封装:
    1.对成员变量加修饰符  private 
    2.在类中书写 set和get方法进行对属性的赋值和取值

    private修饰符可以把修饰的变量变成私有的,此时就无法再在main方法里通过对象.变量 进行赋值,而只能用set方法赋值,get方法取值,此时就可以在set方法里限制age的值使其符合规范

    1.2示例:
    1. class Pig {
    2. private String name;
    3. private int age;
    4. //依靠set方法进行赋值了 赋值是没有返回值的
    5. public void setName (String name) {
    6. this.name = name;
    7. }
    8. //有规律 在赋值的时候 set变量名字 小驼峰的命名规则
    9. public void setAge (int age) {
    10. //可以控制变量值的范围 大小
    11. if (age < 0 || age > 100) {
    12. this.age = 0;
    13. } else {
    14. this.age = age;
    15. }
    16. }
    17. //书写get方法
    18. public String getName() {
    19. return name;
    20. }
    21. public int getAge () {
    22. return age;
    23. }
    24. }
    25. public class Demo3 {
    26. public static void main(String[] args) {
    27. Pig pig = new Pig();
    28. pig.setName("猪刚鬣");
    29. pig.setAge(-90);
    30. System.out.println(pig.getName() + ":" + pig.getAge());
    31. }
    32. }

    同时记得,除了可以用set方法赋值以外,还可以用有参构造赋值,两个中选一个就行,另外idea中用alt+insert快捷键可以之间创建set和get方法,而且在项目实际开发中,其实都不会写set和get方法,直接就用封装好的 

    二、this关键字 

     1.作用

    1.1.写在类中,代表当前对象:

    可以看到不管是在无参构造里打印的this还是在main方法里打印的对象,最后都是内存地址,且都是一样的 

    1. class Rabbit {
    2. String name;
    3. int age;
    4. public Rabbit(String name, int age) {
    5. //this();//在调用无参构造
    6. this.name = name;
    7. this.age = age;
    8. }
    9. public Rabbit() {
    10. //这个this 就是rabbit1
    11. System.out.println(this);//代表的当前的对象 打印的是一个内存地址
    12. }
    13. }
    14. public class Demo6 {
    15. public static void main(String[] args) {
    16. Rabbit rabbit1 = new Rabbit();
    17. System.out.println(rabbit1);
    18. /**
    19. * com.qfedu.b_fengzhuang.Rabbit@15db9742 this
    20. com.qfedu.b_fengzhuang.Rabbit@15db9742 rabbit1
    21. */
    22. Rabbit rabbit2 = new Rabbit();
    23. System.out.println(rabbit2);
    24. /**
    25. * com.qfedu.b_fengzhuang.Rabbit@6d06d69c this
    26. com.qfedu.b_fengzhuang.Rabbit@6d06d69c rabbit2
    27. */
    28. }
    29. }
    1.2使用this关键字调用属性和方法 

    this这个关键只能在方法(成员方法和构造方法)中使用。

    1.2.1调用成员变量。在构造方法,在成员方法。 
    1. class Person {
    2. String name;
    3. int age;
    4. //验证第一个 this关键字可以在构造方法中调用成员变量
    5. public Person () {
    6. this.eat();
    7. this.name = "狗蛋";
    8. }
    9. //验证第二个 this关键在成员方法中调用成员变量
    10. public void eat () {
    11. //在方法中可以使用this.变量
    12. this.name = "老邢";
    13. System.out.println(name + "在吃饭");
    14. this.test();
    15. }
    16. public void test () {
    17. System.out.println("细细打");
    18. }
    19. }
    20. public class Demo1 {
    21. public static void main(String[] args) {
    22. Person person = new Person ();
    23. System.out.println(person.name);
    24. //person.eat();
    25. }
    26. }

    注意执行顺序,在main方法里new的时候,就执行了构造方法,而构造方法里又会执行其他方法,同时后执行的会覆盖前面先执行的,把代码执行逻辑理顺就是,没有什么难的

     2.this可以调用当前的构造方法(很少用的!)

     2.1只能在构造方法中去调用构造方法

    只能在构造方法中调用构造方法,而且this()只能在构造方法中放在第一行
    能不能在成员方法中调用构造方法?不能!!!

    1. class Dog {
    2. String name;
    3. int age;
    4. public Dog() {
    5. System.out.println("123");
    6. //this("styb", 8);
    7. }
    8. public Dog(String name, int age) {
    9. this();
    10. System.out.println("有参构造");
    11. }
    12. }
    13. public class Demo2 {
    14. public static void main(String[] args) {
    15. //需求:实例化对象dog 要求将有参构造这四个字打印出来
    16. Dog dog = new Dog("goudan", 12);
    17. //Dog dog = new Dog();
    18. }
    19. }

    此时会先打印123,再换行打印有参构造

    三、类对象作为一个方法的参数

    1.方法的参数

    可以是八大基本数据类型,String,数组,类对象也是可以的

    1. class Teacher {
    2. //command的参数是一个类对象
    3. public void command (Student stu) {
    4. stu.coding();
    5. }
    6. }
    7. class Student {
    8. String name;
    9. public void coding () {
    10. System.out.println(name + "敲代码");
    11. }
    12. }
    13. public class Demo1 {
    14. public static void main(String[] args) {
    15. Student student = new Student();
    16. student.name = "骚磊";
    17. Teacher teacher = new Teacher();
    18. //在teacher方法中去调用student对象的一个方法
    19. //最终打印的结果是 student类下面的方法
    20. teacher.command(student);
    21. }
    22. }

     这段代码的执行逻辑如下:

    1. 首先,在`main`方法中创建了一个`Student`对象,并给其`name`属性赋值为"骚磊"。
    2. 然后,创建了一个`Teacher`对象。
    3. 接下来,调用`Teacher`对象的`command`方法,并将之前创建的`Student`对象作为参数传入。
    4. 在`command`方法中,使用参数`stu`来调用`Student`对象的`coding`方法。
    5. 在`coding`方法中,使用`System.out.println`打印出`name`属性的值以及"敲代码"。
    6. 最终,控制台输出的结果为"骚磊敲代码"。
    总结起来,这段代码的主要逻辑是通过`Teacher`类的`command`方法来调用`Student`类的`coding`方法,并在控制台输出结果。通过这种方式,实现了两个类之间的交互和协作。

    再给大家举个例子,大家自行理解下面这个

    1. class Person {
    2. public void feed (Dog dog) {
    3. dog.eat();
    4. }
    5. }
    6. class Dog {
    7. public void eat () {
    8. System.out.println("狗在吃饭");//牛彩云
    9. }
    10. }
    11. public class Demo2 {
    12. public static void main(String[] args) {
    13. Dog dog = new Dog();
    14. Person person = new Person();
    15. person.feed(dog);
    16. }
    17. }

    这部分主要是理解,多理解,就是说,把一个类实例化出来的对象,作为一个参数传给了一个方法,这也就意味着,这个方法里可以用对象去调用类相关的属性 

    四、多类合作(重点) 

    1.什么是多类合作

    一个类对象可以当成另外一个类的成员变量
    紧紧围绕者一个点:赋值和取值  只是针对于属性 的

    如果大家有点懵逼的,建议先清楚一下几个概念:类、对象、属性、行为、成员变量、局部变量。想清楚了再回头来看这个知识点

    1. class Person1 {
    2. private String name;
    3. private Cat1 cat1;//一个类对象可以作为另外一个类的属性来使用
    4. //碰到private修饰的属性有setget的想法
    5. public String getName() {
    6. return name;
    7. }
    8. public void setName(String name) {
    9. this.name = name;
    10. }
    11. public Cat1 getCat1() {
    12. return cat1;
    13. }
    14. public void setCat1(Cat1 cat1) {
    15. this.cat1 = cat1;
    16. }
    17. }
    18. class Cat1 {
    19. private String name;
    20. private char sex;
    21. public String getName() {
    22. return name;
    23. }
    24. public void setName(String name) {
    25. this.name = name;
    26. }
    27. public char getSex() {
    28. return sex;
    29. }
    30. public void setSex(char sex) {
    31. this.sex = sex;
    32. }
    33. }
    34. public class Demo2 {
    35. public static void main(String[] args) {
    36. //要对Person1对象的属性进行赋值
    37. Person1 person1 = new Person1();
    38. person1.setName("老万");
    39. Cat1 cat1 = new Cat1();
    40. cat1.setName("小万");
    41. cat1.setSex('母');
    42. person1.setCat1(cat1);
    43. //取值
    44. //通过 人取猫的值
    45. System.out.println(person1.getName());//获取人的名字
    46. System.out.println(person1.getCat1());//获取猫对象
    47. System.out.println(person1.getCat1().getName());//获取猫的名字
    48. System.out.println(person1.getCat1().getSex());
    49. }
    50. }

    这段代码的执行逻辑如下:

    1. 首先,在`main`方法中创建了一个`Person1`对象,并给其`name`属性赋值为"老万"。
    2. 然后,创建了一个`Cat1`对象,并给其`name`属性赋值为"小万",`sex`属性赋值为'母'。
    3. 接下来,将之前创建的`Cat1`对象作为参数传入`Person1`对象的`setCat1`方法中,将其设置为`Person1`对象的`cat1`属性。
    4. 然后,通过`Person1`对象的`getName`方法获取`name`属性的值,并使用`System.out.println`打印出来。
    5. 通过`Person1`对象的`getCat1`方法获取`cat1`属性的值,即一个`Cat1`对象,并使用`System.out.println`打印出来。
    6.通过`Person1`对象的`getCat1`方法获取`cat1`属性的值,即一个`Cat1`对象,并调用该对象的`getName`方法获取`name`属性的值,并使用`System.out.println`打印出来。
    7.最后,通过`Person1`对象的`getCat1`方法获取`cat1`属性的值,即一个`Cat1`对象,并调用该对象的`getSex`方法获取`sex`属性的值,并使用`System.out.println`打印出来。

    总结起来,这段代码的主要逻辑是通过`Person1`类的对象来设置和获取其属性的值,其中`cat1`属性是一个`Cat1`类的对象。通过调用对象的方法和访问对象的属性,实现了对属性值的设置和获取,并在控制台输出结果。通过这种方式,实现了类与类之间的关联和交互


    以上就是今天所有的知识点,下面做题:

    五、习题

    1.题目

    1.部门类、员工类、部门类下面有员工

    2.成年人类、孩子类、玩具类

    3.老师类、学生类、老师带了很多学生    把学生存倒数组中 STudent[] stus = new Student[6];

     建议初学者都敲一敲,而且是不看我的答案,先自己敲,很多东西看着会,实际自己上手敲的时候往往会出错。另外题解肯定不止一个,我也只是记录其中一种,大家大可寻找更优解,同时我基本没写注释,希望大家还是多自己思考原因。 

    2.部分习题参考答案

    1.

    1. //部门类
    2. class Department {
    3. private String depId;//部门id
    4. private String deptName;//部门的名字
    5. private Employee employee;//部们下面的员工
    6. public String getDepId() {
    7. return depId;
    8. }
    9. public void setDepId(String depId) {
    10. this.depId = depId;
    11. }
    12. public String getDeptName() {
    13. return deptName;
    14. }
    15. public void setDeptName(String deptName) {
    16. this.deptName = deptName;
    17. }
    18. public Employee getEmployee() {
    19. return employee;
    20. }
    21. public void setEmployee(Employee employee) {
    22. this.employee = employee;
    23. }
    24. }
    25. //员工类
    26. class Employee {
    27. private String name;//员工的名字
    28. private int age;//员工的年龄
    29. private char sex;//员工的性别
    30. public String getName() {
    31. return name;
    32. }
    33. public void setName(String name) {
    34. this.name = name;
    35. }
    36. public int getAge() {
    37. return age;
    38. }
    39. public void setAge(int age) {
    40. this.age = age;
    41. }
    42. public char getSex() {
    43. return sex;
    44. }
    45. public void setSex(char sex) {
    46. this.sex = sex;
    47. }
    48. }
    49. public class Demo1 {
    50. public static void main(String[] args) {
    51. //创建Employee对象
    52. Employee employee = new Employee();
    53. employee.setName("张三");
    54. employee.setAge(28);
    55. employee.setSex('男');
    56. //先创建部门对象
    57. Department department = new Department();
    58. //对department对象属性进行赋值
    59. department.setDepId("0001");
    60. department.setDeptName("研发部");
    61. department.setEmployee(employee);
    62. //以上是在赋值
    63. //取值
    64. //想要部门的id
    65. System.out.println(department.getDepId());
    66. //想要获取部门的名字
    67. System.out.println(department.getDeptName());
    68. //想要获取部门下面的员工对象,会打印的啥? 会打印的是地址!!!
    69. System.out.println(department.getEmployee());
    70. //能够获取出来employe对象了。
    71. //能不能获取emplopyee对象的属性值呢?
    72. System.out.println("员工的名字:" +department.getEmployee().getName());
    73. System.out.println("员工的年龄:" + department.getEmployee().getAge());
    74. System.out.println("员工的性别:" + department.getEmployee().getSex());
    75. }
    76. }

    2.

    1. class Adult {
    2. private String name;//成年人的名字
    3. private Child child;//成年人下面的孩子对象
    4. public String getName() {
    5. return name;
    6. }
    7. public void setName(String name) {
    8. this.name = name;
    9. }
    10. public Child getChild() {
    11. return child;
    12. }
    13. public void setChild(Child child) {
    14. this.child = child;
    15. }
    16. }
    17. class Child {
    18. private String name;
    19. private int age;
    20. private Toy toy;
    21. public String getName() {
    22. return name;
    23. }
    24. public void setName(String name) {
    25. this.name = name;
    26. }
    27. public int getAge() {
    28. return age;
    29. }
    30. public void setAge(int age) {
    31. this.age = age;
    32. }
    33. public Toy getToy() {
    34. return toy;
    35. }
    36. public void setToy(Toy toy) {
    37. this.toy = toy;
    38. }
    39. }
    40. class Toy {
    41. private String name;//玩具的名字
    42. private double price;//玩具的价格
    43. private String kind;//玩具的种类
    44. public String getName() {
    45. return name;
    46. }
    47. public void setName(String name) {
    48. this.name = name;
    49. }
    50. public double getPrice() {
    51. return price;
    52. }
    53. public void setPrice(double price) {
    54. this.price = price;
    55. }
    56. public String getKind() {
    57. return kind;
    58. }
    59. public void setKind(String kind) {
    60. this.kind = kind;
    61. }
    62. }
    63. public class Demo3 {
    64. public static void main(String[] args) {
    65. Toy toy = new Toy();
    66. toy.setName("骚奥特曼");
    67. toy.setPrice(67.8);
    68. toy.setKind("皮套");
    69. Child child = new Child();
    70. child.setName("小骚磊");
    71. child.setAge(1);
    72. child.setToy(toy);
    73. Adult saolei = new Adult();
    74. saolei.setName("骚磊");
    75. saolei.setChild(child);
    76. //以上都是在赋值
    77. //取值
    78. //需求
    79. //通过成年人找到孩子的名字
    80. //saolei.getChild()获取孩子对象 .getName
    81. System.out.println(saolei.getChild().getName());//获取孩子的名字
    82. System.out.println(saolei.getChild().getAge());//获取孩子的年龄
    83. //通过成年人获取玩具的种类 名字 价格的
    84. System.out.println(saolei.getChild().getToy().getName());
    85. System.out.println(saolei.getChild().getToy().getKind());
    86. }
    87. }

    3. 

    1. class Teacher {
    2. private String name;//老师的姓名
    3. private char sex;
    4. private int age;
    5. //老师下面有很多的学生 Student[] stus = new Student[3];
    6. private Student[] student;
    7. public String getName() {
    8. return name;
    9. }
    10. public void setName(String name) {
    11. this.name = name;
    12. }
    13. public char getSex() {
    14. return sex;
    15. }
    16. public void setSex(char sex) {
    17. this.sex = sex;
    18. }
    19. public int getAge() {
    20. return age;
    21. }
    22. public void setAge(int age) {
    23. this.age = age;
    24. }
    25. public Student[] getStudent() {
    26. return student;
    27. }
    28. public void setStudent(Student[] student) {
    29. this.student = student;
    30. }
    31. }
    32. class Student {
    33. private String name;
    34. public String getName() {
    35. return name;
    36. }
    37. public void setName(String name) {
    38. this.name = name;
    39. }
    40. }
    41. public class Demo2 {
    42. public static void main(String[] args) {
    43. Student[] stus = new Student[2];//现在数组是一个空的
    44. //对数组进行赋值
    45. Student student = new Student();
    46. student.setName("骚磊");
    47. Student student2 = new Student();
    48. student2.setName("老万");
    49. stus[0] = student;
    50. stus[1] = student2;
    51. //脑海里面 想到stus是一个容器 数组, 里面已经放了两个值了
    52. //两个对象
    53. Teacher teacher = new Teacher();
    54. teacher.setName("老邢");
    55. teacher.setAge(89);
    56. teacher.setSex('女');
    57. //现在setStudent的参数是一个数组
    58. //stus里面有值了 两个对象student
    59. teacher.setStudent(stus);
    60. //以上都是在赋值
    61. //取值
    62. Student[] students = teacher.getStudent();
    63. for (int i = 0; i < students.length; i++) {
    64. System.out.println(students[i].getName());
    65. }
    66. }
    67. }

    最后再给大家一个题,大家可以尝试做做

    4.
    需求:
     两个宠物一个狗一个猫宠物饿了,需要主人给宠物喂食
     1.不同的宠物吃的不同
     2.不同的宠物吃完食体力值增加
     3.主人和狗玩游戏 接飞盘的游戏。狗体力值减去10,但是会和主人的亲密度提升5
     4.主人和猫玩游戏  滚毛球。猫体力值减去12 ,但是会和主人的亲密度提升7
     
     人类
     猫类 

    以上,就是今天的所有知识点了。今天的知识点要稍微难一点,确实没那么好理解。我当时懂了,也能敲出作业,但是一个国庆没看,现在还不是就又忘记了,今天写这篇文章的时候都比之前速度慢很多,就是没有理解透彻的原因。

    所以大家一定多看多敲多熟悉。 

    加油吧,预祝大家变得更强!

  • 相关阅读:
    MyBatis篇---第一篇
    CURL
    尚硅谷-ShardingSphere
    常见服务知识点罗列--haproxy/keepalived
    电脑启动过程(超详细过程)
    CCF CSP 201403-2 窗口 题解
    产品需求分析师的基本职责(合集)
    高效并发:Synchornized的锁优化详解
    RibbonBar
    基于细节增强的MR序列转换方法
  • 原文地址:https://blog.csdn.net/LF__plus/article/details/133653088