Java の改善 第 1 章-----Java の 3 つの主要な特徴のカプセル化を理解する

黄舟
リリース: 2017-02-09 13:27:32
オリジナル
1141 人が閲覧しました

2年生の時にJavaに触れてから約3年が経ちました。最も基本的な HTML と CSS から最後の SSH まで、段階的に説明していきましたが、うれしかったり、がっかりしたり、寂しかったりしました。中途半端な僧侶ではあるが、自らの努力で「学問」を完成させた。この間、研修機関に参加しましたが、そのような研修方法があまり好きではなかったので、諦めて独学を選びました(かわいそうに6,000元も払いました) 独学はかなりの苦痛でしたが、それはもっと楽しかったし、努力と成果はあなた自身が知っているだけです。 Huang Tian は努力の甲斐あって、バカですが、4 年生の 1 学期にようやく Java を独学で修了し(途中、遠回りして半年無駄にしましたが)、いい就職をしました。ありがとうございました!

噂が多すぎる!話は変わりますが、LZは最近デザインパターンを読み終えたばかりで、感慨深いものがあります。そして、作業の過程で、Java の基礎が十分にしっかりしていないことを痛感します。たとえば、IO に詳しくなく、ガベージ コレクション、ポリモーフィズム、リフレクションが理解できず、最も基本的な 3 つの機能さえ混乱しています。自分!そこで、Java の基礎を補うことを決意しました。最初のレッスンから始めましょう!!!!!データは抽象データ型の内部で保護され、内部の詳細は可能な限り隠蔽され、外部と接続するための一部の外部インターフェイスのみが保持されます。システム内の他のオブジェクトは、データの外部にラップされた承認された操作を通じてのみ、このカプセル化されたオブジェクトと通信および対話できます。つまり、ユーザーはオブジェクトの内部詳細を知る必要はありません(もちろん知る方法はありません)が、ユーザーはオブジェクトが提供するインターフェースを通じてオブジェクトにアクセスできます。

カプセル化の場合、オブジェクトは独自のプロパティとメソッドをカプセル化するため、他のオブジェクトに依存せずに独自の操作を完了できます。大 パッケージングを使用することには 3 つの大きな利点があります:

1. 適切なパッケージングによりカップリングを減らすことができます。

2. クラス内の構造は自由に変更できます。

3. メンバーをより正確に制御できます。

4. 情報を非表示にし、詳細を実装します。两 まず第一に、2 つのカテゴリを見てみましょう:夫.java、妻.java

rrreereeeeee

上記 2 つの例から、夫の WIFE 参照が Getter() ではないことがわかります。 WIFE メソッドの Getter () AGE ではありません。理由としては、誰もが知っていることだと思いますが、男は妻を奥に隠しますし、女性は自分の年齢を他人に知られたくないものです。

したがって、カプセル化はオブジェクトのプロパティをプライベート化し、外部のメソッドからアクセスされたくない場合は、外部のアクセス用のメソッドを提供する必要はありません。ただし、クラスが外部アクセス用のメソッドを提供しない場合、このクラスは意味がありません。たとえば、ソファ、テレビシリーズ、エアコン、ティーテーブルなど、家の中にある美しい装飾品は家の私有財産です。しかし、それらの壁がなければ。ブロックしたら、他の人は一目でそれを見ることができますか? 何も残らない場合はどうなりますか?プライバシーはまったくありません!その遮蔽壁があれば、私たちは自分だけのプライバシーを確​​保でき、他人に影響を与えることなく室内の家具を自由に変更できます。しかし、ドアや窓がない場合、しっかりと包まれた黒い箱には何の意味があるのでしょうか?そのため、他人もドアや窓を通して室内の景色を見ることができます。したがって、ドアと窓は、アクセスのために外界に残された家オブジェクトのインターフェイスです。

これでは、カプセル化の利点を実際に理解することはできません。ここで、プログラムの観点からカプセル化の利点を分析します。カプセル化を使用しない場合、オブジェクトには setter() と getter() がありません。その場合、夫クラスは次のように記述する必要があります:

public class Husband {  
      
    /* 
     * 对属性的封装 
     * 一个人的姓名、性别、年龄、妻子都是这个人的私有属性 
     */  
    private String name ;  
    private String sex ;  
    private int age ;  
    private Wife wife;  
      
    /* 
     * setter()、getter()是该对象对外开发的接口 
     */  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public String getSex() {  
        return sex;  
    }  
  
    public void setSex(String sex) {  
        this.sex = sex;  
    }  
  
    public int getAge() {  
        return age;  
    }  
  
    public void setAge(int age) {  
        this.age = age;  
    }  
  
    public void setWife(Wife wife) {  
        this.wife = wife;  
    }  
}
ログイン後にコピー

次のように使用する必要があります:

public class Wife {  
    private String name;  
    private int age;  
    private String sex;  
    private Husband husband;  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public String getSex() {  
        return sex;  
    }  
  
    public void setSex(String sex) {  
        this.sex = sex;  
    }  
  
    public void setAge(int age) {  
        this.age = age;  
    }  
  
    public void setHusband(Husband husband) {  
        this.husband = husband;  
    }  
  
    public Husband getHusband() {  
        return husband;  
    }  
      
}
ログイン後にコピー

しかし、必要に応じてその日夫を変更する場合、例えば年齢を変更する場合はString型に変更してみてはいかがでしょうか?このクラスを 1 か所でのみ使用するのは問題ありませんが、そのような場所が数十、さらには数百ある場合、クラッシュに変更しますか?カプセル化が使用されている場合は、変更を加える必要はありません。Housand クラスの setAge() メソッドをわずかに変更するだけです。 }

public class Husband {  
    public String name ;  
    public String sex ;  
    public int age ;  
    public Wife wife;  
}
ログイン後にコピー

他の場所は引き続き (husband.setAge(22)) を変更せずに参照しています。

到了这里我们确实可以看出,封装确实可以使我们容易地修改类的内部实现,而无需修改使用了该类的客户代码。

我们在看这个好处:可以对成员变量进行更精确的控制。

还是那个Husband,一般来说我们在引用这个对象的时候是不容易出错的,但是有时你迷糊了,写成了这样:

Husband husband = new Husband();  
husband.age = 300;
ログイン後にコピー

也许你是因为粗心写成了,你发现了还好,如果没有发现那就麻烦大了,逼近谁见过300岁的老妖怪啊!

但是使用封装我们就可以避免这个问题,我们对age的访问入口做一些控制(setter)如:

public class Husband {  
      
    /* 
     * 对属性的封装 
     * 一个人的姓名、性别、年龄、妻子都是这个人的私有属性 
     */  
    private String name ;  
    private String sex ;  
    private int age ;    /* 改成 String类型的*/  
    private Wife wife;  
  
    public int getAge() {  
        return age;  
    }  
  
    public void setAge(int age) {  
        if(age > 120){  
            System.out.println("ERROR:error age input....");    //提示錯誤信息  
        }else{  
            this.age = age;  
        }  
          
    }  
      
    /** 省略其他属性的setter、getter **/  
      
}
ログイン後にコピー

上面都是对setter方法的控制,其实通过使用封装我们也能够对对象的出口做出很好的控制。例如性别我们在数据库中一般都是已1、0方式来存储的,但是在前台我们又不能展示1、0,这里我们只需要在getter()方法里面做一些转换即可。

public String getSexName() {  
        if("0".equals(sex)){  
            sexName = "女";  
        }  
        else if("1".equals(sex)){  
            sexName = "男";  
        }  
        else{  
            sexName = "人妖???";  
        }  
        return sexName;  
    }
ログイン後にコピー

在使用的时候我们只需要使用sexName即可实现正确的性别显示。同理也可以用于针对不同的状态做出不同的操作。

public String getCzHTML(){  
        if("1".equals(zt)){  
            czHTML = "<a href=&#39;javascript:void(0)&#39; onclick=&#39;qy("+id+")&#39;>启用</a>";  
        }  
        else{  
            czHTML = "<a href=&#39;javascript:void(0)&#39; onclick=&#39;jy("+id+")&#39;>禁用</a>";  
        }  
        return czHTML;  
    }
ログイン後にコピー

       鄙人才疏学浅,只能领悟这么多了,如果文中有错误之处,望指正,鄙人不胜感激!

以上就是 java提高篇(一)-----理解java的三大特性之封装的内容,更多相关内容请关注PHP中文网(www.php.cn)!


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート