Java オブジェクト指向には、カプセル化、継承、ポリモーフィズムという 3 つの主要な機能があります。カプセル化と継承は基本的にポリモーフィズムに役立ちます。
カプセル化: オブジェクトのプロパティと操作 (またはサービス) を独立した全体に結合し、オブジェクト内の実装の詳細を可能な限り隠します。平たく言えば、クラスのメンバー変数をプライベート化し、これらのメンバー変数にアクセスするためのパブリックメソッドを提供することを意味します。
データの隠蔽: メンバー変数がプライベート メンバーとして宣言されている場合、外部クラスを介して直接アクセスすることはできないため、メンバー変数はクラス内に隠蔽されます。このため、カプセル化はデータ隠蔽とも呼ばれます。
JavaBean は、適切なカプセル化仕様を規定する仕様であり、そのクラスが仕様に準拠している限り、それは JavaBean と呼ばれます。
次の特徴があります:
データメンバー (オブジェクトメンバー) は private によって変更される必要があります。
各オブジェクトメンバーにパブリックセッター/ゲッターメソッドを提供します
セッター/ゲッターのプロトタイプは次のようにする必要があります:
public void set 成员名(成员类型 arg);public 成员类型 get 成员名();
class Person{ // 将成员的访问权限设置为 public,这也为意味这谁都访问到它 public String name; public int age; }public class Test{ public static void main(String[] args) { Person person = new Person(); //通过类,我们可以直接操作成员变量 person.name ="kobe"; person.age =1000; //直接获得成员变量的值 System.out.println(person.name+"-"+person.age); } }
次に、上記のクラスをカプセル化します:
class Person { //1.将成员变量私有化,这样一来外部就不能直接访问到它们 private String name; private int age; //2.提供公共的方法来操作成员变量 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 Test { public static void main(String[] args) { Person person = new Person(); // 不能直接访问成员变量,而是通过提供的公共方法来设置/获取成员变量的值 person.setName("kobe"); person.setAge(1000); System.out.println(person.getName() + "-" + person.getAge()); } }
これまで、カプセル化されたオブジェクトとカプセル化されていないオブジェクトの一般的な違いを見てきました:
class Person { private String name; private int age; private int city; //对于 name 的控制,直接取消了 setter 方法,这样外部只能访问,而不能设置 name 的值 public String getName() { // 直接返回值 return "kobe"; } public int getAge() { return age; } // 有两个 setter 方法,可以接收 int,String 类型的参数 public void setAge(int age) { this.age = age; } public void setAge(String age) { // 对参数值进行验证,默认只能输入数字 if(age.matches("[0-9]")){ this.age = Integer.valueOf(age); }else{ System.out.println("Error:年龄只能为数字"); } } // 在日常开发,我们一般会将文字转换成编码在数据库存储,因此在存储调用时就要做转换 public String getCity() { switch (city) { case 001: return "北京"; default: return "上海"; } } public void setCity(String city) { if("北京".equals(city)){ this.city = 001; }else if("上海".equals(city)){ this.city = 002; }else{ System.out.println("Error:没有找到该城市"); } } }public class Test { public static void main(String[] args) { Person person = new Person(); person.setAge("a"); //Error:年龄只能为数字 person.setAge(1000); //既可以接收 String 类型,也可以接收 int 类型 person.setCity("广州"); //Error:没有找到该城市 person.setCity("北京"); //此时已经被转换成 001 存储了 //在访问 city 成员变量时,001 又被转换成 北京 显示 System.out.println(person.getName()+"-"+person.getAge()+"-"+person.getCity()); } }
上記のコードを通じて、カプセル化の役割を大まかに要約できます: