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

    }
}
原文地址:https://www.cnblogs.com/deer-cen/p/12205160.html