• java基础---10. 封装性


    封装

    封装就是将一些细节信息隐藏起来对于外界不可见,在Java中的体现

    • 方法就是一种封装
    • 关键字private也是一种封装

    1 private关键字的作用及使用

    private关键字可以提高代码的安全性

    • 创建一个Person类
    /*
    问题描述:定义Person的年龄的时候,无法阻止不合理的数组被设置进来
    解决方法:用private关键字将需要保护的成员变量进行修饰,在本类当中依然可以随意访问,但是超出了本类范围不能直接访问
    但是可以间接访问
    间接访问private成员变量,就是定义一对getxxx和setxxx方法
    getXxx:不可以有参数,返回值类型和成员变量对应
    setXxx:不能有返回值,参数类型和成员变量对应
     */
    public class Person {
        String name;//姓名
        //int age;//年龄
        private int age;//年龄
        public void show() {
            System.out.println("我叫:"+ name + ", 年龄:" + age);
        }
    
        //成员方法
        //方便外部间接访问age
        //1 对age进行设置
        public void setAge(int num) {//方法名固定
            if (num < 100 && num >= 0) {
                age = num;
            } else {
                System.out.println("数据不合理");
            }
        }
        //2. 获取age中的数字
        public int getAge() {
            return age;
        }
    }
    
    • 使用
    public class Demo02Person {
        public static void main(String[] args) {
            Person person = new Person();
            person.show();//我叫:null, 年龄:0
    
            person.name = "赵丽颖";
            //person.age = -20;私private成员变量不可直接访问
            //间接访问如下
            person.setAge(-20);//数据不合理
            person.show();//我叫:赵丽颖, 年龄:0
    
            person.setAge(20);
            person.show();//我叫:赵丽颖, 年龄:20
        }
    }
    

    2 练习使用private关键字定义一个学生类

    • 定义
    public class Student {
        private String name;//姓名
        private int age;//年龄
        private boolean 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;
        }
        public void setMale(boolean b) {
            male = b;
        }
        public boolean isMale() {//对于基本类型中的Boolean值,getXxx方法要写成isXxx的形式
            return male;
        }
    }
    
    
    • 使用
    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());
        }
    }
    

    3 this关键字的作用

    • 定义
    //只要不在一个包中,就可以有同名的类
    public class Person {
        String name;//我自己的名字
    
        //who是对方的名字,成员变量name是我自己的名字
        public  void sayHello(String who) {
            System.out.println(who + ", 你好。我是" + name);
        }
    }
    
    • 使用
    public class Demo01Person {
        public static void main(String[] args) {
            Person person = new Person();
    
            //设置我自己的名字
            person.name = "王健林";
            person.sayHello("王思聪");//王思聪, 你好。我是王健林
        }
    }
    

    现在将定义的类稍作修改:将对方的名字who也修改成name

    • 定义
    /*
    当方法的局部变量和类的成员变量重名的时候,根据就近原则,优先使用局部变量
     */
    public class Person {
        String name;//我自己的名字
    
        //name是对方的名字,成员变量name是我自己的名字
        public  void sayHello(String name) {
            System.out.println(name + ", 你好。我是" + name);
        }
    }
    
    • 使用
    public class Demo01Person {
        public static void main(String[] args) {
            Person person = new Person();
    
            //设置我自己的名字
            person.name = "王健林";//成员变量没用上
            person.sayHello("王思聪");//王思聪, 你好。我是王思聪
        }
    }
    

    那如何解决重名分不开的问题呢?this

    • 定义
    /*
    当方法的局部变量和类的成员变量重名的时候,根据就近原则,优先使用局部变量
    如果非要使用成员变量就需要使用一个格式:this.成员变量
    记住: 通过谁调用的方法谁就是this.
    比如:本例中在sayHello()方法的内部写了this.而person调用了该方法,person(是Person类的一个实例),那么this.name
    就等于person.name
     */
    public class Person {
        String name;//我自己的名字
    
        //who是对方的名字,成员变量name是我自己的名字
        public  void sayHello(String name) {
            System.out.println(name + ", 你好。我是" + this.name);
            System.out.println(this);//与person是同一个地址cn.itcast.day05.demo04.Person@6e8dacdf
        }
    }
    
    • 使用
    public class Demo01Person {
        public static void main(String[] args) {
            Person person = new Person();
    
            //设置我自己的名字
            person.name = "王健林";//成员变量没用上
            person.sayHello("王思聪");//王思聪, 你好。我是王健林
            System.out.println(person);//与this是同一个地址cn.itcast.day05.demo04.Person@6e8dacdf
        }
    }
    

    4 构造方法

    • 定义
    public class Student {
        public Student() {
            System.out.println("构造方法被执行啦!");
        }
    }
    
    • 使用
    public class Demo02Student {
        public static void main(String[] args) {
            //当通过new创建一个对象的时候,其实就是在掉用构造方法(这和普通方法的调用有所不同)
            Student stu = new Student();//运行该程序会自动打印 构造方法被执行啦!
        }
    }
    

    对构造方法进一步说明:

    • 定义
    /*
    构造方法专门用来创建对象的方法,当我们通过关键字new来创建对象的时候,其实就是在调用构造方法
    格式:
    public 类名称(参数类型 参数名称) {
            //方法体
    }
    注意事项:
    1. 构造方法的名称必须与所在类的名称完全一致,就连大小写也一样
    2. 构造方法不要写返回值类型,连void都不要写
    3. 构造方法不可以return一个具体的返回值
    4. 如果没有编写任何构造方法,那么编译器会默认赠送一个构造方法,没有参数,方法体什么事情都不
    做,就像这样: public Student(){}
    5. 一旦编写了至少一个构造方法编译器将不再赠送
    6. 构造方法也是可以被重载的(方法名称相同,参数列表不同)
     */
    public class Student {
        private String name;
        private int age;
        //构造函数
        public Student(String name, int age) {
            System.out.println("全参构造方法被执行啦!");//全参:成员变量都被使用了
            this.name = name;
            this.age = age;
        }
        public Student() {
            System.out.println("无参构造方法被执行啦!");
        }
    }
    
    • 使用
    public class Demo02Student {
        public static void main(String[] args) {
            //当通过new创建一个对象的时候,其实就是在掉用构造方法(这和普通方法的调用有所不同)
            Student stu1 = new Student();//无参构造方法被执行啦!
            Student stu2 = new Student("赵丽颖",20);//全参构造方法被执行啦!
        }
    }
    

    虽然通过全参数的构造方法可以对某个对象的name和age进行赋值,但是怎么修改和取出来呢

    • 定义
    public class Student {
        //成员变量
        private String name;
        private int age;
        //构造函数
        public Student(String name, int age) {
            System.out.println("全参构造方法被执行啦!");//全参:成员变量都被使用了
            this.name = name;
            this.age = age;
        }
        public Student() {
            System.out.println("无参构造方法被执行啦!");
        }
    
        //get方法和set方法
        public void setName(String str) {
            name = str;
        }
        public String getName() {
            return name;
        }
        public void setAge(int num) {
            age = num;
        }
        public int getAge(){
            return age;
        }
    }
    
    • 使用
    public class Demo02Student {
        public static void main(String[] args) {
            //当通过new创建一个对象的时候,其实就是在掉用构造方法(这和普通方法的调用有所不同)
            Student stu1 = new Student();//无参构造方法被执行啦!
            Student stu2 = new Student("赵丽颖",20);//全参构造方法被执行啦!
            System.out.println("姓名是:" + stu2.getName() + ", 年龄是:" + stu2.getAge() + "岁。");//姓名是:赵丽颖, 年龄是:20岁。
    
            //如果需要修改对象中成员变量数据类容,仍然需要使用setXxx方法
            stu2.setAge(21);
            System.out.println("姓名是:" + stu2.getName() + ", 年龄是:" + stu2.getAge() + "岁。");//姓名是:赵丽颖, 年龄是:21岁。
        }
    }
    

    5 调用一个标准的学生类

    • 定义
    /*
    一个标准的类通常拥有以下四个部分
    
    1. 所有的成员变量都要使用private关键字
    2. 为每一个成员变量写一对setter和getter方法
    3. 编写一个无参数的构造方法
    4. 编写一个有参数的构造方法
    
    这样标准的类也叫做Java Bean
     */
    public class Student {
        private String name;
        private int age;
    
        //无参数的构造方法:菜单栏Code-->Generate--->选择Constructor--->Select None
        public Student() {
        }
    
        //全参数的构造方法:菜单栏Code-->Generate--->选择Constructor--->都选上后点击OK
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        //Getter和Setter方法:菜单栏Code-->Generate--->选择Getter and Setter--->都选上后点击OK 可以自动生成方法
        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());//姓名:迪丽热巴,年龄:20
    
            Student stu2 = new Student("古力娜扎",21);
            System.out.println("姓名:" + stu2.getName() + ",年龄:" + stu2.getAge());//姓名:古力娜扎,年龄:21
            stu2.setAge(22);
            System.out.println("姓名:" + stu2.getName() + ",年龄:" + stu2.getAge());//姓名:古力娜扎,年龄:22
    
        }
    }
    
  • 相关阅读:
    消息队列技术
    NET Core中使用Apworks
    TCP基础
    Oracle停止一个JOB
    如何在Java 8中愉快地处理日期和时间
    mysql字符串区分大小写的问题
    【已解决】javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint
    spring boot 1.4默认使用 hibernate validator
    mysql shell
    android:background="@drawable/home_tab_bg"
  • 原文地址:https://www.cnblogs.com/deer-cen/p/12205160.html
Copyright © 2020-2023  润新知