Java學習筆記之面向對象、static關鍵字

一週Java學習總結

今天就總結理清一下關於面向對象和麪向過程的程序設計的一些不一樣特色,以及講下static關鍵字。html

面向對象

  • 如今接觸的Java是面向對象的,如今的程序開發幾乎都是以面向對象爲基礎的。我如今不看書,光靠回憶去想這個特性的解釋性語言,只能想到看書時很深入的一句話,面向對象就是一個更加具體描述一個事件的一種設計方法,就像在公司裏面吃飯,面向對象的話就是一個總負責人即相似大廚準備好菜譜什麼的,分工下去給下屬,每一個人負責一個菜,每一個人按照本身的祕方去完成,最後總的作出來造成一桌滿漢全席。哪個菜很差吃了,直接能夠找到那個負責的進行檢查。這樣的設計就能夠具有通用性和標準模塊化,效率有時會更高點。
  • 關於面向對象的程序設計三個特色:封裝性、繼承性、多態性。首先封裝性是把對象屬性、行爲當作一個密不可分的總體封裝在獨立單位中,一種信息隱蔽的特性其次是繼承性:父類與子類的表達與描述就是一種繼承性,擁有反映事物通常特性的類,在其基礎上派生出反映特殊事物的類。(類是由屬性和方法組成)最後是多態性,包括方法重載和對象多態。子類與父類能夠相互轉換,根據其使用的子類不一樣完成的功能也不一樣。
  • 類和對象是支撐起整個Java面向對象開發的基本概念單元。類其實是對象操做的模板,不能直接使用,要經過實例來使用。就像頭髮(類)藉助人(對象)來實現各式各樣的裝扮。

static關鍵字

「static方法就是沒有this的方法。在static方法內部不能調用非靜態方法,反過來是能夠的。並且能夠在沒有建立任何對象的前提下,僅僅經過類自己來調用static方法。這實際上正是static方法的主要用途。」——《Java編程思想》java

  • 先講static關鍵字並不會影響變量或者方法的做用域。與c/c++的static不一樣。在C/C++中static是能夠做用域局部變量的,可是在Java中切記:static是不容許用來修飾局部變量。c++

  • Java中的變量分爲成員變量和局部變量;局部變量還分爲三種:形參、方法內的局部變量、代碼塊內的局部變量(做用範圍看名字就能夠明白,如代碼塊內的,代碼塊結束後就開始失效消亡)。成員變量:類體內定義的變量,包括了非靜態變量又稱實例變量,和靜態變量又稱類變量。
  • static字面意思是靜態;可是在Java程序中,它是一個標誌,做用是將實例成員變爲類成員。並且只能修飾在類裏定義的成員部分,包括成員變量、方法,內部類、初始化塊。不用static去修飾類裏的這些成員,它們就屬於該類的實例。
    eg:static int num2 = 20;(這是一個類變量)
    eg: int num1 = 238;(實例變量)
  • static修飾的成員屬於類,類變量會隨着類初始化獲得初始化;而沒有static修飾的成員變量則屬於實例,實例變量隨着對象的初始化而初始化。由於在初始化以前一個對象以前,確定得先初始化該對象所屬的類,因此static修飾的時機確定較實例變量早。
  • static方法通常稱做靜態方法,不依賴任何對象就能夠進行訪問,所以對於靜態方法來講,沒有this的。注意在靜態方法中不能訪問非靜態成員方法和成員變量。以下圖
  • 這裏的printIn方法中調用getInfo()會出錯,由於靜態不能調用非靜態。裏面會報錯「Cannot make a static reference to the non-static method getInfo() from the type BookJava(603979977)」,這英文也很好理解。編程

在這裏插入圖片描述

下面插入一個例子,更好得去理解static

public class statictest {//考察這個代碼的打印狀況    
 //3 第三步    
 Person person = new Person("Test");    
 //這裏是第一個person參數:test 5運行完4後就開始經過構造器來生成對象,這裏Person沒有加載過,去找Person   
  static {    
  //3有static塊,直接運行這一步。因此一開始打印這一句        
        System.out.println("test static");    }
    public statictest() { 
                System.out.println("test constructor");
               //7打印第五句    }
    public static void main(String[] args) {
        //1主方法入口,第一先讀取這裏 
               new MyClass();  
             }
       }
class Person { 
        //6過來就運行static塊,打印第三句 
      static {  
               System.out.println("person static");
                }
    public Person(String str) {
            //6打印第一個參數test,第四句
                System.out.println("person " + str);
                    }}
class MyClass extends statictest { 
        //2繼承的是statictest類,因此先看上面的statictest
       Person person = new Person("MyClass");
                //8運行完stasictest,開始打印這裏的person
       static{ 
                //4加載statictest完,回來加載MyClass,發現static,直接第二步打印
            System.out.println("myclass static"); 
                }  
       public MyClass() {  
                System.out.println("myclass constructor"); 
               //9最後運行到這一步,打印出最後一句  
              }
           }
/*答案
test static
myclass static
person static
person Testtest 
constructorperson 
MyClassmyclass constructor
*/

借鑑網站/博客

博客園一位大佬模塊化

相關文章
相關標籤/搜索