Java-怎樣構造方法和匿名對象

前言編程

在編寫程序時不安全的初始化會致使程序發生發生重大錯誤。爲了使程序能夠被安全地初始化,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中的初始化順序以下:

  • 在任何其餘事情發生以前,會將分配給對象的存儲空間初始化成二進制零。
  • 調用基類的構造函數。
  • 按照聲明順序調用屬性的初始化方法。在Person中先將pid賦值爲1234556789而後在返回到構造函數中將123456賦值給pid。
  • 調用導出類的構造函數。如果Student中屬性有給定初始值,那麼依舊如第三步後再進入構造函數進行其餘初始化操做。

什麼是匿名對象以及匿名對象的基本使用

什麼是匿名對象?

咱們來看一步就建立對象的語法:

①類名稱 ②對象名稱 = ③new ④類名稱()

①:規定了對象的類型

②:對象的名字,惟一標識對象

③:開闢新的堆內存空間,存儲對象的內容,如果沒有new,則沒有內存空間,對象也就沒法實例化

④:調用構造方法初始化對象

④:在此我向你們推薦一個架構學習交流裙。交流學習裙號:821169538,裏面會分享一些資深架構師錄製的視頻錄像 

上面的這條語句在內存中開闢了兩個空間,一個棧空間存儲引用變量對象名稱,一個使用new開闢的堆空間用於存儲對象內容。

對象名稱指向了在對堆中的對象,因而咱們可使用對象名稱去操做對象。

如果咱們只有"new 類名稱();"這部分的話,那就是隻是在堆中開闢了一個空間來保存對象信息,沒有棧去指向它。也就是這個空間是沒有名字的。

因此, 沒有棧指向的對象就叫作匿名對象 。

匿名對象的使用:

new Student(123456,"Sakura",20).getName();

由此就建立了一個匿名對象,能夠向操做有名對象同樣操做它。

因爲沒有引用變量指向匿名對象,因此只能使用一次,而後就會成爲垃圾對象等待被GC回收,

小結

本篇博文主要總結了Java中構造方法的定義和做用(爲了在類對象實例化時設置屬性初始化)由此涉及到到類訪問權限,而後對類訪問權限作了一個小結,以及Java程序初始化的順序。最後介紹了匿名對象,即沒有棧指向的對象。

相關文章
相關標籤/搜索