今日はアクセス制御についてお話します
アクセス制御とは何ですか?
アクセス制御は、JAVAの制御クラスの外部にあるプログラムであり、クラスのメンバーにアクセスできます。
クラスのメンバー変数に外部からアクセスできるかどうかを尋ねる人もいるかもしれません。実際にはありません。
これは実際と同じです。銀行カードのカード番号とパスワード、銀行通帳の残高、女の子の体重、女の子の年齢など、一般に公開できない属性が多数あります。
同じことがJAVAにも当てはまります。私たちのクラスのメンバーは、外の世界から簡単にアクセスされたり、外の世界によって破壊されたりしてはなりません。
JAVAでのクラスカプセル化メンバーの使用は、メンバーをまとめて格納するという単純な目的だけでなく、これらのメンバーを保護することをより重要な目的としています。
JAVAの4つの保護レベル
1つ目は公的で、パブリックレベルが最もオープンです。つまり、簡単にアクセスできる制限はありません
。2つ目は、プライベート、パブリックです。反対に、プライベート、つまり完全なプライバシー、外の世界には完全にアクセスできません。
3番目のタイプは保護されており、特に親クラスと子クラス間の継承に使用されます。4
番目のタイプはデフォルトの制御レベルです。
アクセス制御
アクセス制御について話す前に、まずパッケージについて話しましょう。では、パッケージとは何ですか?
包(package)
・ハードディスク上では、パッケージは複数のクラス(.class)が格納されているフォルダです。
・プログラムでは、クラス名の競合の名前空間を避けるために、複数のクラス名が編成されています。
パッケージの機能は、グループ化とクラス定義を管理し、クラス名を回避する競合
・Javaソースコードの最初の行では、現在のクラスが属するパッケージ名が一般的に指定されています。
・構文:
・パッケージパッケージ名。これらの中で、すべての文字は小文字にすることをお勧めします。
・実際、Javaでのクラスのフルネームは、パッケージ名、クラス名のようになります。-
例:
・Java規則:
-クラスの.classファイルは、クラスで指定されたパッケージ名フォルダーに保存する必要があります。
-同じ名前の2つのクラスを同じパッケージに保存することはできません
パッケージステートメント
パッケージ名は、階層構造にすることもできます。マルチレイヤーパッケージ名、構文を定義します。
- packageトップレベルのパッケージ名。サブレベルのパッケージ名... nレベルのパッケージ名;
-指示、パッケージ名の各レベルは「。」で接続されます。
-package名の階層とフォルダ階層に完全に対応し
たマルチレイヤパッケージ名の一般的な仕様:パッケージの会社や組織のドメイン名、プロジェクト名機能モジュール名。
例:
org.apache.commons.lang
org.apache会社のドメイン名
コモンズプロジェクト名
lang汎用モジュール
別の例:Tencentは学生管理システムを実行する必要があります。コース管理汎用モジュールが含まれています:
com.tencent .studentmgt .coursemgt
インポートステートメント
・クラスにアクセスする際は、クラスのフルネームを使用する必要があります。フルネームを記述しない場合、クラス名のみが使用され、デフォルトでは現在のパッケージでのみ検索されます。
例:スキャナークラス、実際にはフルネーム:java.util.Scanner
java.util.Scanner sc=new java.util.Scanner(System.in);
//编译正确。但是太繁琐
クラスのフルネームは、最初にimportステートメントの構文で導入できます。
- インポートクラスの完全修飾名;-
完全修飾名:はパッケージ名です。クラス名
クラスのフルネームがimportステートメントを介して導入された後、現在のソースファイルのクラス名のみを使用してアクセスできます。
次に例を示します。
import java util. Scanner;
Scanner sc=new Scanner(System.in);
//编译正确。因为已经导入了完全限定的类名
次に、トピックに直接移動して、アクセス制御修飾子を学習します
アクセス制御修飾子
カプセル化の意味
フルーツショップの機能は、積み込み、梱包、計量、支払いの受け取りなどにすぎません。
現在、フルーツショップには2つのビジネスモデルがあります。
A:上司が店主を務め、お客様は果物を自由に取り、計量し、自由に変更を求めます。
B:上司は、クライアントが果物を取り出し、梱包し、変更するのを手伝います。
最初のビジネスモデルは間違いなく機能しません。午前中に開き、午後に閉じる可能性があります。
カプセル化の意味
呼び出し可能で安定した関数を外部に提供します。
特定の内部実装の詳細をカプセル化し、外部からアクセスできません。これの利点は次のとおりです
。-エラーの可能性を減らし、メンテナンスを容易にします。-内部の
変更は外部の使用に影響しません。
パブリックとプライベート
●プライベートで変更されたメンバーは、このクラスのメンバーメソッドでのみ使用でき
ます。●通常、クラスのメンバー変数は、プライベートを使用して厳密に制御する必要があります。クラスが提供するメソッドを介してのみアクセスできます。
●プライベートモディファイドメンバーは社内専用です。「パブリック」の場合、メンテナンスコストが大幅に増加します。
●公開変更メンバーはどこでも使用できます。
●すべての外部メンバーメソッドは、非常に堅牢で安定している必要があります
フルーツショップの属性と機能をカプセル化するクラス
package day07;
/**
* 封装水果店属性和功能的类
*/
public class Shop {
double buying=5.5; //水果的进价5块5一斤
double price=8; //销量8块一斤
double total; //销售量(斤数)
/**
* 卖水果的方法
* money 多少钱
* count 多少斤
*/
void sale(double money,double count){
//累加销量量
total+=count;
//输出本次购买的结果
System.out.println("您购买的水果"+count
+"斤水果,收您"+money
+"元,找零"+(money-price*count));
}
}
まず試してみましょう。果物を買いに来店した顧客は、まず購入価格を見てから販売価格を見て、販売価格が高すぎると感じたので、怒って販売価格を0.01元に変更します。 。百元を与える。
package day07;
public class Test {
public static void main(String[] args) {
Shop s=new Shop();
//加入一个顾客来买水果,先看了进价5.5元
System.out.println(s.buying);
//又看了看售价8元
System.out.println(s.price);
//他愤怒的把售价price改成为0.01
s.price=0.01;
//再调用sale方法
s.sale(100,10);
}
}
上記のケースは、私たちの購入価格が人に簡単に見られたり変更されたりすることができないことを示していますが、この問題を解決するにはどうすればよいですか?
購入価格が表示されず、販売価格も変更できないようにコードを変更して、プライベートを追加する必要があります。
package day07;
/**
* 封装水果店属性和功能的类
*/
public class Shop {
private double buying=5.5; //水果的进价5块5一斤
private double price=8; //销量8块一斤
double total; //销售量(斤数)
/**
*专门读取price属性的方法
* 相当于老板可以告诉客人,这水果多少钱,但是客人不知道
* @return
*/
public double getBuying() {
return buying;
}
public double getPrice() {
return price;
}
/**
* 卖水果的方法
* money 多少钱
* count 多少斤
*/
void sale(double money,double count){
//累加销量量
total+=count;
//输出本次购买的结果
System.out.println("您购买的水果"+count
+"斤水果,收您"+money
+"元,找零"+(money-price*count));
}
}
プライベート暗号化を変更した後、それを読み取ったり変更したり
することはできず、getメソッドでのみ呼び出すことができることがわかりました
package day07;
public class Test {
public static void main(String[] args) {
Shop s=new Shop();
//加入一个顾客来买水果,先看了进价5.5元
//System.out.println(s.buying);
System.out.println(s.getBuying());
//又看了看售价8元
//System.out.println(s.price);
System.out.println(s.getPrice());
//他愤怒的把售价price改成为0.01
// s.price=0.01; 已经无法修改
//再调用sale方法
s.sale(100,10);
}
}
しかし、上記のコードはまだ完全ではありません。たとえば、ユーザー入力の購入金額が0未満の場合はどうなりますか?たとえば、ユーザー金額が支払い金額より少ない場合はどうなりますか?
次に、このコードの変更と改善を続けます。
package day07;
/**
* 封装水果店属性和功能的类
*/
public class Shop {
private double buying=5.5; //水果的进价5块5一斤
private double price=8; //销量8块一斤
double total; //销售量(斤数)
/**
*专门读取price属性的方法
* 相当于老板可以告诉客人,这水果多少钱,但是客人不知道
* @return
*/
public double getBuying() {
return buying;
}
public double getPrice() {
return price;
}
/**
* 卖水果的方法
* money 多少钱
* count 多少斤
*/
void sale(double money,double count){
/*公开的方法,要放出错*/
if (money< 0 || count <=0){
//数量<=0
System.out.println("购买的数量和钱必须>0");
}else if (money<price*count){
//钱给的不够
System.out.println("你的钱不够");
}else{
//正常执行逻辑
//累加销量量
total+=count;
//输出本次购买的结果
System.out.println("您购买的水果"+count
+"斤水果,收您"+money
+"元,找零"+(money-price*count));
}
}
}
変更によると、コードロジックが正常に実行されていることがわかります
package day07;
public class Test {
public static void main(String[] args) {
Shop s=new Shop();
//加入一个顾客来买水果,先看了进价5.5元
//System.out.println(s.buying);
System.out.println(s.getBuying());
//又看了看售价8元
//System.out.println(s.price);
System.out.println(s.getPrice());
//他愤怒的把售价price改成为0.01
// s.price=0.01; 已经无法修改
//再调用sale方法
s.sale(50,10); //付款50元,应付款80元,钱不够
s.sale(-10,10);//付款-10元,购买的数量和钱必须>0
}
}
保護されたデフォルトのアクセス制御
●デフォルトのアクセス制御のメンバー(修飾子を記述しない)は、同じパッケージでのみ使用できます。
●保護された変更されたメンバーは、同じパッケージのクラスとサブクラスで使用できます。
ライフケース:バオは私たちの現実、私たちのコミュニティのようなものであり、ショップカテゴリは私たちのコミュニティのフルーツショップのようなものです。デフォルトでは、このコミュニティの人々だけがそれを知っており、他のコミュニティの人々は知りません。
パブリックボイドセール(ダブルマネー、ダブルカウント){
他のコミュニティの人々に、このコミュニティに果物屋があることを知ってもらいたい場合はどうなりますか?実際には、上司がコミュニティの門に大きな看板を設置します。一般の人はこの看板とまったく同じです。通りすがりの人はそれを見て電話をかけることができます。
他のコミュニティの人々に、このコミュニティに果物屋があることを知ってもらいたい場合はどうなりますか?実際には、上司がコミュニティの門に大きな看板を設置します。一般の人はこの看板とまったく同じです。通りすがりの人はそれを見て電話をかけることができます。
package day07;
/**
* 封装水果店属性和功能的类
*/
public class Shop {
private double buying=5.5; //水果的进价5块5一斤
private double price=8; //销量8块一斤
double total; //销售量(斤数)
/**
*专门读取price属性的方法
* 相当于老板可以告诉客人,这水果多少钱,但是客人不知道
* @return
*/
public double getBuying() {
return buying;
}
public double getPrice() {
return price;
}
/**
* 卖水果的方法
* money 多少钱
* count 多少斤
*/
public void sale(double money,double count){
/*公开的方法,要放出错*/
if (money< 0 || count <=0){
//数量<=0
System.out.println("购买的数量和钱必须>0");
}else if (money<price*count){
//钱给的不够
System.out.println("你的钱不够");
}else{
//正常执行逻辑
//累加销量量
total+=count;
//输出本次购买的结果
System.out.println("您购买的水果"+count
+"斤水果,收您"+money
+"元,找零"+(money-price*count));
}
}
}
新しいパッケージを作成し、新しいテストを作成します
package day08;
import day07.Shop;//导入day7中的Shop类
public class Test {
public static void main(String[] args) {
Shop s = new Shop();
s.sale(100,10);
}
}
メソッドにパブリックを追加した後、近隣のコミュニティも購入できることがわかります
今回は、本店と同じ属性・方法で近隣コミュニティに支店を開設しました。
package day07;
/**
* 封装水果店属性和功能的类
*/
public class Shop {
private double buying=5.5; //水果的进价5块5一斤
private double price=8; //销量8块一斤
double total; //销售量(斤数)
/**
*专门读取price属性的方法
* 相当于老板可以告诉客人,这水果多少钱,但是客人不知道
* @return
*/
public double getBuying() {
return buying;
}
public double getPrice() {
return price;
}
/**
* 卖水果的方法
* money 多少钱
* count 多少斤
*/
protected void sale(double money,double count){
/*公开的方法,要放出错*/
if (money< 0 || count <=0){
//数量<=0
System.out.println("购买的数量和钱必须>0");
}else if (money<price*count){
//钱给的不够
System.out.println("你的钱不够");
}else{
//正常执行逻辑
//累加销量量
total+=count;
//输出本次购买的结果
System.out.println("您购买的水果"+count
+"斤水果,收您"+money
+"元,找零"+(money-price*count));
}
}
}
支店を開く
package day08;
import day07.Shop;
/**
* 开了一个分店
*/
public class SubShop extends Shop {
/**
* 重写父类的sale方法,使用super调用父类的sale方法
* JAVA中规定,子类重写父类的方法,子类中的方法访问控制范围不能小于父类方法的控制范围
*/
protected void sale(double money,double count){
super.sale(money,count);
}
}
テスト:
package day08;
public class Test {
public static void main(String[] args) {
SubShop ss= new SubShop();
ss.sale(100,10);//100块,10斤
}
}