>  기사  >  Java  >  01.Java 기초 - 캡슐화

01.Java 기초 - 캡슐화

黄舟
黄舟원래의
2017-02-27 10:08:051239검색

기본 개념

Java 객체 지향에는 캡슐화, 상속, 다형성이라는 세 가지 주요 기능이 있습니다. 캡슐화와 상속은 기본적으로 다형성을 제공합니다.

캡슐화 : 객체의 속성과 동작(또는 서비스)을 독립적인 전체로 결합하고 구현 세부 사항을 객체 내부에 최대한 숨깁니다. 일반인의 관점에서 이는 클래스의 멤버 변수를 사유화하고 이러한 멤버 변수에 액세스할 수 있는 공용 메서드를 제공하는 것을 의미합니다.

데이터 숨기기: 멤버 변수가 private 멤버로 선언되면 외부 클래스를 통해 직접 접근할 수 없으므로 클래스 내부에 멤버 변수가 숨겨집니다. 이러한 이유로 캡슐화를 데이터 은닉이라고도 합니다.


다음과 같은 특징을 가지고 있습니다.

데이터 멤버(객체 멤버)는

private

으로 수정해야 합니다.

  • 각 객체 멤버에 대해 공개 setter/getter 메서드 제공

    setter/getter의 프로토타입은 다음과 같아야 합니다.
  • public void set 成员名(成员类型 arg);public 成员类型 get 成员名();

  • 예제 연구

1. 캡슐화되지 않은 & 캡슐화된

먼저 캡슐화되지 않은 멤버 변수를 살펴보겠습니다.
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());
    }
}
지금까지 캡슐화된 객체와 캡슐화되지 않은 객체의 일반적인 차이점을 살펴보았습니다.

캡슐화되지 않은 객체의 경우 , 멤버 변수에 직접 액세스/설정합니다

캡슐화된 객체의 경우 제공된 공용 메소드(예: getters/setters)를 통해 멤버를 조작해야 합니다. 변수
  • 2.
  • Encapsulation 제어 객체

  • 이대로라면 Encapsulation은 아무런 효과도 없는 것 같습니다. Encapsulation을 통해 객체를 제어하는 ​​방법을 살펴보겠습니다. :
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());
    }
}

위의 코드를 통해 캡슐화의 역할을 대략적으로 요약할 수 있습니다.

좋은 캡슐화는 결합을 줄일 수 있습니다.

클래스 내부 구조는 자유롭게 변경할 수 있습니다.
  • 을 통해 회원에 대한 보다 정확한 통제가 가능합니다.
  • 정보를 숨기고 세부정보를 구현합니다.
  • 참고자료


http://www.php.cn/java-article -351262.html

  • 위 내용은 01.Java Basics - Encapsulation의 내용이며, 보다 자세한 내용은 PHP 중국어 홈페이지(www.php. CN)!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.