2.封装

2.1.步骤
  1. 使用 private 关键字来修饰成员变量。
  2. 对需要访问的成员变量,提供对应的一对 getXxx 方法 、 setXxx 方法。
2.2.private关键字
  1. private是一个权限修饰符,代表最小权限;

  2. 可以修饰成员变量和成员方法;

  3. 被private修饰后的成员变量和成员方法,只在本类中才能访问。

  4. 权限修饰符的对比:

    • public:任意类均访问,实际就是没有限制访问权限
    • protected:同包中的其他类,和不同包的(可见)子类均可见,一部分类可以访问到,一部分不行。
    • default(默认权限,隐式定义,不写任何关键字),同包中的其他类可见,不关心是不是子类
    • private,仅对同类中的其他成员可见
      public protected (default) private
      同一类中
      同一包中
      不同包的子类
      不同包中的无关类

      定义上含糊的说了,protected在不同包的子类中可以访问但实际上不同包的子类,仍然可以细分

      • 不同包的子类中,创建父类对象,用父类对象访问protected成员

      • 不同包的子类中,创建子类对象,用子类对象访问protected成员

      • 不同包的子类中,创建该类的其他子类对象,用这个其他子类对象访问protected成员

        后续在继承中补充说明。

    使用 private 修饰成员变量,并提供 getXxx 方法 / setXxx 方法,可以访问成员变量,代码如下:

//private 数据类型 变量名 ;
public class Student {
   

    private String name;
    private int age;

    public void setName(String n) {
   
        name = n;
    }
    public String getName() {
   
        return name;
    }
    public void setAge(int a) {
   
        age = a;
    }
    public int getAge() {
   
        return age;
    }
}
2.3.this关键字
  • this代表所在类的当前对象的引用(地址值),即对象自己的引用。

    注意事项:方法被哪个对象调用,方法中的this就代表那个对象。即谁在调用,this就代表谁。

  • 使用 this 修饰方法中的变量,解决成员变量被隐藏的问题,代码如下:
public class Student {
   

    private String name;
    private int age;

    public void setName(String name) {
   
        //name = name;
        this.name = name;
    }
    public String getName() {
   
        return name;
    }
    public void setAge(int age) {
   
        //age = age;
        this.age = age;
    }
    public int getAge() {
   
        return age;
    }
}
2.4.构造方法
  • 构造方法的写法上,方法名与它所在的类名相同。它没有返回值,所以不需要返回值类型,甚至不需要void。使用
    构造方法后,代码如下:
public class Student {
   

    private String name;
    private int age;

    // 无参数构造方法
    public Student() {
   }
    // 有参数构造方法
    public Student(String name,int age) {
   
        this.name = name;
        this.age = age;
    }
}

注意事项:

  1. 如果你不提供构造方法,系统会给出无参数构造方法。
  2. 如果你提供了构造方法,系统将不再提供无参数构造方法。
  3. 构造方法是可以重载的,既可以定义参数,也可以不定义参数。
  4. 无论是否自定义构造方法,所有的类都有构造方法,因为Java自动提供了一个无参数构造方法,
    一旦自己定义了构造方法,Java自动提供的默认无参数构造方法就会失效。
2.5.标准代码—JavaBean
  • JavaBean 是 Java语言编写类的一种标准规范。符合 JavaBean 的类,要求类必须是具体的和公共的,并且具有无
    参数的构造方法,提供用来操作成员变量的 set 和 get 方法。
public class ClassName{
   
    //成员变量
    //构造方法
    //无参构造方法【必须】
    //有参构造方法【建议】
    //成员方法
    //getXxx()
    //setXxx()
}
  • 编写符合 JavaBean 规范的类,以学生类为例,标准代码如下:
public class Student {
   
    //成员变量
    private String name;
    private int age;
    //构造方法
    public Student() {
   }
    public Student(String name,int age) {
   
        this.name = name;
        this.age = age;
    }
    //成员方法
    publicvoid setName(String name) {
   
        this.name = name;
    }
    public String getName() {
   
        return name;
    }
    publicvoid setAge(int age) {
   
        this.age = age;
    }
    publicint getAge() {
   
        return age;
    }
}
  • 测试类,代码如下:
public class TestStudent {
   
    public static void main(String[] args) {
   
        //无参构造使用
        Student s= new Student();
        s.setName("柳岩");
        s.setAge(18);
        System.out.println(s.getName()+"‐‐‐"+s.getAge());
        //带参构造使用
        Student s2= new Student("赵丽颖",18);
        System.out.println(s2.getName()+"‐‐‐"+s2.getAge());
    }
}
2.6.匿名对象
  • 应用场景:应对于某个对象只应用一次的场景。

    注意事项:匿名对象可以作为参数和返回值

    • 作为参数
      class Test1 {
             
        public static void main(String[] args) {
             
        // 普通方式
            Scanner sc = new Scanner(System.in);
            input(sc);
            //匿名对象作为方法接收的参数
            input(new Scanner(System.in));
        }
        public static void input(Scanner sc){
             
            System.out.println(sc);
        }
      }
      
    • 作为返回值
      class Test2 {
             
        public static void main(String[] args) {
             
            // 普通方式
            Scanner sc = getScanner();
        }    
        public static Scanner getScanner(){
             
            //普通方式
            //Scanner sc = new Scanner(System.in);
            //return sc;
            //匿名对象作为方法返回值
            return new Scanner(System.in);
        }
      }