前言編程
在編寫程序時不安全的初始化會致使程序發生發生重大錯誤。爲了使程序能夠被安全地初始化,C++引入了構造器(也能夠成爲構造方法)的概念,這是一個在建立對象時被自動調用的特殊方法。Java中也採用了構造器,而且提供了「垃圾回收器」。對於不在使用的內存資源,垃圾回收器能自動將其釋放。本篇文章主要介紹Java的構造方法以及匿名對象。安全
構造方法的定義語法與調用時機架構
什麼是匿名對象以及匿名對象的基本使用函數
構造方法的定義語法與調用時機學習
構造方法的定義語法:this
構造方法是在建立對象時被編譯器自動調用,因此編譯器應該知道構造方法的名字而後去調用它,爲構造方法任意取名均可能會與類的某個成員衝突。因而Java採用了同C++中同樣的方法: 構造方法採用與類相同的名稱 。代碼規範
在Java編程代碼規範中要求:「每一個方法首字母小寫」,構造方法與類名是徹底相同的,這個規範不適合構造方法,須要注意一下。視頻
構造方法通常定義爲以下三種方式:對象
class Student{ public Student(){ //① ... } ... } class Student{ Student(){ //② ... } ... } class Student{ private Student(){ //③ ... } ... }
以上三種構造方式涉及到了訪問權限的問題:blog
第①種方式,構造方法採用了public修飾表示該類的對象是能夠被不一樣包的其餘類建立。
第②種方式,默認爲包訪問屬性,僅限於同包的類能夠建立該類的對象。
第③種方式,使用private修飾使得構造方法對外不可見,該類的對象沒法被建立。多用來實現單例模式。
在上面見了三種訪問修飾符,若是學過C++那麼還知道一種沒有出現就是protected,本包中的子類可訪問,不一樣包中的子類能夠訪問,不是子類不能訪問。
因此須要注意: 在子類中使用父類的對象或者使用其類對象訪問父類的protected成員是不行的!
這裏對包作一個解釋:包相似於電腦中的文件夾,文件多了須要存於不一樣文件夾中方便管理,一樣如此,類多了就須要放在不一樣的包裏面方便管理。
關於被這四種修飾符修飾的屬性會方法的可訪問性作一個小結:
範圍 | private | default(什麼都不寫) | protected | public |
---|---|---|---|---|
同一個類 | O | O | O | O |
同一個包中的子類 | X | O | O | O |
同一個包中的其餘類 | X | O | X | O |
不一樣包中的子類 | X | X | O | O |
不一樣包中的非子類 | X | X | X | O |
構造方法的調用時機:
前面一直在說構造方法的調用是在類建立時,與普通方法不一樣,構造方法在實例化新對象(使用new開闢空間後)調用一次。普通方法是在對象被實例化後能夠調用屢次。構造方法也能夠重載(重載的概念在後面介紹)。
咱們能夠跟蹤一下是如何調用類的構造方法的。
如下面這個程序進行跟蹤:
class Person{ private long pid=123456789; public Person(){ System.out.println("Person()"); } public Person(long pid){ System.out.println("Person(long pid)"); System.out.println("在使用傳進來的pid賦值前:pid:"+this.pid); this.pid = pid; System.out.println("在使用傳進來的pid賦值後:pid:"+this.pid); } } public class Student extends Person{ //extends 實現繼承關係 private String name; private int age=0; public Student(){ System.out.println("Student()"); } public Student(long pid, String name, int age){ super(pid); //調用父類的構造函數必定要寫在最前面否則會報錯 System.out.println("Student(long pid, String name, int age)"); this.name = name; this.age = age; } public getName(){ return name; } public static void main(String[] args){ Student stu1 = new Student(); Student stu2 = new Student(123456,"Sakura",20); } } /* output: Person() Student() Person(long pid) 在使用傳進來的pid賦值前:pid:123456789 在使用傳進來的pid賦值後:pid:123456 Student(long pid, String name, int age) */在此我向你們推薦一個架構學習交流裙。交流學習裙號:821169538,裏面會分享一些資深架構師錄製的視頻錄像
能夠輸出結果看出Java中的初始化順序以下:
什麼是匿名對象以及匿名對象的基本使用
什麼是匿名對象?
咱們來看一步就建立對象的語法:
①類名稱 ②對象名稱 = ③new ④類名稱()
①:規定了對象的類型
②:對象的名字,惟一標識對象
③:開闢新的堆內存空間,存儲對象的內容,如果沒有new,則沒有內存空間,對象也就沒法實例化
④:調用構造方法初始化對象
④:在此我向你們推薦一個架構學習交流裙。交流學習裙號:821169538,裏面會分享一些資深架構師錄製的視頻錄像
上面的這條語句在內存中開闢了兩個空間,一個棧空間存儲引用變量對象名稱,一個使用new開闢的堆空間用於存儲對象內容。
對象名稱指向了在對堆中的對象,因而咱們可使用對象名稱去操做對象。
如果咱們只有"new 類名稱();"這部分的話,那就是隻是在堆中開闢了一個空間來保存對象信息,沒有棧去指向它。也就是這個空間是沒有名字的。
因此, 沒有棧指向的對象就叫作匿名對象 。
匿名對象的使用:
new Student(123456,"Sakura",20).getName();
由此就建立了一個匿名對象,能夠向操做有名對象同樣操做它。
因爲沒有引用變量指向匿名對象,因此只能使用一次,而後就會成爲垃圾對象等待被GC回收,
小結
本篇博文主要總結了Java中構造方法的定義和做用(爲了在類對象實例化時設置屬性初始化)由此涉及到到類訪問權限,而後對類訪問權限作了一個小結,以及Java程序初始化的順序。最後介紹了匿名對象,即沒有棧指向的對象。