深入分析类与对象

发布于 2020-08-11  255 次阅读


成员属性封装

在类之中的组成就是属性与方法,一般而言方法都是对外提供服务的,所以是不会进行封装处理的,而对于属性由于其需要较高的安全性,所以往往需要对其进行保护,这个时候就需要采用封装对属性进行保护

默认情况下,对于类中的属性可以通过其它类的对象进行调用的

案例代码-调用

class Person {
  String name; // 人员姓名
  int age; // 人的年龄

  public void tell() {
    System.out.println("姓名" + name + "年龄" + age);
  }
}

public class PackgeDemo {
  public static void main(String[] args) {
    Person per = new Person(); // 声明并实例化对象
    per.name = "张三"; // 在类外部修改属性
    per.age = 18; // 在类外部修改属性
    per.tell(); // 调用方法
  }
}

此时Person类中提供的name和age两个属性并没有进行封装处理,这样外部就可以直接进行调用,但是有可能设置的数据是错误的数组.想解决这样的问题就需要private关键字

案例代码-封装

class Person2 {
  private String name; // 人员姓名
  private int age; // 人的年龄

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public int getAge() {
    return age;
  }
}

public class PackgeDemo2 {
  public static void main(String[] args) {
    Person2 per = new Person2(); // 声明并实例化对象
    per.setName("张三"); // 在类外部修改属性
    per.setAge(20); // 在类外部修改属性
    System.out.println(per.getName() + per.getAge());
  }
}

提供private修饰后,需要提供相对应的set,get方法用于外部获取属性

构造方法与匿名对象

目前的程序在使用类的时候一般都按照了如下步骤进行

  • 声明并实例化对象,此时实例化对象中的属性并没有任何的数据存在,都是其对应数据类型的默认值
  • 需要通过set方法为类中的属性设置内容

要想真正获得一个可以正常使用的实例化对象,需要经过两个步骤

可以通过构造方法实现实例化对象中的属性初始化处理

案例代码-构造方法

class Person3 {
  private String name; // 人员姓名
  private int age; // 人的年龄
  // 方法名称与类名称相同,且无返回值
  public Person3(String n, int a) {
    name = n;
    age = a;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public int getAge() {
    return age;
  }
}

public class Constructors {
  public static void main(String[] args) {
    Person3 per = new Person3("张三", 20); // 声明并实例化对象
    System.out.println(per.getName() + per.getAge());
  }
}

所有的类都会提供构造方法,也就是说如果没有自定义任何构造方法,系统会在编译的时候自动创建一个

案例代码-构造方法重载

class Person4 {
  private String name; // 人员姓名
  private int age; // 人的年龄
  // 方法名称与类名称相同,且无返回值
  public Person4() {
    name = "shh";
    age = 20;
  }

  public Person4(String n) {
    name = n;
    age = 20;
  }

  public Person4(String n, int a) {
    name = n;
    age = a;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public int getAge() {
    return age;
  }
}

public class Constructors2 {
  public static void main(String[] args) {
    Person4 per = new Person4("张三", 20);
    Person4 per2 = new Person4("李四"); // 声明并实例化对象
    System.out.println(per.getName() + per.getAge());
    System.out.println(per2.getName() + per2.getAge());
  }
}

案例代码-匿名对象

public class Anonymous {
  public static void main(String[] args) {
    new Person4("张三", 20).tell();
  }
}

此时通过对象进行类中方法的调用,但是由于此对象没有任何的引用,所以使用一次之后就会成为垃圾,所有的垃圾将被GC进行回收释放