【Java】访问修饰符之private && this 关键字

private

  1. 是一个权限修饰符
  2. 可以修饰成员变量和成员方法
  3. 被其修饰的成员只能在本类中被访问,可以保护成员不被其他类使用
  • 提供 “get 变量名()”方法,用于获得成员变量的值,方法用 public 修饰
  • 提供 “set 变量名(参数)”方法,用于设置成员变量的值,方法用于public 修饰        

this

this 修饰的变量用于指代成员变量

  • 方法的形参如果与成员变量同名,不带 this 修饰的变量指的是形参
  • 方法的形参没有与成员变量同名,不带 this 修饰的 变量指的是成员变量

 什么时候用 this?解决局部变量隐藏成员变量

this : 代表所在的类对象的引用

方法被那个对象调用,this 就代表那个对象

Student.java如下:

package com.面向对象;

public class Student {
    String name;
    private int age;
    //age 不能被外部访问的,只能在Student当前类中访问age

    public void work() {
        System.out.println("开始敲代码...");
    }

    /**
     * 定义的类一般是需要给成员属性生成get/set方法的
     * ∵目的:保护类中的成员属性变量,权限控制,
     * ∴给成员属性前加 private(私有的),想要给private赋值,就得使用get/set方法,非private,也可以使用get/set
     * get---获取成员变量的值
     * set---给成员变量赋值
     */
    // 下面是自动生成的get/set方法(右键Generate)
    public String getName() {
        return name; // => return this.name
        // 由于该方法中 没有形参name,所以这里的name可以不加this,这里的name 指的就是成员变量的name
    }

    public void setName(String name) {
        this.name = name;
        // name=name 方法的形参name与成员变量参数name的名称 相同 不带this的话 第一个name指的就是形参(毫无意义,=> String naem="";name=name)
        // name=n 方法的形参 n 与成员变量参数 name 不相同  不带this的话 name指的就是成员变量(=> this.name=n)
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age < 0 || age > 120) {
            System.out.println("年龄不符...");
            return;
        }
        this.age = age; //this.age(成员变量age)=age(局部变量age)
    }



    public void work2() {
//    public void work2(int i){
        // 在方法中传递的参数(形参)也属于该方法里面的局部变量
        Student s = new Student(); // 单独的一个线程GC线程 在堆内存中 不可用的对象
        // new Student存放在堆内存中,s存放在栈空间中,直接引用到堆内存地址
        /**
         * 局部变量int i/age 在什么时候被销毁呢?work2方法执行结束之后
         * GC 垃圾回收
         *  Student s ------引用到堆内存 new Studnet对象的内存地址
         */
        int i = 20;
        int age = 30;
        // 局部变量 变量名称 在同一个方法中 不允许 存在 多个相同的变量名称
        int z;
//        System.out.println(z); //局部变量 使用前 必须 先赋值
        System.out.println(this.age); // 成员变量 有默认初始值
        this.age = age; //在work2方法中 将局部变量age 赋值给 成员变量的age(在方法内调用成员变量使用this)
    }
}

StudentDemo.java如下:

package com.面向对象;

public class StudentDemo {
    public static void main(String[] args) {
        Student mayiktStudent = new Student(); // new Student()存放堆内存,mayiktStudent存放在栈内存,直接引用到堆内存地址
        System.out.println(mayiktStudent);
        mayiktStudent.setName("mayikt");
//        mayiktStudent.age = 21;
        mayiktStudent.setAge(21);
        System.out.println(mayiktStudent.getName() + "-" + mayiktStudent.getAge());
        mayiktStudent.work();
//        Student xiaojunStudent = new Student();
        Student xiaojunStudent = mayiktStudent; //将mayiktStudent的堆内存地址复制给xiaojunStudent
        System.out.println(xiaojunStudent); // 可以看到这个内存地址与mayiktStudent的内存地址一样
        xiaojunStudent.setName("xiaojun");
        xiaojunStudent.setAge(24);
        System.out.println(mayiktStudent.getName() + "-" + mayiktStudent.getAge()); // 现在两个对象使用的是一个内存地址,
        System.out.println(xiaojunStudent.getName() + "-" + xiaojunStudent.getAge()); //所以两个对象的属性值一样
        xiaojunStudent.work();
    }
}

下一篇文章:

你可能感兴趣的:(java,开发语言,private,this,面向对象)