面向對象的封裝, 構造器, this

當咱們建立一個對象的時候,咱們能夠經過‘對象、屬性’的方式,對對象的屬性進行賦值。 這裏賦值操做要受到屬性的數據類型和存儲範圍的制約,可是除此以外,沒有其餘制約條件。 可是實際問題中咱們須要給這個屬性賦值加入額外的限制條件這個額外條件就不能在屬性的聲明時體現,咱們只能經過方法來進行限制條件的添加java

 

 

 

爲何要用封裝呢? 封裝的含義是什麼?

 爲何須要封裝?封裝的做用和含義?  我要用洗衣機,只須要按一下開關和洗滌模式就能夠了。有必要了解洗衣機內 部的結構嗎?有必要碰電動機嗎?  我要開車,…
    咱們程序設計追求「高內聚,低耦合」。
    高內聚 :類的內部數據操做細節本身完成,不容許外部干涉;
    低耦合 :僅對外暴露少許的方法用於使用。  隱藏對象內部的複雜性,只對外公開簡單的接口。便於外界調用,從而提 高系統的可擴展性、可維護性。通俗的說,把該隱藏的隱藏起來,該暴露 的暴露出來。這就是封裝性的設計思想。

 

 

 

信息的封裝和隱藏python

Java中經過將數據聲明爲私有的(private),再提供公共的(public) 方法:getXxx()和setXxx()實現對該屬性的操做,以實現下述目的: 
  隱藏一個類中不須要對外提供的實現細節;
  使用者只能經過事先定製好的方法來訪問數據,能夠方便地加入控制邏輯, 限制對屬性的不合理操做;
  便於修改,加強代碼的可維護性;

 

 

private :私有的。當對屬性加入這個條件的時候就不能直接調用這個方法了編程

public class fz { public static void main(String[] args) { Anim ani =new Anim(); //ani.age=17;// 由於下面的年齡屬性已經設置爲私有的了 就不能夠直接進行調用否則就以報錯
        ani.setAge(13); // 設置年齡只能經過它內部提供的方法
        ani.name = "旺財"; ani.info(); //名字是: 旺財,age: 13
        System.out.println(ani.getAge());  // 經過內部的獲取方法
 } } class Anim{ private int age;   // 給年齡加上限制條件
 String name; public void setAge(int num){ if(num < 0){ System.out.println("很差意思年齡不能夠小於0"); }else{ age = num; } } public void info(){ System.out.println("名字是: "+name+"age: "+age); } public int getAge(){   // 對外部提供一個獲取的方法
        return age; } }

封裝代碼性的體現:數組

  

    1: 咱們將類的屬性和方法私有化(private)同時,提供了(public)方法來獲取(get/set)來獲取或者設置此屬性的值      2: 不對外暴漏的私有化的方法      3: 單利模式      。。。。。。 諸如此類 有多種

 

 

封裝行性的體現:ide

一、private    二、不對外暴漏私有化方法  三、單例模式學習

 

封裝的體現須要權限修飾符來配合:測試

java的4種權限(從小到大):private、缺省(什麼都不寫)、protected、publicthis

這4種權限均可以用來修飾類的內部結構:屬性、方法、構造器、內部類spa

  

修飾類 : 只能使用缺省和public

 

 

 

 練習:設計

建立程序,在其中定義兩個類:Person和PersonTest類。定義以下: 用setAge()設置人的合法年齡(0~130),用getAge()返回人的年齡。 在PersonTest類中實例化Person類的對象b,調用setAge()和 getAge()方法,體會Java的封裝性。
public class Order { public static void main(String[] args) { PersonTest pt = new PersonTest(); pt.info(17); System.out.println(pt.getinfo()); } } class PersonTest{ Person1 per = new Person1(); public void info(int num){ per.setAge(num); } public String getinfo() { return per.getAge(); } } class Person1{ private int age; public void setAge(int num){ if(num >= 0 && num <=130 ){ age = num; }else{ System.out.println("您輸入的年齡不合法"); } } public String getAge(){ return "您輸入的年齡是:"+age; } }

 

 

構造器:

其實咱們以前就接觸了構造器只不過是你們不清楚

Person per = new Person()   // 後面的Person()這個部分就是構造器

 

構造器的特徵

它具備與類相同的名稱 它不聲明返回值類型。(與聲明爲void不一樣) 不能被static、finalsynchronizedabstract、native修飾,不能有 return語句返回值

 

 

構造器的做用:

  建立對象,給對象初始化。  也就是構造器一步實現了。python中的__new__和__init__  方法

 

構造器的做用:建立對象;給對象進行初始化 如:Order o = new Order(); Person p = new Person(「Peter」,15); 如同咱們規定每一個「人」一出生就必須先洗澡,咱們就能夠在「人」的 構造器中加入完成「洗澡」的程序代碼,因而每一個「人」一出生就會自 動完成「洗澡」,程序就沒必要再在每一個人剛出生時一個一個地告訴他們 要「洗澡」了。

 

說明:

  

若是沒有現實構造器的話 系統默認提供一個空參數的構造器 構造器格式: 權限修飾符 類名(形參列表){}
  語法格式:
修飾符 類名 (參數列表) {
初始化語句;
}


eg: public person(){} //這就是一個簡答的構造器

 在實例化類的時候就調用了 這個類的中的默認的構造器,一旦咱們定義了構造器系統就再也不提供默認的空參數構造器

 

 構造器的執行:當咱們在實例化對象的時候 執行new就去調用了構造器

 

 

構造器重載

構造器通常用來建立對象的同時初始化對象。如 
  
    class Person{
         String name;
         int age;
         public Person(String n , int a){
                  name=n; age=a;
          }
         }
 構造器重載使得對象的建立更加靈活,方便建立各類不一樣的對象。 構造器重載舉例:
  
  public class Person{
        public Person(String name, int age, Date d) {this(name,age);…}
  
        public Person(String name, int age) {…}
  
        public Person(String name, Date d) {…}
  
        public Person(){…}
        }
 構造器重載,參數列表必須不一樣

 

 

注意:

Java語言中,每一個類都至少有一個構造器 默認構造器的修飾符與所屬類的修飾符一致 一旦顯式定義了構造器,則系統再也不提供默認構造器 一個類能夠建立多個重載的構造器 
父類的構造器不可被子類繼承

 

 

 

 

練習:

1. 在前面定義的Person類中添加構造器,利用構造器設置全部人的age屬 性初始值都爲18。 2. 修改上題中類和構造器,增長name屬性,使得每次建立Person對象的同 時初始化對象的age屬性值和name屬性值。

 

 

編寫兩個類,TriAngle和TriAngleTest,其中TriAngle類中聲明私有的底 邊長base和高height,
同時聲明公共方法訪問私有變量。此外,提供類 必要的構造器。另外一個類中使用這些公共方法,計算三角形的面積。

 

this關鍵字

 

在Java中,this關鍵字比較難理解,它的做用和其詞義很接近。  它在方法內部使用,即這個方法所屬對象的引用;  它在構造器內部使用,表示該構造器正在初始化的對象。  this 能夠調用類的屬性、方法和構造器  何時使用this關鍵字呢?  當在方法內須要用到調用該方法的對象時,就用this。 具體的:咱們能夠用this來區分屬性和局部變量。 好比:this.name = name;

 

 

 

 

this關鍵字的使用:

用來修飾 屬性、方法、 構造器

this理解爲當前對象

eg:你們在給對象中的屬性賦值的時候你的形參和當前的屬性名同樣的話 會被覆蓋 會默認行參給行參傳遞參數,那麼就須要用到this關鍵字了

 

一般狀況下咱們都選擇省略this,若是方法的形參和屬性同名時,咱們必須顯示使用this方法聲明此變量是屬性而非行參

咱們能夠經過this在另一個方法中調用另一個方法

public PersonTest(int a, String name){ this.getAge(); // 經過this來調用其餘方法 this.name =name; age = a; }

 

屬性賦值的前後順序:

  

1: 默認初始化 2: 顯示初始化 3: 構造器中賦值 4: 經過對象.屬性的方式 以上操做的前後順序 1--2--3--4

 

 

 

 

 

 

 

 

this調用構造器 :

當調用構造器的時候直接this(行參列表);來調用本類的指定的構造器; 構造器中不能經過this(行參列表);的方式調用本身,只能調用別的構造器
this(行參列表);必須聲明在當前構造器的首行,(一個構造器內部只能有一個this調用其餘的構造器)
 

 

 

 

 

 

 

 

 

 

注意:

能夠在類的構造器中使用"this(形參列表)"的方式,調用本類中重載的其 他的構造器!  明確:構造器中不能經過"this(形參列表)"的方式調用自身構造器  若是一個類中聲明瞭n個構造器,則最多有 n - 1個構造器中使用了 "this(形參列表)""this(形參列表)"必須聲明在類的構造器的首行!  在類的一個構造器中,最多隻能聲明一個"this(形參列表)"

 

 

練習:

 

public class lx { public static void main(String[] args) { Gol gol = new Gol("梁山伯",23); gol.shout(); Girl girl = new Girl("朱麗葉", 38); girl.merry(gol); girl.compare(girl); } } class Gol{ private int age; private String name; public Gol(){ } public Gol(String name){ this.name = name; } public Gol(String name, int age){ this.name = name; this.age = age; } public void setAge(int age){ this.age = age; } public void setName(String name){ this.name = name; } public int getAge(){ return age; } public String getName(){ return name; } public void merry(Girl girl){ System.out.println("我想娶:"+girl.getName()); } public void shout(){ if(this.age > 22){ System.out.println("你能夠娶合法登記了"); }else{ System.out.println("滾回去長大了再來"); } } } class Girl{ private int age; private String name; public Girl(){} public Girl(String name){ this.name = name; } public Girl(String name, int age){ this.name = name; this.age = age; } public void setAge(int age){ this.age = age; } public void setName(String name){ this.name = name; } public int getAge(){ return age; } public String getName(){ return name; } public void merry(Gol gol){ System.out.println("我想嫁給:"+gol.getName()); gol.merry(this);  // 把當前對象傳遞進去
 } /** * */
    public void compare(Girl girl){ if(this.age >= girl.age){ System.out.println("你能夠嫁給他了"); }else{ System.out.println("不能夠你須要再談談戀愛"); } } }
View Code

 

 

 

Practice

一、寫一個名爲 Account 的類模擬帳戶。該類的屬性和方法以下圖所示。該類包括的屬性: 
  帳號 id,餘額 balance,年利率 annualInterestRate;包含的方法:訪問器方法(getter 和 setter 方法),
  取款方法 withdraw(),存款方法 deposit()。
  Account
  
  private int id
  private double balance
  private double annualInterestRate
  public Account (int id, double balance, double annualInterestRate )
  public int getId() public double getBalance()

  public double getAnnualInterestRate()

  public void setId( int id)

  public void setBalance(double balance)
   public void setAnnualInterestRate(double annualInterestRate)
   public void withdraw (double amount)//取錢 public void deposit (double amount)//存錢 提示:在提款方法 withdraw 中,須要判斷用戶餘額是否可以知足提款數額的要求,若是不 能,應給出提示。 2. 建立 Customer 類。 Customer   private String
firstName private

String lastName
private Account account
public Customer(String f,String l)
public String getFirstName()
public String getLastName()
public Account getAccount()
public void setAccount(Account account) a. 聲明三個私有對象屬性:firstName、lastName 和 account。
b. 聲明一個公有構造器,這個構造器帶有兩個表明對象屬性的參數(f 和 l)
c. 聲明兩個公有存取器來訪問該對象屬性,方法 getFirstName 和 getLastName 返回相應的屬 性。
d. 聲明 setAccount 方法來對 account 屬性賦值。
e. 聲明 getAccount 方法以獲取 account 屬性。
3.寫一個測試程序。
(1) 建立一個 Customer ,名字叫 Jane Smith, 他有一個帳號爲 1000,餘額爲 2000 元, 年利率爲 1.23% 的帳戶。
(2) 對 Jane Smith 操做。 存入 100 元,再取出 960 元。再取出 2000 元。 打印出 Jane Smith 的基本信息 尚

 

public class AprilFourAfternoonTestOne { public static void main(String[] args) { CustomerTestOne customerTestOne = new CustomerTestOne("Jane","Smith"); AccountTestOne accountTestOne = new AccountTestOne(01,200,0.0023); customerTestOne.setAccount(accountTestOne); customerTestOne.getAccount().deposit(100); customerTestOne.getAccount().withdraw(120); } } class AccountTestOne{ private  int id; private double balance;  // 餘額
    private double annualInterestRate;  // 年利率

    public void withdraw(double amount){ // 取錢
        if(amount <= 0){ System.out.println("取出的數額不合法"); }else if(amount > balance){ System.out.println("取出的數目不合法太大了"); }else{ balance -= amount; System.out.println("取出: "+amount+"當前餘額爲:" +balance); } } public void deposit(double amount){ if(amount > 0){ balance += amount; System.out.println("存入: "+amount+"當前餘額: "+balance); } } public AccountTestOne() { } public AccountTestOne(int id, double balance, double annualInterestRate) { this.id = id; this.balance = balance; this.annualInterestRate = annualInterestRate; } public int getId() { return id; } public void setId(int id) { this.id = id; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } public double getAnnualInterestRate() { return annualInterestRate; } public void setAnnualInterestRate(double annualInterestRate) { this.annualInterestRate = annualInterestRate; } } class CustomerTestOne{ private String firstName; private String lastName; private AccountTestOne account; public CustomerTestOne(String f, String l){ } public String getFirstName() { return firstName; } public String getLastName() { return lastName; } public AccountTestOne getAccount() { return account; } public void setAccount(AccountTestOne account) { this.account = account; } }
practice-one

 

 

1.按照以下的 UML 類圖,建立相應的類,提供必要的結構 

 

 
 

 

 在提款方法 withdraw()中,須要判斷用戶餘額是否可以知足提款數額的要求,若是不能, 應給出提示。deposit()方法表示存款。 2. 按照以下的 UML 類圖,建立相應的類,提供必要的結構 

 

 
 

 

3. 按照以下的 UML 類圖,建立相應的類,提供必要的結構 

 

 
 

 

  addCustomer 方法必須依照參數(姓,名)構造一個新的 Customer 對象,而後把 它放到 customer 數組中。還必須把 numberOfCustomer 屬性的值加 1。  getNumOfCustomers 方法返回 numberofCustomers 屬性值。 尚硅谷 Java 基礎編程 宋紅康  getCustomer 方法返回與給出的 index 參數相關的客戶。 4. 建立 BankTest 類,進行測試。

 

 

 

 

 

package關鍵字:

package關鍵字的使用:

 

1、爲了更好的實現項目中類的管理,提供包的概念 2、使用package聲明類或者接口屬性,聲明再源文件首行 同一個目錄下不能命名相同的接口或者是類

 

 

 

 

Practices

  1. 構造器的做用是什麼?使用 中有哪些注意點(>=3條)
1 :建立對象, 2: 初始化對象結構 使用: 在構造器中this只能調用其它的構造器不能調用當前構造器自己 2: this(形參列表) 聲明在構造器首行 3: 一個構造器中只能有一個this去調用其它構造器

 

2.關於類的屬性的賦值,有幾種賦值的方式。談談賦值的前後順序

默認初始化-顯式初始化-構造器中初始化-對象.方法 或 對象.屬性 給屬性賦值

3.this關鍵字能夠用來調用哪些結構,簡單說明一下其使用。

this:屬性、方法、構造器 this:理解爲當前對象,當前正在建立的對象

4. Java中目前學習涉及到的四種權限修飾符都有什麼?並說明各自的權限範圍

 

 

5. 建立Circle類,提供私有的radius屬性,提供相應的get和set方法,提供求圓面積的方法。

private double radius; public void setRadius(double radius){ this.radius = radius; } public double getRadius(){ return radius; } public double findArea(){ return 3.14 * getRadius() * radius; }

 

 

 

 

 

 

.

相關文章
相關標籤/搜索