zoukankan      html  css  js  c++  java
  • Java Object-Oriented:day06 【 Inheritance and construction method】

    一、什么是封装

    1、封装概述

    面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。
    要访问该类的数据,必须通过指定的方式。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性

    2、原则

    3、封装的步骤

    1. 使用 private 关键字来修饰成员变量。

    2. 对需要访问的成员变量,提供对应的一对 getXxx 方法 、 setXxx 方法

    二、 封装的操作—private关键字

    1、问题描述:定义Person的年龄时,无法阻止不合理的数值被设置进来。

    解决方案:用private关键字将需要保护的成员变量进行修饰。

    一旦使用了private进行修饰,那么本类当中仍然可以随意访问。但是!超出了本类范围之外就不能再直接访问了。

    间接访问private成员变量,就是定义一对儿Getter/Setter方法

    1. 必须叫setXxx或者是getXxx命名规则。
    2. 对于Getter来说,不能有参数,返回值类型和成员变量对应;
    3. 对于Setter来说,不能有返回值,参数类型和成员变量对应。

    2、示例代码

    Person类
    public class Person {
        String name; // 姓名
        private int age; // 年龄
    
        public void show() {
            System.out.println("我叫:" + name + ",年龄:" + age);
        }
    
        // 这个成员方法,专门用于向age设置数据
        public void setAge(int num) {
            if (num < 100 && num >= 9) { // 如果是合理情况
                age = num;
            } else {
                System.out.println("数据不合理!");
            }
        }
    
        // 这个成员方法,专门私语获取age的数据
        public int getAge() {
            return age;
        }
    }
    

    测试类

    package day06.demo03;
    
    public class Demo03Person {
        public static void main(String[] args) {
            Person person = new Person();
            person.show();
    
            person.name = "赵丽颖";
    //        person.age = -20; // 直接访问private内容,错误写法!
            person.setAge(20);
            person.show();
        }
    }
    

    运行结果

    "D:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=62064:D:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:OneDrivejavasrcoutproductionOneDrive day06.demo03.Demo03Person
    我叫:null,年龄:0
    我叫:赵丽颖,年龄:20
    
    Process finished with exit code 0
    

    3、练习使用private关键字定义

    定义类

    package day06.demo03;
    
    /*
    对于基本类型当中的boolean值,Getter方法一定要写成isXxx的形式,而setXxx规则不变。
     */
    
    public class Student {
        private String name; // 姓名
        private int age; // 年龄
        private boolean male; // 是不是爷们儿
    
        public void setMale(boolean b) {
            male = b;
        }
    
        public boolean isMale() {
            return male;
        }
    
        public void setName(String str) {
            name = str;
        }
    
        public String getName() {
            return name;
        }
    
        public void setAge(int num) {
            age = num;
        }
    
        public int getAge() {
            return age;
        }
    }

    定义测试类

    package day06.demo03;
    
    public class Demo04Student {
        public static void main(String[] args) {
            Student stu = new Student();
    
            stu.setName("鹿晗");
            stu.setAge(20);
            stu.setMale(true);
    
            System.out.println("姓名:" + stu.getName());
            System.out.println("年龄:" + stu.getAge());
            System.out.println("是不是爷们儿:" + stu.isMale());
        }
    }
    

    运行结果

    "D:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=62152:D:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:OneDrivejavasrcoutproductionOneDrive day06.demo03.Demo04Student
    姓名:鹿晗
    年龄:20
    是不是爷们儿:true
    
    Process finished with exit code 0

    三、 形参变量名与成员变量名重名怎嘛办?

    1、问题描述

    我们发现 setXxx 方法中的形参名字并不符合见名知意的规定,那么如果修改与成员变量名一致,是否就见名知意了呢?代码如下:

    public class Student {
      private String name;
      private int age;
      public void setName(String name) {
        name = name;
      }
      public void setAge(int age) {
        age = age;
      }
    }

    经过修改和测试,我们发现新的问题,成员变量赋值失败了。也就是说,在修改了 setXxx() 的形参变量名后,方法并没有给成员变量赋值!这是由于形参变量名与成员变量名重名,导致成员变量名被隐藏,
    方法中的变量名,无法访问到成员变量,从而赋值失败。所以,我们只能使用this关键字,来解决这个重名问题

    2、this的含义

    this代表所在类的当前对象的引用(地址值),即对象自己的引用。

    记住 :方法被哪个对象调用,方法中的this就代表那个对象。即谁在调用,this就代表谁。

    2、this使用格式

    this.成员变量名;

    3、使用  this 修饰方法中的变量,解决成员变量被隐藏的问题,代码如下

    Person类
    package day06.demo04;
    
    /*
    当方法的局部变量和类的成员变量重名的时候,根据“就近原则”,优先使用局部变量。
    如果需要访问本类当中的成员变量,需要使用格式:
    this.成员变量名
    
    “通过谁调用的方法,谁就是this。”
     */
    
    public class Person {
        String name; // 我自己的名字
    
        // 参数name是对方的名字
        // 成员变量name是自己的名字
        public void sayHello(String name) {
            System.out.println(name + ",你好。我是" + this.name);
            System.out.println(this);
        }
    }
    

    测试类

    package day06.demo04;
    
    public class Demo01Person {
        public static void main(String[] args) {
            Person person = new Person();
            // 设置我自己的名字
            person.name = "王健林";
            person.sayHello("王思聪");
    
            System.out.println(person); // 地址值
        }
    
    } 

    运行结果

    "D:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=62613:D:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:OneDrivejavasrcoutproductionOneDrive day06.demo04.Demo01Person
    王思聪,你好。我是王健林
    day06.demo04.Person@9807454
    day06.demo04.Person@9807454
    
    Process finished with exit code 0

    四、 封装优化2——构造方法

    1、构造方法的定义格式

    修饰符 构造方法名(参数列表){
    // 方法体    
    }

    2、示例代码

     学生类

    package day06.demo04;
    /*
    构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法。
    格式:
    public 类名称(参数类型 参数名称) {
        方法体
    }
    
    注意事项:
    1. 构造方法的名称必须和所在的类名称完全一样,就连大小写也要一样
    2. 构造方法不要写返回值类型,连void都不写
    3. 构造方法不能return一个具体的返回值
    4. 如果没有编写任何构造方法,那么编译器将会默认赠送一个构造方法,没有参数、方法体什么事情都不做。
    public Student() {}
    5. 一旦编写了至少一个构造方法,那么编译器将不再赠送。
    6. 构造方法也是可以进行重载的。
    重载:方法名称相同,参数列表不同。
     */
    
    public class Student {
        // 成员变量
        private String name;
        private int age;
    
        // 无参数的构造方法
        public Student() {
            System.out.println("无参构造方法执行啦!");
        }
    
        // 全参数的构造方法
        public Student(String name, int age) {
            System.out.println("全参构造方法执行啦!");
            this.name = name;
            this.age = age;
        }
    
        // Getter Setter
        public void setName(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public int getAge() {
            return age;
        }
    }
    

      测试类

    package day06.demo04;
    
    public class Demo02Student {
        public static void main(String[] args) {
            Student stu1 = new Student(); // 无参构造
            System.out.println("============");
    
            Student stu2 = new Student("赵丽颖", 20); // 全参构造
            System.out.println("姓名:" + stu2.getName() + ",年龄:" + stu2.getAge());
            // 如果需要改变对象当中的成员变量数据内容,仍然还需要使用setXxx方法
            stu2.setAge(21); // 改变年龄
            System.out.println("姓名:" + stu2.getName() + ",年龄:" + stu2.getAge());
    
        }
    }
    

    运行结果:

    "D:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=62708:D:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:OneDrivejavasrcoutproductionOneDrive day06.demo04.Demo02Student
    无参构造方法执行啦!
    ============
    全参构造方法执行啦!
    姓名:赵丽颖,年龄:20
    姓名:赵丽颖,年龄:21
    
    Process finished with exit code 0

    3、注意事项

    1. 如果你不提供构造方法,系统会给出无参数构造方法。
    2. 如果你提供了构造方法,系统将不再提供无参数构造方法。
    3. 构造方法是可以重载的,既可以定义参数,也可以不定义参数

    五、 标准代码—JavaBean

    JavaBean 是 Java语言编写类的一种标准规范。符合 JavaBean 的类,要求类必须是具体的和公共的,并且具有无参数的构造方法,提供用来操作成员变量的 set 和 get 方法。

    public class ClassName{
      //成员变量
      //构造方法
      //无参构造方法【必须】
      //有参构造方法【建议】
      //成员方法   
      //getXxx()
      //setXxx()
    }

     编写符合 JavaBean 规范的类,以学生类为例,标准代码如下:

    一个标准的类通常要拥有下面四个组成部分:

    1. 所有的成员变量都要使用private关键字修饰
    2. 为每一个成员变量编写一对儿Getter/Setter方法
    3. 编写一个无参数的构造方法
    4. 编写一个全参数的构造方法

    这样标准的类也叫做Java Bean

    package day06.demo05;
    
    
    
    public class Student {
        private String name;
        private int age;
    
        //Code-Generate-Constructor 什么都不选择
        public Student() {
    
        }
        //Code-Generate-Constructor 全选
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        // Code-Generate-Getter and Setter
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    

      

    测试类,代码如下:

    public class Demo01Student {
    
        public static void main(String[] args) {
            Student stu1 = new Student();
            stu1.setName("迪丽热巴");
            stu1.setAge(20);
            System.out.println("姓名:" + stu1.getName() + ",年龄:" + stu1.getAge());
            System.out.println("=================");
    
            Student stu2 = new Student("古力娜扎", 21);
            System.out.println("姓名:" + stu2.getName() + ",年龄:" + stu2.getAge());
            stu2.setAge(22);
            System.out.println("姓名:" + stu2.getName() + ",年龄:" + stu2.getAge());
        }
    
    }
    

    运行结果

    "D:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=63198:D:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:OneDrivejavasrcoutproductionOneDrive day06.demo05.Demo01Student
    姓名:迪丽热巴,年龄:20
    =================
    姓名:古力娜扎,年龄:21
    姓名:古力娜扎,年龄:22
    
    Process finished with exit code 0
  • 相关阅读:
    SCAU 9504 面试
    SCAU 9503 懒人选座位
    SCAU 8628 相亲
    SCAU 10691 ACM 光环
    SCAU 8626 原子量计数
    SCAU 10674 等差对
    HDU ACM 1048 The Hardest Problem Ever (水题)
    SCAU 9502 ARDF
    SCAU 10686 DeathGod不知道的事情
    SCAU 8629 热身游戏(高精度)
  • 原文地址:https://www.cnblogs.com/luoahong/p/12605103.html
Copyright © 2011-2022 走看看