Java學習 (十)、面向對象編程(二)封裝

来源:http://www.cnblogs.com/wzy330782/archive/2016/03/13/5272666.html
-Advertisement-
Play Games

面向對象三大特點:封裝、繼承、多態 封裝概念 ①   將東西包裝在一起,然後以新的完整形式呈現出來: 將方法和欄位一起包裝到一個單元中,單元以類的形式實現; ②   信息隱藏,隱藏對象的實現細節,不讓外部直接訪問到; ③   將數據和方法包裝進類中,加上具體實現的隱藏,共同被稱作封裝,其結果是一個同


面向對象三大特點:封裝、繼承、多態

封裝概念

①   將東西包裝在一起,然後以新的完整形式呈現出來:

將方法和欄位一起包裝到一個單元中,單元以類的形式實現;

②   信息隱藏,隱藏對象的實現細節,不讓外部直接訪問到;

③   將數據和方法包裝進類中,加上具體實現的隱藏,共同被稱作封裝,其結果是一個同時帶有特征和行為的數據類型;

④   定義類,定義其屬性、方法的過程稱為封裝類;

 

信息隱藏式OOP最重要的功能之一,也是使用訪問修飾符的原因;

信息隱藏的原因包括:

①   對模塊的任何實現細節所作的更改不會影響使用該模塊的代碼;

②   防止用戶意外修改數據;

③   是模塊易於使用和維護;

 

訪問修飾符

①   public:該類或非該類都均可訪問;

②   private:只有該類可以訪問;

③   protected:該類及其子類的成員可以訪問,同一個包中的類也可以訪問;

④   預設:同一包中的類可以訪問;

 

屬性封裝的實現

①   修改屬性的可見性來限制對屬性的訪問;

②   為每個屬性創建一對賦值(setter)方法和取值(getter)方法,用於公開對這些屬性的訪問介面;

③   在setter和getter方法中,根據需要加入對屬性操作的限制;

要點:除非必須公開底層實現細節,否則應該將所有屬性指定為private加以封裝;使用屬性封裝,通過增加數據訪問限制,增強了類的可維護性;

 

封裝方法的目的

①   隱藏方法實現細節(方法體),向外部提供公開介面(方法頭),以供安全;

②   簡化調用,方便修改維護;

③   根據需要,可以私有化方法以供類內部使用----幫助方法help;

 1 public class TeacherDemo
 2 {
 3     public static void main(String []agrs){
 4         Teacher t=new Teacher();
 5         //t.name="張三";//不能直接賦值
 6         t.setName("張三");
 7         System.out.println(t.getName());
 8         t.setAge(10);
 9         System.out.println(t.getAge());
10     }
11 }
12 
13 class Teacher
14 {
15     private String name;
16     private int age;
17     public void setName(String tname){
18         name=tname;
19     }
20     public String getName(){
21         return name;
22     }
23     public void setAge(int tage){
24         if(tage<25)
25         {
26             System.out.println("年齡太小了");
27             age=25;
28         }
29         else
30         {
31             age=tage;
32         }
33     }
34     public int getAge(){
35         return age;
36     }
37 }
View Code

 

類的構造方法的概念和作用

①   構造方法負責對象初始化工作,為對象的屬性賦合適的初始值;

②   創建對象時,其類的構造方法確保在用戶操作對象之前,系統保證初始化的進行;

構造方法的語法規則

①   構造方法名與類名相同

②   沒有返回類型

③   方法實現主要為欄位賦初值

構造方法的調用和特別:new操作符(返回新建實例的引用)

無參構造方法

 1 public class ConstructorDemo
 2 {
 3     public static void main(String []agrs){
 4         Person p=new Person();//實例化的時候是有初始值的int預設0,String預設null
 5         p.setName("張三");
 6         p.setAge(10);
 7         System.out.println(p.toString());
 8     }
 9 }
10 
11 //當一個類沒有顯示聲明一個構造方法時,系統會有一個預設的無參構造方法
12 class Person
13 {
14     private String name;
15     private int age;
16     private String city;
17     
18     //預設的構造方法,實例化時候會調用,此處不寫也可以,系統已預設寫好
19     public Person(){
20         System.out.println("Person");
21     }
22     
23 
24     public void setCity(String pcity){
25         city =pcity;
26     }
27     public String getCity(){
28         return city;
29     }
30     
31     public void setName(String pname){
32         name=pname;
33     }
34     public String getName(){
35         return name;
36     }
37     
38     public void setAge(int page){
39         age=page;
40     }
41     public int getAge(){
42         return age;
43     }
44     
45     public String toString()
46     {
47         return "名字:"+name+",今年"+age+"歲,家住"+city;
48     }
49 }
View Code

帶參構造方法

 1 public class ConstructorDemo
 2 {
 3     public static void main(String []agrs){
 4         //帶參調用,若不寫參數會報錯,因為Person中只有一個帶參的構造方法
 5         Person p=new Person("張三",10,"杭州");
 6         //1、在堆中開闢空間,給屬性分配預設的初始值
 7         //2、假設屬性一開始就賦值了,就進行賦值工作
 8         //3、調用構造方法對屬性進行初始化
 9         System.out.println(p.toString());
10     }
11 }
12 
13 class Person
14 {
15     private String name="李四";
16     private int age;
17     private String city;
18     
19     //帶參數的構造方法
20     public Person(String pname,int page,String pcity ){
21         name=pname;
22         age=page;
23         city=pcity;
24     }
25     
26     public void setCity(String pcity){
27         city =pcity;
28     }
29     public String getCity(){
30         return city;
31     }
32     
33     public void setName(String pname){
34         name=pname;
35     }
36     public String getName(){
37         return name;
38     }
39     
40     public void setAge(int page){
41         age=page;
42     }
43     public int getAge(){
44         return age;
45     }
46     
47     public String toString()
48     {
49         return "名字:"+name+",今年"+age+"歲,家住"+city;
50     }
51 }
View Code

 

this關鍵字

特點:

①在類的方法中使用的this關鍵字代表的是調用此方法的對象的引用;

②this可以看作是一個變數,它的值是當前對象的引用;

③使用this可以處理方法中的成員變數和形參同名的問題;

④當方法內需要用到調用該方法的對象時,就可以用this;

⑤在類的構造方法中可以調用this([參數列表])來調用該類的指定構造方法。

 1  public class ConstructorDemo
 2 {
 3     public static void main(String []agrs){
 4         Person p=new Person("張三",10,"杭州");
 5         System.out.println(p.toString());
 6     }
 7 }
 8 
 9 
10 class Person
11 {
12     private String name="李四";
13     private int age;
14     private String city;
15     
16     //構造方法
17     public Person(){
18         System.out.println("無參構造方法");
19     }
20     
21     //帶參數的構造方法
22     public Person(String name,int age,String city ){
23         
24         this();//表示調用當前對象的無參構造方法,必須寫在第一句
25         
26         //此處將形參名稱寫成age與屬性名相同
27         //age=age;//此處不會對屬性重新賦值age=0
28         this.age=age;//此處對屬性重新賦值age=10,this代表p    
29         this.name=name;
30         this.city=city;
31         
32     }
33     
34     public void setCity(String city){
35         this.city=city;
36     }
37     public String getCity(){
38         return city;
39     }
40     
41     public void setName(String name){
42         this.name=name;
43     }
44     public String getName(){
45         return name;
46     }
47     
48     public void setAge(int age){
49         this.age=age;
50     }
51     public int getAge(){
52         return age;
53     }
54     
55     public String toString()
56     {
57         //預設前面都是有this的,可寫可不寫
58         System.out.println(this.getAge());
59         return "名字:"+this.name+",今年"+age+"歲,家住"+city;
60     }
61 }
View Code

 

static關鍵字

特點:

①用來修飾類的成員----修飾成員變數的稱之為類變數(靜態變數),修飾成員方法的稱之為類方法(靜態方法);

②當類被載入時就會被載入,優先於對象的存在;

③用來修飾語句塊----稱之為靜態代碼塊。先於構造方法之前執行,只會執行一次,用來對靜態成員做初始化;

④靜態修飾的成員被所有的對象共用;

⑤調用的時候可以直接通過類名.成員來進行訪問

static關鍵字註意事項

①   靜態方法中只能訪問外部的靜態成員;

②   靜態方法中不能出現this;

 

非靜態

 1 public class StaticDemo
 2 {
 3     public static void main(String []agrs){
 4         Account acc1=new Account();
 5         acc1.number1++;
 6         acc1.showNumber1();
 7         acc1.showNumber2();
 8         
 9         Account acc2=new Account();
10         acc2.showNumber1();
11         acc2.showNumber2();
12     }
13 }
14 
15 class Account
16 {
17     public int number1=1;
18     public int number2=2;
19     public void showNumber1()
20     {
21         System.out.println(number1);
22     }
23     public void showNumber2()
24     {
25         System.out.println(number2);
26     }
27 }
View Code

靜態1

 1 public class StaticDemo
 2 {
 3     public static void main(String []agrs){
 4         Account acc1=new Account();
 5         acc1.number1++;
 6         acc1.showNumber1();
 7         //acc1.showNumber2();
 8         
 9         
10         Account acc2=new Account();
11         acc2.showNumber1();
12         //acc2.showNumber2();
13     }
14 }
15 
16 class Account
17 {
18     public static int number1=1;//靜態變數(類變數),它不屬於任何一個對象,被多個對象共用
19     public int number2=2;
20     public void showNumber1()
21     {
22         System.out.println(number1);
23     }
24     public void showNumber2()
25     {
26         System.out.println(number2);
27     }
28 }
View Code

靜態2

 1 public class StaticDemo
 2 {
 3     public static void main(String []agrs){
 4         Account.number1++;
 5         System.out.println(Account.number1);
 6         Account.showNumber1();
 7         
 8         Account acc1=new Account();
 9         acc1.showNumber2();
10         
11         Account acc2=new Account();
12         acc2.showNumber2();
13     }
14 }
15 
16 class Account
17 {
18     public static int number1=1;//靜態變數(類變數),它不屬於任何一個對象,被多個對象共用
19     public int number2=2;
20     //靜態方法中不能使用非靜態的變數
21     //靜態方法中不能使用this
22     public static void showNumber1()
23     {
24         //showNumber2();//報錯
25         System.out.println(number1);
26         //System.out.println(this.number2);//報錯 
27     }
28     
29     //非靜態的方法可以訪問靜態的內容和非靜態的屬性和方法
30     public void showNumber2()
31     {
32         showNumber1();
33         System.out.println(number2);
34         System.out.println("非靜態方法訪問靜態變數:"+number1);
35     }
36     
37     //構造方法
38     public Account(){
39         System.out.println("constructor");
40     }
41     
42     //static語句塊
43     //在類被載入時就會執行,只會執行一次,用來對靜態的變數賦值
44     //優先於構造方法執行
45     static{
46         System.out.println("static");
47         number1=100;
48     }
49 }
View Code

 

方法重載

多數程式設計語言要求為每個方法(函數)提供一個獨一無二的方法名,不存在方法重載的概念

在Java中,規定方法簽名是解析方法的規則而不是方法名,為方法重載開創了條件

方法重載使得在一個類中,方法名相同而參數列表不同的方法可同時存在,代表相似的行為和功能

 

重載overload概念:同一類中,同名不同參的方法稱為重載方法

註意:僅有返回類型不同的方法不能稱為重載,即方法重載必須方法簽名不同

 1 public class OverloadDemo{
 2     public static void main(String []agrs){
 3         Printer p=new Printer(2000);
 4         p.print("hello");    
 5         p.print(10);
 6         p.print("hello",10);
 7     }
 8 }
 9 
10 class Printer{
11     private String brand="聯想";
12     private double price;
13     
14     public Printer(double price){
15         this.price=price;
16     }
17     
18     public Printer(String brand,double price){
19         this.brand=brand;
20         this.price=price;
21     }
22 
23     public void print(String content){        
24         System.out.println("字元串"+content);
25     }
26     
27     public void print(int content){        
28         System.out.println("整型"+content);
29     }
30     
31     public void print(String str,int content){        
32         System.out.println(str+"--"+content);
33     }
34     
35     public int print(int content,double d){        
36         return content;
37     }
38 }
View Code

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • atitit.RandomAccessFile rws rwd 的區別於聯繫   1. Rw rws  rwd1 2. "rws" 模式1 3. rwd"模式2       "r"    以只讀方式打開。調用結果對象的任何 write 方法都將導致拋出 IOException。  "rw" 
  • 要深入瞭解ClassLoader,首先就要知道ClassLoader是用來乾什麼的,顧名思義,它就是用來載入Class文件到JVM,以供程式使用 的。我們知道,java程式可以動態載入類定義,而這個動態載入的機制就是通過ClassLoader來實現的,所以可想而知ClassLoader的重 要性如何
  • 初學JAVA做一些總結,有說的不對的地方希望大家多多指教。 如果能給同樣帶有迷惑的同學帶來幫助,是很開森的一件事情。 剛學JAVA的時候肯定會碰到這三個環境變數的設定,往往總是知其然不知其所以然, 按照說明做完了卻不知道為什麼這麼做,這裡簡單做一些總結說明。 首先,什麼是環境變數 環境變數是指在操作...
  •        參考文檔:              1、金角大王博客:http://www.cnblogs.com/alex3714/articles/5188179.html              2、銀角大王博客:http://www.cnblogs.com/wupeiqi/articles
  • 1、 對JButton大小的設置        button.setPreferredSize(new Dimension(30,30));      //(30,30) 是你要設置按鈕的大小 2、 對JButton透明的設置       button.setContentAreaFilled(fa
  • 打包的意義: ①   標準Java庫是由一系列包組成,包括java.lang,java.util,java.net等。標準Java包就是層次型包結構,就如同硬碟上嵌套的子目錄一樣,我們可以使用嵌套層次結構來組成包; ②   Java的包是為了更好地規劃代碼,防止命名衝突和混亂。所以Java出現了打包
  • 基本思想:使用getline函數從TXT文件中依次讀出中綴表達式,將其轉為尾碼表達式後計算結果,並與用戶結果比對。 整數、分數、小數的處理:將小數和整數都視為預設分母為1的分數.建立分數類,在中綴轉換成尾碼時將整數和小數轉換為分數. 關於求最大公約數所使用的輾轉相除法在上一篇博文中已經寫過。為了之後
  • 猜字母程式=數據結構+演算法 首先:定義數據結構1.找名詞Input:輸入變數Output:輸出變數隱含:找到隱含的變數,如字元串 其次:定義演算法,程式的處理 最後:按照順序,逐步實現 註意:1.基本數據類型作為參數傳遞時,會複製一份新的變數,所以方法內的參數不會影響到方法外的變數2.數組作為參數傳遞
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...